Next: 6.12 VirtualInputDevice
Up: 6 Java3Dのプログラミング
Previous: 6.10.4 Box.java
/*
* @(#)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();
}
}
generated through LaTeX2HTML. M.Inaba 平成18年5月7日