cubeHalfLength)));
moveBox.setCollidable(true);
//Position the cube and assign it to a transformation group.
Transform3D tfBox = new Transform3D();
tfBox.rotY(Math.PI/6);
Transform3D rotationX = new Transform3D();
rotationX.rotX(-Math.PI/5);
tfBox.mul(rotationX);
TransformGroup tgBox = new TransformGroup(tfBox);
tgBox.addChild(moveBox);
//These properties are needed to allow the cube to moved around the scene.
tgBox.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
tgBox.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
tgBox.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
//Generate a golden Appearance for the cylinder.
Color3f ambientColourCylinder = new Color3f(0.0f,0.0f,0.0f);
Color3f emissiveColourCylinder = new Color3f(0.0f,0.0f,0.0f);
Color3f diffuseColourCylinder = new Color3f(0.8f,0.4f,0.0f);
Color3f specularColourCylinder = new Color3f(0.8f,0.8f,0.0f);
float shininessCylinder = 100.0f;
Appearance yellowCylinderApp = new Appearance();
yellowCylinderApp.setMaterial(new Material(ambientColourCylinder,
emissiveColourCylinder,
diffuseColourCylinder,
specularColourCylinder,
shininessCylinder));
//Generate the cylinder.
Cylinder cyli = new Cylinder(0.1f,0.3f,yellowCylinderApp);
//The CollisionBounds for the cylinder.
cyli.setCollisionBounds(new BoundingBox(new Point3d(0.0,-0.15,0.0),
new Point3d(0.1,0.15,0.1)));
cyli.setCollidable(true);
//Position the cylinder and assign it to a transformation group.
Transform3D tfCylinder = new Transform3D();
tfCylinder.mul(rotationX);
Transform3D positionCyl = new Transform3D();
positionCyl.setTranslation(new Vector3f(-0.7f,0.0f,0.0f));
tfCylinder.mul(positionCyl);
TransformGroup tgCylinder = new TransformGroup(tfCylinder);
tgCylinder.addChild(cyli);
//This transformation group is needed for the movement of the cylinder.
TransformGroup tgmCyl = new TransformGroup();
tgmCyl.addChild(tgCylinder);
//The movement from left to right.
Transform3D escape = new Transform3D();
Alpha cylAlphaR = new Alpha(1,2000);
//The starting time is first postponed until "infinity".
cylAlphaR.setStartTime(Long.MAX_VALUE);
//The interpolator for the movement.
float maxRight = 0.5f;
PositionInterpolator cylMoveR = new PositionInterpolator(cylAlphaR,tgmCyl,
escape,0.0f,maxRight);
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),Double.MAX_VALUE);
cylMoveR.setSchedulingBounds(bounds);
//The same for the movement from right to left.
Alpha cylAlphaL = new Alpha(1,2000);
cylAlphaL.setStartTime(Long.MAX_VALUE);
PositionInterpolator cylMoveL = new PositionInterpolator(cylAlphaL,tgmCyl,
escape,maxRight,0.0f);
cylMoveL.setSchedulingBounds(bounds);
//Add the movements to the transformation group.
tgmCyl.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
tgmCyl.addChild(cylMoveR);
tgmCyl.addChild(cylMoveL);
//A Switch for the green and the red sphere.
Switch colourSwitch = new Switch();
colourSwitch.setCapability(Switch.ALLOW_SWITCH_WRITE);
//An Appearance for the green sphere.
Color3f ambientColourGSphere = new Color3f(0.0f,0.8f,0.0f);
Color3f emissiveColourGSphere = new Color3f(0.0f,0.0f,0.0f);
Color3f diffuseColourGSphere = new Color3f(0.0f,0.8f,0.0f);
Color3f specularColourGSphere = new Color3f(0.0f,0.8f,0.0f);
float shininessGSphere = 1.0f;
Appearance greenSphereApp = new Appearance();
greenSphereApp.setMaterial(new Material(ambientColourGSphere,
emissiveColourGSphere,
diffuseColourGSphere,
specularColourGSphere,
shininessGSphere));
//Generate the green sphere.
float radius = 0.1f;
Sphere greenSphere = new Sphere(radius,greenSphereApp);
//The same for the red sphere.
Color3f ambientColourRSphere = new Color3f(0.6f,0.0f,0.0f);
Color3f emissiveColourRSphere = new Color3f(0.0f,0.0f,0.0f);
Color3f diffuseColourRSphere = new Color3f(0.6f,0.0f,0.0f);
Color3f specularColourRSphere = new Color3f(0.8f,0.0f,0.0f);
float shininessRSphere = 20.0f;
Appearance redSphereApp = new Appearance();
redSphereApp.setMaterial(new Material(ambientColourRSphere,emissiveColourRSphere,
diffuseColourRSphere,specularColourRSphere,shininessRSphere));
Sphere redSphere = new Sphere(radius,redSphereApp);
//Add the two spheres to the Switch.
colourSwitch.addChild(greenSphere);
colourSwitch.addChild(redSphere);
//The CollisionBounds for the two spheres.
colourSwitch.setCollisionBounds(new BoundingSphere(new Point3d(0.0,0.0,0.0),radius));
//Enable the test for collision.
colourSwitch.setCollidable(true);
//The green sphere should be visible in the beginning.
colourSwitch.setWhichChild(0);
//A transformation group for the Switch (the spheres).
Transform3D tfSphere = new Transform3D();
tfSphere.setTranslation(new Vector3f(0.7f,0.0f,0.0f));
TransformGroup tgSphere = new TransformGroup(tfSphere);
tgSphere.addChild(colourSwitch);