Java 3d: некорректное отображение объекта
Я пытаюсь создать модель, используя GeometryInfo. Я просто делаю плоскую модель и прикрепляю ее к ее отражению по оси Y для симметрии. Но при запуске следующий код показывает только половину запрограммированной мной модели (он показывает только сторону слева от оси Y). Что я делаю неправильно?
Программа запускается из класса Stage. I would appreciate any suggestions.
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 ответ
Дикий удар. То, как вы определяете свои треугольники, означает одно "лицо" в направлении камеры и одно в стороне.
*1
*2 *2'
*3
Следуя правилу правой руки, 1,2,3 должны быть направлены к камере, 1,2',3 стороны. Если выбрано заднее лицо, предполагается, что 1,2 ', 3 находится на противоположной стороне камеры. Если вы переворачиваете положение камеры / вектор, и вы в основном получаете то же самое, это почти наверняка так.