2012-01-29 82 views
0

我正在尝试使用GeometryInfo创建模型。我只是制作一个平面模型,并将其附加到其在y轴上的反射,以获得对称性。但运行时,下面的代码只显示了我编程模型的一半(它只显示y轴左侧)。我究竟做错了什么?Java 3d:对象的显示不正确

程序从Stage类运行。我将不胜感激任何建议。

public class Head extends BranchGroup 
{ 
    public Head() 
{ 
    Shape3D shape = getShape(); 
    setAppearance(shape, 1.0f, 0.0f, 0.0f); 
    this.addChild(shape); 
} 

private Shape3D getShape() 
{ 
    float[] data = shapeCoord(); 
    int[] stripCount = {3,3,3,3,3,3,3,3,3,3,3,3}; 
    GeometryInfo gi = new GeometryInfo(GeometryInfo.POLYGON_ARRAY); 
    gi.setCoordinates(data); 
    gi.setStripCounts(stripCount); 

    Triangulator tr = new Triangulator(); 
    tr.triangulate(gi); 
     gi.recomputeIndices(); 

    NormalGenerator ng = new NormalGenerator(); 
    ng.generateNormals(gi); 
     gi.recomputeIndices(); 

    Stripifier st = new Stripifier(); 
    st.stripify(gi); 
     gi.recomputeIndices(); 

    Shape3D part = new Shape3D(); 
    part.setGeometry(gi.getGeometryArray()); 

    return part; 
} 

    public static void setAppearance(Shape3D shape, float x, float y, float z) 
    { 
     ColoringAttributes ca = new ColoringAttributes(); 
     ca.setColor(x, y, z); 
     Appearance appear = new Appearance(); 
     Material material = new Material(); 
     material.setDiffuseColor(x, y, z); 
     appear.setMaterial(material); 
     appear.setColoringAttributes(ca); 
     shape.setAppearance(appear); 
    } 



private float[] shapeCoord() 
{ 
    float[] data = new float[36*3]; 
    int i=0; 

    data[i++] = 0.0f; data[i++] = 0.0f; data[i++] = 0.0f; 
    data[i++] = 0.0f; data[i++] = 0.2f; data[i++] = 0.0f; 
    data[i++] = 0.09f; data[i++] = 0.18f; data[i++] = 0.0f; 

    data[i++] = 0.0f; data[i++] = 0.0f; data[i++] = 0.0f; 
    data[i++] = 0.09f; data[i++] = 0.18f; data[i++] = 0.0f; 
    data[i++] = 0.14f; data[i++] = 0.1f; data[i++] = 0.0f; 

    data[i++] = 0.0f; data[i++] = 0.0f; data[i++] = 0.0f; 
    data[i++] = 0.14f; data[i++] = 0.1f; data[i++] = 0.0f; 
    data[i++] = 0.16f; data[i++] = 0.0f; data[i++] = 0.0f; 

    data[i++] = 0.0f; data[i++] = 0.0f; data[i++] = 0.0f; 
    data[i++] = 0.16f; data[i++] = 0.0f; data[i++] = 0.0f; 
    data[i++] = 0.15f; data[i++] = -0.09f; data[i++] = 0.0f; 

    data[i++] = 0.0f; data[i++] = 0.0f; data[i++] = 0.0f; 
    data[i++] = 0.15f; data[i++] = -0.09f; data[i++] = 0.0f; 
    data[i++] = 0.06f; data[i++] = -0.2f; data[i++] = 0.0f; 

    data[i++] = 0.0f; data[i++] = 0.0f; data[i++] = 0.0f; 
    data[i++] = 0.06f; data[i++] = -0.2f; data[i++] = 0.0f; 
    data[i++] = 0.0f; data[i++] = -0.2f; data[i++] = 0.0f; 

    ////////////////////////////////////////////////////////// 

    data[i++] = 0.0f; data[i++] = 0.0f; data[i++] = 0.0f; 
    data[i++] = 0.0f; data[i++] = 0.2f; data[i++] = 0.0f; 
    data[i++] = -0.09f; data[i++] = 0.18f; data[i++] = 0.0f; 

    data[i++] = 0.0f; data[i++] = 0.0f; data[i++] = 0.0f; 
    data[i++] = -0.09f; data[i++] = 0.18f; data[i++] = 0.0f; 
    data[i++] = -0.14f; data[i++] = 0.1f; data[i++] = 0.0f; 

    data[i++] = 0.0f; data[i++] = 0.0f; data[i++] = 0.0f; 
    data[i++] = -0.14f; data[i++] = 0.1f; data[i++] = 0.0f; 
    data[i++] = -0.16f; data[i++] = 0.0f; data[i++] = 0.0f; 

    data[i++] = 0.0f; data[i++] = 0.0f; data[i++] = 0.0f; 
    data[i++] = -0.16f; data[i++] = 0.0f; data[i++] = 0.0f; 
    data[i++] = -0.15f; data[i++] = -0.09f; data[i++] = 0.0f; 

    data[i++] = 0.0f; data[i++] = 0.0f; data[i++] = 0.0f; 
    data[i++] = -0.15f; data[i++] = -0.09f; data[i++] = 0.0f; 
    data[i++] = -0.06f; data[i++] = -0.2f; data[i++] = 0.0f; 

    data[i++] = 0.0f; data[i++] = 0.0f; data[i++] = 0.0f; 
    data[i++] = -0.06f; data[i++] = -0.2f; data[i++] = 0.0f; 
    data[i++] = 0.0f; data[i++] = -0.2f; data[i++] = 0.0f; 


    return data; 
} 
} 

