public class Pos extends Applet {
private static final long serialVersionUID = 1L;
float knot[] = { 0.0f, 1.0f };
Color3f color = new Color3f(0.0f, 0.0f, 1.0f);
Color3f c[] = { color, color };
private BranchGroup createSceneGraph() {
BranchGroup objRoot = new BranchGroup();
BoundingSphere bound = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 50.);
Color3f color = new Color3f(0f, 0f, 255f);
Point3f pos[] = {
new Point3f(-1f, 0.4f, 0.0f),
new Point3f(1f, 0.4f, 0.0f),
};
Point3f pos1[] = {
new Point3f(-1f, -0.4f, 0.0f),
new Point3f(1f, -0.4f, 0.0f),
};
Point3f pos2[] = {
new Point3f(-3f, 0.4f, 0.0f),
new Point3f(-1.f, 0.4f, 0.0f),
};
Point3f pos3[] = {
new Point3f(-3f, -0.4f, 0.0f),
new Point3f(-1.f, -0.4f, 0.0f),
};
Point3f pos4[] = {
new Point3f(1f, 0.4f, 0.0f),
new Point3f(3f, 0.4f, 0.0f),
};
Point3f pos5[] = {
new Point3f(1f, -0.4f, 0.0f),
new Point3f(3f, -0.4f, 0.0f),
};
draw(objRoot, bound, 0d, 0d, 170d, color, pos, 2000, 0);
draw(objRoot, bound, 0d, 0d, 170d, color, pos1, 2000, 0);
draw(objRoot, bound, 0d, 0d, 170d, color, pos2, 2000, 0);
draw(objRoot, bound, 0d, 0d, 170d, color, pos3, 2000, 0);
draw(objRoot, bound, 0d, 0d, 170d, color, pos4, 2000, 0);
draw(objRoot, bound, 0d, 0d, 170d, color, pos5, 2000, 0);
// draw(objRoot, bound1, Math.PI/3, Math.PI/3, Math.PI/3, color, 1.f, 3.f, rotate, rotate2, 2000, 0);
Color3f bgColor = new Color3f(1.0f, 1.0f, 1.0f);
Background bg = new Background(bgColor);
bg.setApplicationBounds(bound);
objRoot.addChild(bg);
return objRoot;
}
public Pos() {
setLayout(new BorderLayout());
Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
add("Center", c);
Viewer viewer = new Viewer(c);
Vector3d viewpoint = new Vector3d(0.0, 0.0, 10.0);
Transform3D t = new Transform3D();
t.set(viewpoint);
ViewingPlatform v = new ViewingPlatform();
v.getViewPlatformTransform().setTransform(t);
BranchGroup scene = createSceneGraph();
SimpleUniverse u = new SimpleUniverse(v, viewer);
u.getViewingPlatform();
u.addBranchGraph(scene);
}
/**
*
* @param objRoot
* @param bound
* @param directX 箭头方向
* @param directY
* @param directZ
* @param color3f 箭头颜色
* @param pos 运动轨迹
* @param forward 正向时间
* @param reverse 逆向时间
*/
public void draw(BranchGroup objRoot, BoundingSphere bound, Double directX, Double directY, Double directZ,
Color3f color3f, Point3f pos[],
long forward, long reverse) {
Transform3D rotate = new Transform3D();
rotate.rotY(Math.toRadians(directY));
rotate.rotX(Math.toRadians(directX));
rotate.rotZ(Math.toRadians(directZ));
rotate.setScale(1.0f);
rotate.setTranslation(new Vector3f(0.0f, 0.0f, 0.0f));
//渲染外围动画路径
Transform3D tr = new Transform3D();
// tr.rotX(Math.PI/4);
// tr.rotZ(Math.PI/4);
tr.rotX((90+directX)*Math.PI/180);
tr.rotY((90+directY)*Math.PI/180);
tr.rotZ((90+directZ)*Math.PI/180);
tr.setTranslation(new Vector3f(10f, 5.f, 5.0f));
TransformGroup group = new TransformGroup(tr);
group.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
//渲染箭头
Appearance app = new Appearance();
Material material = new Material();
//颜色
material.setEmissiveColor(color3f);
app.setMaterial(material);
TransformGroup transformGroup = new TransformGroup();
transformGroup.setTransform(rotate);
TransformGroup transformGroup1 = new TransformGroup();
transformGroup1.addChild(new Cone(0.1f, 0.4f, 3, app));
Transform3D rotate2 = new Transform3D();
rotate2.setScale(1.0f);
rotate2.setTranslation(new Vector3f(0.0f, -0.2f, 0.0f));
TransformGroup transformGroup2 = new TransformGroup();
transformGroup2.setTransform(rotate2);
transformGroup2.addChild(new Cylinder(0.01f, 0.6f, 3, app));
transformGroup.addChild(transformGroup1);
transformGroup.addChild(transformGroup2);
group.addChild(transformGroup);
Alpha xtranAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE | Alpha.DECREASING_ENABLE, 100, 100, forward, 100, 200, reverse, 100, 0);
PositionPathInterpolator tran = new PositionPathInterpolator(xtranAlpha, group, tr, knot, pos);
tran.setSchedulingBounds(bound);
objRoot.addChild(group);
group.addChild(tran);
}
public static void main(String[] args) {
new MainFrame(new Pos(), 400, 400);
}
}
用锥形和圆柱体 组成的箭头。