Java 3d:对象的显示不正确

时间:2012-01-29 22:09:18

标签: java 3d java-3d modeling 3d-modelling

我正在尝试使用GeometryInfo创建模型。我只是制作一个扁平模型并将其附加到y轴的反射上,以实现对称。但是当运行时,以下代码仅显示我编程的模型的一半(它仅显示y轴左侧的侧面)。我做错了什么?

该程序从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);
}
}

1 个答案:

答案 0 :(得分:0)

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

  *1

*2   *2'

  *3

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