/* * @(#)Morphing.java 1.24 02/10/21 13:45:46 * Copyright (c) 1996-2002 Sun Microsystems, Inc. * All Rights Reserved. */ import java.applet.Applet; import java.awt.*; import java.awt.event.*; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.universe.*; import javax.media.j3d.*; import javax.vecmath.*; import java.io.*; import com.sun.j3d.loaders.objectfile.ObjectFile; import com.sun.j3d.loaders.Scene; import com.sun.j3d.loaders.ParsingErrorException; import com.sun.j3d.loaders.IncorrectFormatException; public class Morphing extends Applet { private java.net.URL[] objFiles = null; private SimpleUniverse u = null; private BranchGroup createSceneGraph() { BranchGroup objRoot = new BranchGroup(); TransformGroup objScale = new TransformGroup(); Transform3D t3d = new Transform3D(); t3d.setScale(0.4); objScale.setTransform(t3d); objRoot.addChild(objScale); BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0); Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f); Background bg = new Background(bgColor); bg.setApplicationBounds(bounds); objScale.addChild(bg); Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f); Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f); Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f); AmbientLight aLgt = new AmbientLight(alColor); aLgt.setInfluencingBounds(bounds); DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1); lgt1.setInfluencingBounds(bounds); objScale.addChild(aLgt); objScale.addChild(lgt1); TransformGroup objTrans[] = new TransformGroup[4]; for(int i=0; i<4; i++) { objTrans[i] = new TransformGroup(); objScale.addChild(objTrans[i]); } Transform3D tr = new Transform3D(); Transform3D rotX90 = new Transform3D(); rotX90.rotX(90.0 * Math.PI / 180.0); objTrans[0].getTransform(tr); tr.setTranslation(new Vector3d(-2.0, 1.5, -2.0)); tr.mul(rotX90); objTrans[0].setTransform(tr); objTrans[1].getTransform(tr); tr.setTranslation(new Vector3d(0.0, 1.5, -2.0)); tr.mul(rotX90); objTrans[1].setTransform(tr); objTrans[2].getTransform(tr); tr.setTranslation(new Vector3d(2.0, 1.5, -2.0)); tr.mul(rotX90); objTrans[2].setTransform(tr); objTrans[3].getTransform(tr); tr.setTranslation(new Vector3d(0.0, -2.0, -2.0)); tr.mul(rotX90); objTrans[3].setTransform(tr); Scene s[] = new Scene[3]; GeometryArray g[] = new GeometryArray[3]; Shape3D shape[] = new Shape3D[3]; ObjectFile loader = new ObjectFile(ObjectFile.RESIZE); for(int i=0; i<3; i++) { s[i] = null; g[i] = null; shape[i] = null; } for(int i=0; i<3;i++) { try { s[i] = loader.load(objFiles[i]); } catch (FileNotFoundException e) { System.err.println(e); System.exit(1); } catch (ParsingErrorException e) { System.err.println(e); System.exit(1); } catch (IncorrectFormatException e) { System.err.println(e); System.exit(1); } BranchGroup b = s[i].getSceneGroup(); shape[i] = (Shape3D) b.getChild(0); g[i] = (GeometryArray) shape[i].getGeometry(); shape[i].setGeometry(g[i]); objTrans[i].addChild(b); } Appearance app = new Appearance(); Color3f objColor = new Color3f(1.0f, 0.7f, 0.8f); Color3f black = new Color3f(0.0f, 0.0f, 0.0f); app.setMaterial(new Material(objColor, black, objColor, black, 80.0f)); Morph morph = new Morph(g, app); morph.setCapability(Morph.ALLOW_WEIGHTS_READ); morph.setCapability(Morph.ALLOW_WEIGHTS_WRITE); objTrans[3].addChild(morph); Alpha morphAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE | Alpha.DECREASING_ENABLE, 0, 0, 2000, 1000, 200, 2000, 1000, 200); MorphingBehavior mBeh = new MorphingBehavior(morphAlpha, morph); mBeh.setSchedulingBounds(bounds); objScale.addChild(mBeh); return objRoot; } public Morphing() {} public Morphing(java.net.URL[] urls) { objFiles = urls; } public void init() { if (objFiles == null) { objFiles = new java.net.URL[3]; String path = getCodeBase().toString(); try { objFiles[0] = new java.net.URL(path + "hand1.obj"); objFiles[1] = new java.net.URL(path + "hand2.obj"); objFiles[2] = new java.net.URL(path + "hand3.obj"); } catch (java.net.MalformedURLException ex) { System.out.println(ex.getMessage()); System.exit(1); } } setLayout(new BorderLayout()); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); Canvas3D c = new Canvas3D(config); add("Center", c); BranchGroup scene = createSceneGraph(); u = new SimpleUniverse(c); u.getViewingPlatform().setNominalViewingTransform(); u.addBranchGraph(scene); } public void destroy() { u.cleanup(); } public static void main(String[] args) { java.net.URL[] urls = new java.net.URL[3]; try { urls[0] = new java.net.URL("file:./hand1.obj"); urls[1] = new java.net.URL("file:./hand2.obj"); urls[2] = new java.net.URL("file:./hand3.obj"); } catch (java.net.MalformedURLException ex) { System.out.println(ex.getMessage()); System.exit(1); } new MainFrame(new Morphing(urls), 700, 700); } }
/* *MorphingBehavior.java 1.11 02/04/01 15:03:19 * Copyright (c) 1996-2002 Sun Microsystems, Inc. * All Rights Reserved. */ import java.util.Enumeration; import javax.media.j3d.*; import javax.vecmath.*; public class MorphingBehavior extends Behavior { Alpha alpha; Morph morph; double weights[]; WakeupOnElapsedFrames w = new WakeupOnElapsedFrames(0); public void initialize() { alpha.setStartTime(System.currentTimeMillis()); wakeupOn(w); } public void processStimulus(Enumeration criteria) { double val = alpha.value(); if (val < 0.5) { double a = val * 2.0; weights[0] = 1.0 - a; weights[1] = a; weights[2] = 0.0; } else { double a = (val - 0.5) * 2.0; weights[0] = 0.0; weights[1] = 1.0f - a; weights[2] = a; } morph.setWeights(weights); wakeupOn(w); } public MorphingBehavior(Alpha a, Morph m) { alpha = a; morph = m; weights = morph.getWeights(); } }