我正在尝试使用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);
}
}
答案 0 :(得分:0)
野生刺。你定义三角形的方式意味着一个“朝向”相机,一个远离。
*1
*2 *2'
*3
遵循右手规则,1,2,3将朝向相机,1,2',3面朝外。如果启用了背面剔除,则会假设1,2',3位于相机的另一侧。如果你翻转相机的位置/矢量,你基本上得到同样的东西,这几乎肯定是这个。