/* Pulsating and turning graphics */ /* Carsten Schuermann */ import java.applet.Applet; import java.awt.BorderLayout; import java.awt.Frame; import java.awt.event.*; import java.awt.Font; import java.awt.GraphicsConfiguration; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.geometry.Text2D; import com.sun.j3d.utils.universe.*; import javax.media.j3d.*; import javax.vecmath.*; import java.util.Enumeration; public class Pulse1 extends Applet { public class OpenBehavior extends Behavior{ private Text3D targetTG; private WakeupCriterion yesCondition; private WakeupCriterion AWTEventCondition; OpenBehavior(Text3D targetTG){ this.targetTG = targetTG; AWTEventCondition = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED); } public void setBehaviorObjectPartner(Behavior behaviorObject){ yesCondition = new WakeupOnBehaviorPost(behaviorObject, 1); } public void initialize(){ this.wakeupOn(AWTEventCondition); } public void processStimulus(Enumeration criteria){ if (criteria.nextElement().equals(yesCondition)){ this.wakeupOn(AWTEventCondition); } else { targetTG.setString ("Yes!"); this.wakeupOn(yesCondition); postId(1); } } } // end of class OpenBehavior public class CloseBehavior extends Behavior{ private Text3D targetTG; private WakeupCriterion noCondition; private WakeupCriterion AWTEventCondition; private Transform3D t3D = new Transform3D(); CloseBehavior(Text3D targetTG){ this.targetTG = targetTG; AWTEventCondition = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED); } public void setBehaviorObjectPartner(Behavior behaviorObject){ noCondition = new WakeupOnBehaviorPost(behaviorObject, 1); } public void initialize(){ this.wakeupOn(noCondition); } public void processStimulus(Enumeration criteria){ if (criteria.nextElement().equals(noCondition)){ this.wakeupOn(AWTEventCondition); } else { targetTG.setString ("No!"); this.wakeupOn(noCondition); postId(1); } } } // end of class CloseBehavior public BranchGroup createSceneGraph() { // Create the root of the branch graph BranchGroup objRoot = new BranchGroup(); Transform3D t3D = new Transform3D(); t3D.setTranslation(new Vector3f(0.0f, 0.0f, -3.0f)); TransformGroup objMove = new TransformGroup(t3D); objMove.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); objMove.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); objRoot.addChild(objMove); // Create the transform group node and initialize it to the // identity. Add it to the root of the subgraph. TransformGroup objSpin = new TransformGroup(); objSpin.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); objSpin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); objMove.addChild(objSpin); Appearance textAppear = new Appearance(); ColoringAttributes textColor = new ColoringAttributes(); textColor.setColor(1.0f, 0.0f, 0.0f); textAppear.setColoringAttributes(textColor); textAppear.setMaterial(new Material()); // Create a simple shape leaf node, add it to the scene graph. Font3D font3D = new Font3D(new Font("Times", Font.PLAIN, 1), new FontExtrusion()); Text3D textGeom = new Text3D(font3D, new String("Maybe!")); textGeom.setAlignment(Text3D.ALIGN_CENTER); textGeom.setCapability(Text3D.ALLOW_STRING_WRITE); Shape3D textShape = new Shape3D(); textShape.setGeometry(textGeom); textShape.setAppearance(textAppear); objSpin.addChild(textShape); OpenBehavior openObject = new OpenBehavior(textGeom); CloseBehavior closeObject = new CloseBehavior(textGeom); //prepare the behavior objects openObject.setBehaviorObjectPartner(closeObject); closeObject.setBehaviorObjectPartner(openObject); objRoot.addChild(openObject); objRoot.addChild(closeObject); // Create a new Behavior object that will perform the desired // operation on the specified transform object and add it into // the scene graph. Alpha rotationAlpha = new Alpha(-1, 3000); RotationInterpolator rotator = new RotationInterpolator(rotationAlpha, objSpin); // a bounding sphere specifies a region a behavior is active // create a sphere centered at the origin with radius of 100 BoundingSphere bounds = new BoundingSphere(); rotator.setSchedulingBounds(bounds); objSpin.addChild(rotator); openObject.setSchedulingBounds(bounds); closeObject.setSchedulingBounds(bounds); DirectionalLight lightD = new DirectionalLight(); lightD.setInfluencingBounds(bounds); lightD.setDirection(new Vector3f(0.0f, 0.0f, -1.0f)); lightD.setColor(new Color3f(1.0f, 0.0f, 1.0f)); objMove.addChild(lightD); AmbientLight lightA = new AmbientLight(); lightA.setInfluencingBounds(bounds); objMove.addChild(lightA); return objRoot; } // end of CreateSceneGraph method public Pulse1() { setLayout(new BorderLayout()); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas3D = new Canvas3D(config); canvas3D.setStereoEnable(false); add("Center", canvas3D); BranchGroup scene = createSceneGraph(); // SimpleUniverse is a Convenience Utility class SimpleUniverse simpleU = new SimpleUniverse(canvas3D); // This will move the ViewPlatform back a bit so the // objects in the scene can be viewed. simpleU.getViewingPlatform().setNominalViewingTransform(); simpleU.addBranchGraph(scene); } // end of Pulse (constructor) // The following allows this to be run as an application // as well as an applet public static void main(String[] args) { Frame frame = new MainFrame(new Pulse1(), 300, 300); } // end of main (method of Pulse) } // end of class Pulse