Mega Code Archive

 
Categories / Java / 3D Graphics
 

Red Green Girl

//Copyright 2001 Resplendent Technology Ltd. greg@resplendent.com import java.applet.Applet; import java.awt.FlowLayout; import java.awt.GraphicsConfiguration; import java.net.URL; import java.util.Enumeration; import java.util.Hashtable; import javax.media.j3d.AmbientLight; import javax.media.j3d.Appearance; import javax.media.j3d.BoundingSphere; import javax.media.j3d.BranchGroup; import javax.media.j3d.Canvas3D; import javax.media.j3d.DirectionalLight; import javax.media.j3d.Material; import javax.media.j3d.RenderingAttributes; import javax.media.j3d.Shape3D; import javax.media.j3d.Transform3D; import javax.media.j3d.TransformGroup; import javax.media.j3d.TransparencyAttributes; import javax.vecmath.Color3f; import javax.vecmath.Point3d; import javax.vecmath.Vector3f; import com.sun.j3d.loaders.Scene; import com.sun.j3d.loaders.objectfile.ObjectFile; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.behaviors.keyboard.KeyNavigatorBehavior; import com.sun.j3d.utils.behaviors.mouse.MouseRotate; import com.sun.j3d.utils.behaviors.mouse.MouseTranslate; import com.sun.j3d.utils.universe.SimpleUniverse; public class RedGreenGirl extends Applet {          protected Canvas3D c1 = new Canvas3D(SimpleUniverse.getPreferredConfiguration());    // private Canvas3D c2 = new Canvas3D(SimpleUniverse.getPreferredConfiguration());     private static MainFrame mf;     protected SimpleUniverse u = null;     protected BranchGroup scene = null;     protected String URLString = "http://www.java3d.org/renee.obj";     protected float eyeOffset =0.03F;     protected static int size=600;     public void init() {         setLayout(new FlowLayout());         GraphicsConfiguration config =            SimpleUniverse.getPreferredConfiguration();         String v = getParameter("url");            if (v != null) { URLString = v; }         c1.setSize(size, size);         add(c1);         scene = createSceneGraph(0);         u = new SimpleUniverse(c1);         // This will move the ViewPlatform back a bit so the         // objects in the scene can be viewed.         //u.getViewingPlatform().setNominalViewingTransform();         u.addBranchGraph(scene);     }     public BranchGroup createSceneGraph(int i) {         System.out.println("Creating scene for: "+URLString);         // Create the root of the branch graph         BranchGroup objRoot = new BranchGroup();         try{           Transform3D myTransform3D = new Transform3D();           myTransform3D.setTranslation(new Vector3f(+0.0f,-0.15f,-3.6f));           TransformGroup objTrans = new TransformGroup(myTransform3D);             objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);             Transform3D t = new Transform3D();           TransformGroup tg = new TransformGroup(t);           tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);           tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);           objTrans.addChild(tg);             URL url = new URL(URLString) ;             ObjectFile f = new ObjectFile();             f.setFlags(ObjectFile.RESIZE | ObjectFile.TRIANGULATE | ObjectFile.STRIPIFY);             System.out.println( "About to load" );                          Scene s = f.load(url);             Transform3D myTrans = new Transform3D();             myTrans.setTranslation(new Vector3f(eyeOffset, -eyeOffset, 0F));             TransformGroup mytg = new TransformGroup(myTrans);             //mytg.addChild(s.getSceneGroup());             tg.addChild(mytg);             Transform3D myTrans2 = new Transform3D();             myTrans2.setTranslation(new Vector3f(-eyeOffset, +eyeOffset, 0F));             TransformGroup mytg2 = new TransformGroup(myTrans2);             //mytg2.addChild(s.getSceneGroup());             Hashtable table = s.getNamedObjects();              for (Enumeration e = table.keys() ; e.hasMoreElements() ;) {             Object key = e.nextElement();             System.out.println(key);             Object obj = table.get(key);             System.out.println(obj.getClass().getName());             Shape3D shape  = (Shape3D)obj;             //shape.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);             Appearance ap = new Appearance();             Color3f black = new Color3f(0.0f, 0.0f, 0.0f);             Color3f red = new Color3f(0.7f, .0f, .15f);             Color3f green = new Color3f(0f, .7f, .15f);             ap.setMaterial(new Material(green,black, green, black, 1.0f));             Appearance ap2 = new Appearance();             ap2.setMaterial(new Material(red, black, red, black, 1.0f));             float transparencyValue = 0.5f;             TransparencyAttributes t_attr =                 new TransparencyAttributes(                 TransparencyAttributes.BLENDED,                 transparencyValue,                 TransparencyAttributes.BLEND_SRC_ALPHA,                 TransparencyAttributes.BLEND_ONE);             ap2.setTransparencyAttributes( t_attr );             ap2.setRenderingAttributes( new RenderingAttributes() );             ap.setTransparencyAttributes( t_attr );             ap.setRenderingAttributes( new RenderingAttributes() );             // bg.addChild(ap);             shape.setAppearance(ap);             mytg2.addChild(new Shape3D(shape.getGeometry(),ap2));             mytg.addChild(new Shape3D(shape.getGeometry(),ap));         }         tg.addChild(mytg2);         System.out.println( "Finished Loading" );         BoundingSphere bounds =           new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);         Color3f light1Color = new Color3f(.9f, 0.9f, 0.9f);         Vector3f light1Direction  = new Vector3f(4.0f, -7.0f, -12.0f);         DirectionalLight light1         = new DirectionalLight(light1Color, light1Direction);         light1.setInfluencingBounds(bounds);         objTrans.addChild(light1);               // Set up the ambient light         Color3f ambientColor = new Color3f(1.0f, .4f, 0.3f);         AmbientLight ambientLightNode = new AmbientLight(ambientColor);         ambientLightNode.setInfluencingBounds(bounds);         objTrans.addChild(ambientLightNode);                           MouseRotate behavior = new MouseRotate();       behavior.setTransformGroup(tg);       objTrans.addChild(behavior);         // Create the translate behavior node       MouseTranslate behavior3 = new MouseTranslate();       behavior3.setTransformGroup(tg);       objTrans.addChild(behavior3);       behavior3.setSchedulingBounds(bounds);              KeyNavigatorBehavior keyNavBeh = new KeyNavigatorBehavior(tg);     keyNavBeh.setSchedulingBounds(new BoundingSphere(       new Point3d(),1000.0));     objTrans.addChild(keyNavBeh);            behavior.setSchedulingBounds(bounds);         objRoot.addChild(objTrans);         } catch(Throwable t){System.out.println("Error: "+t);}         return objRoot;     }          public RedGreenGirl() {     }     public void destroy() {         u.removeAllLocales();     }       public static void main(String[] args) {                 RedGreenGirl s = new RedGreenGirl();         if (args.length > 0) {             s.URLString = args[0];         }         mf = new MainFrame(s, size, size);     } }