public class Stage extends Applet 
{ 
private BranchGroup scene; 

public Stage(BranchGroup scene) 
{ 
    setLayout(new BorderLayout()); 
    GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); 
    Canvas3D canvas3D = new Canvas3D(config); 
    add("Center", canvas3D); 

    this.scene = scene; 
    scene.compile();  

    SimpleUniverse simpleU = new SimpleUniverse(canvas3D); 

    simpleU.getViewingPlatform().setNominalViewingTransform(); 
    simpleU.addBranchGraph(scene); 
} 

    public static void main(String[] args) 
{ 
    Frame frame = new MainFrame(new Stage(new RotationTest()), 500, 500); 
} 
} 

public class RotationTest extends BranchGroup 
{ 

    public static final int X = 0; 
public static final int Y = 1; 
public static final int Z = 2; 
public static final int CLOCKWISE = -1; 
public static final int COUNTER_CLOCKWISE = 1; 
private static long speed = 4000; 

public RotationTest() 
{ 
    TransformGroup rotate = new TransformGroup(); 
    setRotation(rotate, Tools.Y, -Tools.CLOCKWISE, 360d, 4000, -1); 
    } 

    private static void setRotation(TransformGroup objSpin, int line, int direction, double angle, long rate, int repeat) 
{ 
    speed = rate; 
    if((direction != CLOCKWISE) && (direction != COUNTER_CLOCKWISE)) 
    { 
    direction = -1; 
    } 
    objSpin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); 
    Transform3D axis = new Transform3D(); // rotates around positive y-axis by default 
     if(line == X) 
    { 
    axis.rotZ(Math.toRadians(direction * 90)); // rotates around positive x-axis 
    } 
    else if(line == Z) 
    { 
    axis.rotX(Math.toRadians(direction * 90)); // rotates about the positive z-axis 
    } 
    else 
    { 
     axis.rotY(Math.toRadians(direction * 90)); // rotates about the positive y-axis 
    } 
    Alpha rotationAlpha = new Alpha(repeat, speed); 
    //rotationAlpha.setPhaseDelayDuration(6000); 
    RotationInterpolator rotator = new RotationInterpolator(rotationAlpha, objSpin, axis, 0.0f, (float) Math.toRadians(angle)); 
    BoundingSphere bounds = new BoundingSphere(); 
    rotator.setSchedulingBounds(bounds); 
    objSpin.addChild(rotator); 
} 

    public static void setLighting(BranchGroup objRoot, float x, float y, float z) 
{ 
    Color3f color = new Color3f(x, y, z); 
    Vector3f direction = new Vector3f(0.0f, 0.0f, -1.0f); 
    DirectionalLight light = new DirectionalLight(color, direction); 
    //AmbientLight light = new AmbientLight(color); 
    light.setInfluencingBounds(new BoundingSphere()); 
    objRoot.addChild(light); 
} 
} 

回答

0

野生刺。你定义你的三角形的方式意味着一个“朝向”相机,一个走开。

*1 

*2 *2' 

    *3 

按照右手规则,1,2,3将朝向相机,1,2',3朝向相反方向。如果启用背面剔除,则会假定1,2',3位于相机的另一侧。如果你翻转相机的位置/矢量,你基本上得到同样的东西,这几乎肯定是这样的。