Java 3d: некорректное отображение объекта - PullRequest
0 голосов
/ 30 января 2012

Я пытаюсь создать модель, используя 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 голосов
/ 30 января 2012

Дикий удар.То, как вы определяете свои треугольники, означает одно «лицо» в сторону камеры и одно в сторону.

  *1

*2   *2'

  *3

Следуя правилу правой руки, 1,2,3 будет направлено в сторону камеры, 1,2 '- на 3 стороны.Если выборка задних граней включена, предполагается, что 1,2 ', 3 находится на противоположной стороне камеры.Если вы переворачиваете положение камеры / вектор, и вы в основном получаете то же самое, это почти наверняка это.

...