home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.5 Applications 2004 May / SGI IRIX 6.5 Applications 2004 May.iso / dist / java3d.idb / usr / demos / java / j3d / programs / examples / TickTockCollision / TickTockCollision.java.z / TickTockCollision.java
Encoding:
Java Source  |  2003-08-08  |  7.1 KB  |  213 lines

  1. /*
  2.  *    @(#)TickTockCollision.java 1.16 02/10/21 13:58:00
  3.  *
  4.  * Copyright (c) 1996-2002 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  *
  10.  * - Redistributions of source code must retain the above copyright
  11.  *   notice, this list of conditions and the following disclaimer.
  12.  *
  13.  * - Redistribution in binary form must reproduce the above copyright
  14.  *   notice, this list of conditions and the following disclaimer in
  15.  *   the documentation and/or other materials provided with the
  16.  *   distribution.
  17.  *
  18.  * Neither the name of Sun Microsystems, Inc. or the names of
  19.  * contributors may be used to endorse or promote products derived
  20.  * from this software without specific prior written permission.
  21.  *
  22.  * This software is provided "AS IS," without a warranty of any
  23.  * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
  24.  * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
  25.  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
  26.  * EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
  27.  * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  28.  * DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN
  29.  * OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
  30.  * FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
  31.  * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
  32.  * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE,
  33.  * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  34.  *
  35.  * You acknowledge that Software is not designed,licensed or intended
  36.  * for use in the design, construction, operation or maintenance of
  37.  * any nuclear facility.
  38.  */
  39.  
  40. import java.applet.Applet;
  41. import java.awt.*;
  42. import java.awt.event.*;
  43. import com.sun.j3d.utils.applet.MainFrame;
  44. import com.sun.j3d.utils.geometry.ColorCube;
  45. import com.sun.j3d.utils.universe.*;
  46. import javax.media.j3d.*;
  47. import javax.vecmath.*;
  48.  
  49. public class TickTockCollision extends Applet {
  50.  
  51.     private SimpleUniverse u = null;
  52.     
  53.     public BranchGroup createSceneGraph() {
  54.     // Create the root of the branch graph
  55.     BranchGroup objRoot = new BranchGroup();
  56.  
  57.         // Create a Transformgroup to scale all objects so they
  58.         // appear in the scene.
  59.         TransformGroup objScale = new TransformGroup();
  60.         Transform3D t3d = new Transform3D();
  61.         t3d.setScale(0.4);
  62.         objScale.setTransform(t3d);
  63.         objRoot.addChild(objScale);
  64.  
  65.     // Create a bounds for the background and behaviors
  66.     BoundingSphere bounds =
  67.         new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
  68.  
  69.     // Set up the background
  70.     Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
  71.     Background bg = new Background(bgColor);
  72.     bg.setApplicationBounds(bounds);
  73.     objScale.addChild(bg);
  74.  
  75.     // Create a pair of transform group nodes and initialize them to
  76.     // identity.  Enable the TRANSFORM_WRITE capability so that
  77.     // our behaviors can modify them at runtime.  Add them to the
  78.     // root of the subgraph.
  79.     TransformGroup objTrans1 = new TransformGroup();
  80.     objTrans1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  81.     objScale.addChild(objTrans1);
  82.  
  83.     TransformGroup objTrans2 = new TransformGroup();
  84.     objTrans2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  85.     objTrans1.addChild(objTrans2);
  86.  
  87.     // Create the positioning and scaling transform group node.
  88.     Transform3D t = new Transform3D();
  89.     t.set(0.3, new Vector3d(0.0, -1.5, 0.0));
  90.     TransformGroup objTrans3 = new TransformGroup(t);
  91.     objTrans2.addChild(objTrans3);
  92.  
  93.     // Create a simple shape leaf node, add it to the scene graph.
  94.     objTrans3.addChild(new ColorCube());
  95.  
  96.     // Create a new Behavior object that will perform the desired
  97.     // rotation on the specified transform object and add it into
  98.     // the scene graph.
  99.     Transform3D yAxis1 = new Transform3D();
  100.     yAxis1.rotX(Math.PI/2.0);
  101.     Alpha tickTockAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE |
  102.                     Alpha.DECREASING_ENABLE,
  103.                     0, 0,
  104.                     5000, 2500, 200,
  105.                     5000, 2500, 200);
  106.  
  107.     RotationInterpolator tickTock =
  108.         new RotationInterpolator(tickTockAlpha, objTrans1, yAxis1,
  109.                      -(float) Math.PI/2.0f,
  110.                      (float) Math.PI/2.0f);
  111.     tickTock.setSchedulingBounds(bounds);
  112.     objTrans2.addChild(tickTock);
  113.  
  114.     // Create a new Behavior object that will perform the desired
  115.     // rotation on the specified transform object and add it into
  116.     // the scene graph.
  117.     Transform3D yAxis2 = new Transform3D();
  118.     Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
  119.                     0, 0,
  120.                     4000, 0, 0,
  121.                     0, 0, 0);
  122.  
  123.     RotationInterpolator rotator =
  124.         new RotationInterpolator(rotationAlpha, objTrans2, yAxis2,
  125.                      0.0f, (float) Math.PI*2.0f);
  126.     rotator.setSchedulingBounds(bounds);
  127.     objTrans2.addChild(rotator);
  128.  
  129.     // Now create a pair of rectangular boxes, each with a collision
  130.     // detection behavior attached.  The behavior will highlight the
  131.     // object when it is in a state of collision.
  132.  
  133.     Group box1 = createBox(0.3, new Vector3d(-1.3, 0.0, 0.0));
  134.     Group box2 = createBox(0.3, new Vector3d( 1.3, 0.0, 0.0));
  135.  
  136.     objScale.addChild(box1);
  137.     objScale.addChild(box2);
  138.  
  139.         // Have Java 3D perform optimizations on this scene graph.
  140.         objRoot.compile();
  141.  
  142.     return objRoot;
  143.     }
  144.  
  145.  
  146.     private Group createBox(double scale, Vector3d pos) {
  147.     // Create a transform group node to scale and position the object.
  148.     Transform3D t = new Transform3D();
  149.     t.set(scale, pos);
  150.     TransformGroup objTrans = new TransformGroup(t);
  151.  
  152.     // Create a simple shape leaf node and add it to the scene graph
  153.     Shape3D shape = new Box(0.5, 5.0, 1.0);
  154.     objTrans.addChild(shape);
  155.  
  156.     // Create a new ColoringAttributes object for the shape's
  157.     // appearance and make it writable at runtime.
  158.     Appearance app = shape.getAppearance();
  159.     ColoringAttributes ca = new ColoringAttributes();
  160.     ca.setColor(0.6f, 0.3f, 0.0f);
  161.     app.setCapability(app.ALLOW_COLORING_ATTRIBUTES_WRITE);
  162.     app.setColoringAttributes(ca);
  163.  
  164.     // Create a new Behavior object that will perform the collision
  165.     // detection on the specified object, and add it into
  166.     // the scene graph.
  167.     CollisionDetector cd = new CollisionDetector(shape);
  168.     BoundingSphere bounds =
  169.         new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
  170.     cd.setSchedulingBounds(bounds);
  171.  
  172.     // Add the behavior to the scene graph
  173.     objTrans.addChild(cd);
  174.  
  175.     return objTrans;
  176.     }
  177.  
  178.  
  179.     public TickTockCollision() {
  180.     }
  181.  
  182.     public void init() {
  183.     setLayout(new BorderLayout());
  184.         GraphicsConfiguration config =
  185.            SimpleUniverse.getPreferredConfiguration();
  186.  
  187.         Canvas3D c = new Canvas3D(config);
  188.     add("Center", c);
  189.  
  190.     // Create a simple scene and attach it to the virtual universe
  191.     BranchGroup scene = createSceneGraph();
  192.     u = new SimpleUniverse(c);
  193.  
  194.         // This will move the ViewPlatform back a bit so the
  195.         // objects in the scene can be viewed.
  196.         u.getViewingPlatform().setNominalViewingTransform();
  197.  
  198.     u.addBranchGraph(scene);
  199.     }
  200.  
  201.     public void destroy() {
  202.     u.cleanup();
  203.     }
  204.  
  205.     //
  206.     // The following allows TickTockCollision to be run as an application
  207.     // as well as an applet
  208.     //
  209.     public static void main(String[] args) {
  210.     new MainFrame(new TickTockCollision(), 700, 700);
  211.     }
  212. }
  213.