import javax.media.j3d.*; import javax.vecmath.*; public class RevolvingUniverse extends Object { VirtualUniverse universe; Locale locale; BranchGroup viewPlatformRoot; TransformGroup viewPlatformTransform; ViewPlatform viewPlatform; View view; Canvas3D canvas; float zViewDistance; public RevolvingUniverse(Canvas3D drawingCanvas, float zViewDist) { canvas = drawingCanvas; zViewDistance = zViewDist; universe = new VirtualUniverse(); locale = new Locale(universe); viewPlatformRoot = new BranchGroup(); viewPlatformTransform = new TransformGroup(); viewPlatformTransform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); viewPlatformTransform.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); setupView(drawingCanvas); setupViewPlatform(); view.attachViewPlatform(viewPlatform); locale.addBranchGraph(viewPlatformRoot); } private void setupView(Canvas3D drawingCanvas) { view = new View(); view.addCanvas3D(drawingCanvas); view.setPhysicalBody(new PhysicalBody()); view.setPhysicalEnvironment(new PhysicalEnvironment()); } private void setupViewPlatform() // Translate the view platform back by zViewDistance metres { viewPlatform = new ViewPlatform(); setViewingDistance(zViewDistance); Alpha alphaX = new Alpha(-1,10000); Alpha alphaY = new Alpha(-1,31415); BoundingSphere lifeUniverseEverything = new BoundingSphere(); TransformGroup viewPlatformTransformRotX = new TransformGroup(); viewPlatformTransformRotX.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); viewPlatformTransformRotX.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); RotationInterpolator interpolatorRotX = new RotationInterpolator(alphaX,viewPlatformTransformRotX); interpolatorRotX.setSchedulingBounds(lifeUniverseEverything); // Since the rotation will be about the local Y axis by default // we need to rotate the axis by -PI/2 about Z to obtain an X rotation Transform3D zRotate3PIby2 = new Transform3D(new Matrix4d( 0 , 1 , 0 , 0 , -1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 )); interpolatorRotX.setTransformAxis(zRotate3PIby2); viewPlatformRoot.addChild(interpolatorRotX); TransformGroup viewPlatformTransformRotY = new TransformGroup(); viewPlatformTransformRotY.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); viewPlatformTransformRotY.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); RotationInterpolator interpolatorRotY = new RotationInterpolator(alphaY,viewPlatformTransformRotY); interpolatorRotY.setSchedulingBounds(lifeUniverseEverything); // Note that the rotation is about the local Y axis by default viewPlatformRoot.addChild(interpolatorRotY); viewPlatformTransform.addChild(viewPlatform); viewPlatformTransformRotY.addChild(viewPlatformTransform); viewPlatformTransformRotX.addChild(viewPlatformTransformRotY); viewPlatformRoot.addChild(viewPlatformTransformRotX); } public void setViewingDistance(float viewDistance) { zViewDistance = viewDistance; Transform3D transform = new Transform3D(); transform.set(new Vector3f(0.0f, 0.0f, zViewDistance)); viewPlatformTransform.setTransform(transform); } public View getView() { return view; } public TransformGroup getViewPlatformTransform() { return viewPlatformTransform; } public void addBranchGraph(BranchGroup bg) { locale.addBranchGraph(bg); } }