/* *@(#)TickTockCollision.java 1.16 02/10/21 13:58:00 * Copyright (c) 1996-2002 Sun Microsystems */ import java.applet.Applet; import java.awt.*; import java.awt.event.*; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.geometry.ColorCube; import com.sun.j3d.utils.universe.*; import javax.media.j3d.*; import javax.vecmath.*; public class TickTockCollision extends Applet { private SimpleUniverse u = null; public BranchGroup createSceneGraph() { BranchGroup objRoot = new BranchGroup(); TransformGroup objScale = new TransformGroup(); Transform3D t3d = new Transform3D(); t3d.setScale(0.4); objScale.setTransform(t3d); objRoot.addChild(objScale); BoundingSphere bounds = new BoundingSphere( new Point3d(0.0,0.0,0.0), 100.0); Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f); Background bg = new Background(bgColor); bg.setApplicationBounds(bounds); objScale.addChild(bg); TransformGroup objTrans1 = new TransformGroup(); objTrans1.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE); objScale.addChild(objTrans1); TransformGroup objTrans2 = new TransformGroup(); objTrans2.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE); objTrans1.addChild(objTrans2); Transform3D t = new Transform3D(); t.set(0.3, new Vector3d(0.0, -1.5, 0.0)); TransformGroup objTrans3 = new TransformGroup(t); objTrans2.addChild(objTrans3); objTrans3.addChild(new ColorCube()); Transform3D yAxis1 = new Transform3D(); yAxis1.rotX(Math.PI/2.0); Alpha tickTockAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE | Alpha.DECREASING_ENABLE, 0, 0, 5000, 2500, 200, 5000, 2500, 200); RotationInterpolator tickTock = new RotationInterpolator( tickTockAlpha, objTrans1, yAxis1, -(float) Math.PI/2.0f, (float) Math.PI/2.0f); tickTock.setSchedulingBounds(bounds); objTrans2.addChild(tickTock); Transform3D yAxis2 = new Transform3D(); Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0, 4000, 0, 0, 0, 0, 0); RotationInterpolator rotator = new RotationInterpolator( rotationAlpha, objTrans2, yAxis2, 0.0f, (float) Math.PI*2.0f); rotator.setSchedulingBounds(bounds); objTrans2.addChild(rotator); Group box1 = createBox(0.3, new Vector3d(-1.3, 0.0, 0.0)); Group box2 = createBox(0.3, new Vector3d( 1.3, 0.0, 0.0)); objScale.addChild(box1); objScale.addChild(box2); objRoot.compile(); return objRoot; } private Group createBox(double scale, Vector3d pos) { Transform3D t = new Transform3D(); t.set(scale, pos); TransformGroup objTrans = new TransformGroup(t); Shape3D shape = new Box(0.5, 5.0, 1.0); objTrans.addChild(shape); Appearance app = shape.getAppearance(); ColoringAttributes ca = new ColoringAttributes(); ca.setColor(0.6f, 0.3f, 0.0f); app.setCapability( app.ALLOW_COLORING_ATTRIBUTES_WRITE); app.setColoringAttributes(ca); CollisionDetector cd = new CollisionDetector(shape); BoundingSphere bounds = new BoundingSphere( new Point3d(0.0,0.0,0.0), 100.0); cd.setSchedulingBounds(bounds); objTrans.addChild(cd); return objTrans; } public TickTockCollision() { } public void init() { setLayout(new BorderLayout()); GraphicsConfiguration config = SimpleUniverse. getPreferredConfiguration(); Canvas3D c = new Canvas3D(config); add("Center", c); BranchGroup scene = createSceneGraph(); u = new SimpleUniverse(c); u.getViewingPlatform(). setNominalViewingTransform(); u.addBranchGraph(scene); } public void destroy() { u.cleanup(); } public static void main(String[] args) { new MainFrame(new TickTockCollision(), 700, 700); } }