Mega Code Archive

 
Categories / Java / 3D Graphics
 

Basic Construct

// JFrame import javax.swing.JFrame; // BorderLayout stuff import java.awt.*; import javax.swing.*; // Canvas3D import javax.media.j3d.Canvas3D; // The Universe import com.sun.j3d.utils.universe.SimpleUniverse; // The BranchGroup import javax.media.j3d.BranchGroup; // For the Box import com.sun.j3d.utils.geometry.Box; import javax.vecmath.*; // The directional light import javax.media.j3d.DirectionalLight; // For the bouding sphere of the light source import javax.media.j3d.BoundingSphere; import javax.media.j3d.Appearance; import javax.media.j3d.Material; // Transformgroup import javax.media.j3d.TransformGroup; import com.sun.j3d.utils.behaviors.mouse.*; public class BasicConstruct extends JFrame {   /**    * The SimpleUniverse object    */   protected SimpleUniverse simpleU;   /**    * The root BranchGroup Object.    */   protected BranchGroup rootBranchGroup;   /**    * Constructor that consturcts the window with the given name.    *     * @param name    *            The name of the window, in String format    */   public BasicConstruct(String name) {     // The next line will construct the window and name it     // with the given name     super(name);     // Perform the initial setup, just once     initial_setup();   }   /**    * Perform the essential setups for the Java3D    */   protected void initial_setup() {     // A JFrame is a Container -- something that can hold     // other things, e.g a button, a textfield, etc..     // however, for a container to hold something, you need     // to specify the layout of the storage. For our     // example, we would like to use a BorderLayout.     // The next line does just this:     getContentPane().setLayout(new BorderLayout());     // The next step is to setup graphics configuration     // for Java3D. Since different machines/OS have differnt     // configuration for displaying stuff, therefore, for     // java3D to work, it is important to obtain the correct     // graphics configuration first.     GraphicsConfiguration config = SimpleUniverse         .getPreferredConfiguration();     // Since we are doing stuff via java3D -- meaning we     // cannot write pixels directly to the screen, we need     // to construct a "canvas" for java3D to "paint". And     // this "canvas" will be constructed with the graphics     // information we just obtained.     Canvas3D canvas3D = new Canvas3D(config);     // And we need to add the "canvas to the centre of our     // window..     getContentPane().add("Center", canvas3D);     // Creates the universe     simpleU = new SimpleUniverse(canvas3D);     // First create the BranchGroup object     rootBranchGroup = new BranchGroup();   }   /**    * Adds a light source to the universe    *     * @param direction    *            The inverse direction of the light    * @param color    *            The color of the light    */   public void addDirectionalLight(Vector3f direction, Color3f color) {     // Creates a bounding sphere for the lights     BoundingSphere bounds = new BoundingSphere();     bounds.setRadius(1000d);     // Then create a directional light with the given     // direction and color     DirectionalLight lightD = new DirectionalLight(color, direction);     lightD.setInfluencingBounds(bounds);     // Then add it to the root BranchGroup     rootBranchGroup.addChild(lightD);   }   /**    * Adds a box to the universe    *     * @param x    *            The x dimension of the box    * @param y    *            The y dimension of the box    * @param z    *            The z dimension of the box    */   public void addBox(float x, float y, float z, Color3f diffuse, Color3f spec) {     // Add a box with the given dimension     // First setup an appearance for the box     Appearance app = new Appearance();     Material mat = new Material();     mat.setDiffuseColor(diffuse);     mat.setSpecularColor(spec);     mat.setShininess(5.0f);     app.setMaterial(mat);     Box box = new Box(x, y, z, app);     // Create a TransformGroup and make it the parent of the box     TransformGroup tg = new TransformGroup();     tg.addChild(box);     // Then add it to the rootBranchGroup     rootBranchGroup.addChild(tg);     tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);     tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);     MouseRotate myMouseRotate = new MouseRotate();     myMouseRotate.setTransformGroup(tg);     myMouseRotate.setSchedulingBounds(new BoundingSphere());     rootBranchGroup.addChild(myMouseRotate);     MouseTranslate myMouseTranslate = new MouseTranslate();     myMouseTranslate.setTransformGroup(tg);     myMouseTranslate.setSchedulingBounds(new BoundingSphere());     rootBranchGroup.addChild(myMouseTranslate);     MouseZoom myMouseZoom = new MouseZoom();     myMouseZoom.setTransformGroup(tg);     myMouseZoom.setSchedulingBounds(new BoundingSphere());     rootBranchGroup.addChild(myMouseZoom);   }   /**    * Finalise everything to get ready    */   public void finalise() {     // Then add the branch group into the Universe     simpleU.addBranchGraph(rootBranchGroup);     // And set up the camera position     simpleU.getViewingPlatform().setNominalViewingTransform();   }   public static void main(String[] argv) {     BasicConstruct bc = new BasicConstruct("Foo");     bc.setSize(250, 250);     bc.addBox(0.4f, 0.5f, 0.6f, new Color3f(1, 0, 0), new Color3f(1, 0, 0));     bc.addDirectionalLight(new Vector3f(0f, 0f, -1),         new Color3f(1f, 1f, 0f));     bc.finalise();     bc.show();     return;   } }