簡體   English   中英

Java 3d:錯誤顯示對象

[英]Java 3d: incorrect display of object

我正在嘗試使用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

*2   *2'

  *3

遵循右手規則,1,2,3將面向相機,而1,2',3將面向相機。 如果啟用背面剔除,則將假定1,2',3位於相機的另一側。 如果您翻轉相機的位置/向量,並且您基本上得到了相同的東西,那幾乎肯定是這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM