/* Mykeynavbeh.java * Originally based on code from BackgroundApp.java * @(#)BackgroundApp.java 1.1 00/09/22 14:03 * * portions Copyright (c) 1996-2000 Sun Microsystems, Inc. All Rights Reserved. * * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use, * modify and redistribute this software in source and binary code form, * provided that i) this copyright notice and license appear on all copies of * the software; and ii) Licensee does not utilize the software in a manner * which is disparaging to Sun. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. * * This software is not designed or intended for use in on-line control of * aircraft, air traffic, aircraft navigation or aircraft communications; or in * the design, construction, operation or maintenance of any nuclear * facility. Licensee represents and warrants that it will not use or * redistribute the Software for such purposes. */
import java.applet.*;import java.awt.*;
import javax.media.j3d.*;import javax.vecmath.*;
import com.sun.j3d.utils.applet.MainFrame;import com.sun.j3d.utils.universe.SimpleUniverse;import com.sun.j3d.utils.universe.PlatformGeometry;import com.sun.j3d.utils.behaviors.keyboard.*;
import com.sun.j3d.loaders.Scene;//import com.sun.j3d.loaders.objectfile.ObjectFile;import org.jdesktop.j3d.loaders.vrml97.VrmlLoader;
import java.awt.event.KeyListener;import java.awt.event.KeyEvent;
//import java.util.*;//import java.io.*;
import com.sun.j3d.utils.behaviors.interpolators.*;
import com.sun.j3d.utils.image.TextureLoader;
public class Mykeynavbeh extends Applet implements KeyListener {
private SimpleUniverse universe = null; private Canvas3D canvas = null; private TransformGroup viewtrans = null;
private TransformGroup tg = null; private Transform3D t3d = null; private Transform3D t3dstep = new Transform3D(); private Matrix4d matrix = new Matrix4d();
// private MovingRover rover = null;
public Mykeynavbeh() { setLayout(new BorderLayout()); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
canvas = new Canvas3D(config); add("Center", canvas); universe = new SimpleUniverse(canvas);
BranchGroup scene = createSceneGraph(); universe.getViewingPlatform().setNominalViewingTransform();
universe.getViewer().getView().setBackClipDistance(100.0);
canvas.addKeyListener(this);
universe.addBranchGraph(scene); }
private BranchGroup createSceneGraph() { BranchGroup objRoot = new BranchGroup();
BoundingSphere bounds = new BoundingSphere(new Point3d(), 10000.0);
viewtrans = universe.getViewingPlatform().getViewPlatformTransform();
KeyNavigatorBehavior keyNavBeh = new KeyNavigatorBehavior(viewtrans); keyNavBeh.setSchedulingBounds(bounds); PlatformGeometry platformGeom = new PlatformGeometry(); platformGeom.addChild(keyNavBeh); universe.getViewingPlatform().setPlatformGeometry(platformGeom);
TextureLoader bgTexture = new TextureLoader("model/planet-3013945_1280.jpg", this);
Background bg = new Background(bgTexture.getImage()); bg.setApplicationBounds(bounds);
objRoot.addChild(bg);
/* * Background bg = new Background(); bg.setColor(0.7f, 0.83f, 0.8f); * bg.setApplicationBounds(bounds); objRoot.addChild(bg); */
// objRoot.addChild(createRover()); // objRoot.addChild(createGround()); objRoot.addChild(createUFOs());
return objRoot; }
/* * private BranchGroup createRover() { * * BranchGroup objRoot = new BranchGroup(); tg = new TransformGroup(); t3d = * new Transform3D(); * * t3d.setTranslation(new Vector3d(-0.4, -1.0, -2.0)); t3d.setRotation(new * AxisAngle4f(0.0f, 1.0f, 0.0f, 2.6f)); t3d.setScale(1.0); * * tg.setTransform(t3d); * * rover = new MovingRover("model/rover.wrl"); tg.addChild(rover.tg); * * tg.addChild(rover); * * objRoot.addChild(tg); objRoot.addChild(createLight()); * * objRoot.compile(); * * return objRoot; * * } */
/* * private BranchGroup createGround() { * * BranchGroup objRoot = new BranchGroup(); * * TransformGroup tg = new TransformGroup(); Transform3D t3d = new * Transform3D(); * * t3d.setTranslation(new Vector3d(0.0, -1.0, -2.0)); t3d.setRotation(new * AxisAngle4f(0.0f, 0.0f, 0.0f, 0.0f)); t3d.setScale(1.0); * * tg.setTransform(t3d); * * tg.addChild(createObjLoad("model/ground.obj")); * * objRoot.addChild(tg); * * objRoot.addChild(createLight()); * * objRoot.compile(); * * return objRoot; * * } */
private BranchGroup createUFOs() {
BranchGroup objRoot = new BranchGroup();
tg = new TransformGroup(); t3d = new Transform3D();
tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
// TransformGroup tg_rot = new TransformGroup();
t3d.setTranslation(new Vector3d(-10.0, -1.0, -2.0)); t3d.setRotation(new AxisAngle4f(0.0f, 0.0f, 0.0f, 0.0f)); t3d.setScale(1.0);
tg.setTransform(t3d);
// tg_rot.addChild(createWrlLoad("model/ufo_w_url_relative.wrl"));
SharedGroup shared = new SharedGroup(); // shared.addChild(tg_rot);
TransformGroup tg_link = null; Transform3D t3d_link = new Transform3D();
for (float x = -40.0f; x <= 40.0f; x += 4.0f) { for (float z = -40.0f; z <= 40.0f; z += 4.0f) {
t3d_link.setScale(0.02);
t3d_link.setTranslation( new Vector3d((x + 4.5) * (Math.random() * 2.5), 0.0, z * (Math.random() * 2.5 - 5.0)));
tg_link = new TransformGroup(t3d_link);
tg_link.addChild(new Link(shared)); tg.addChild(tg_link); }
}
TransformGroup tg_rot = new TransformGroup(); shared.addChild(tg_rot); tg_rot.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); tg_rot.addChild(createWrlLoad("model/ufo_w_url_relative.wrl"));
tg.addChild(createRotationInterpolator(tg_rot, 1000L));
objRoot.addChild(tg);
objRoot.addChild(createLight()); objRoot.compile();
return objRoot;
}
private RotationInterpolator createRotationInterpolator(TransformGroup target, long time) { Alpha alpha = new Alpha(-1, time); RotationInterpolator rotator = new RotationInterpolator(alpha, target);
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
rotator.setSchedulingBounds(bounds);
return rotator; }
private BranchGroup createWrlLoad(String filename) {
BranchGroup objRoot = new BranchGroup();
TransformGroup tg = new TransformGroup(); Transform3D t3d = new Transform3D(); t3d.setScale(1.0); tg.setTransform(t3d);
VrmlLoader loader = new VrmlLoader(); Scene s = null;
// File file = new java.io.File(filename);
try { s = loader.load(filename); } catch (Exception e) { System.err.println(e); System.exit(1); }
tg.addChild(s.getSceneGroup());
objRoot.addChild(tg);
objRoot.compile();
return objRoot;
}
private Light createLight() { DirectionalLight light = new DirectionalLight(true, new Color3f(1.0f, 1.0f, 1.0f), new Vector3f(-0.4f, -0.5f, -0.1f));
light.setInfluencingBounds(new BoundingSphere(new Point3d(), 10000.0));
return light; }
public static void main(String[] args) { Mykeynavbeh applet = new Mykeynavbeh(); Frame frame = new MainFrame(applet, 800, 600); }
public void keyTyped(KeyEvent e) { char key = e.getKeyChar();
if (key == 's') {
t3dstep.rotY(Math.PI / 32); tg.getTransform(t3d); t3d.get(matrix); t3d.setTranslation(new Vector3d(0.0, 0.0, 0.0)); t3d.mul(t3dstep); t3d.setTranslation(new Vector3d(matrix.m03, matrix.m13, matrix.m23)); tg.setTransform(t3d);
}
if (key == 'f') {
t3dstep.rotY(-Math.PI / 32); tg.getTransform(t3d); t3d.get(matrix); t3d.setTranslation(new Vector3d(0.0, 0.0, 0.0)); t3d.mul(t3dstep); t3d.setTranslation(new Vector3d(matrix.m03, matrix.m13, matrix.m23)); tg.setTransform(t3d);
}
if (key == 'e') { t3dstep.set(new Vector3d(0.0, 0.1, 0.0)); tg.getTransform(t3d); t3d.mul(t3dstep); tg.setTransform(t3d); }
if (key == 'c') { t3dstep.set(new Vector3d(0.0, -0.1, 0.0)); tg.getTransform(t3d); t3d.mul(t3dstep); tg.setTransform(t3d); }
}
public void keyReleased(KeyEvent e) { }
public void keyPressed(KeyEvent e) { }
/* * class MovingRover extends Behavior { * * public TransformGroup tg = null; public Transform3D t3d = null; private * Transform3D t3dstep = new Transform3D(); private WakeupOnElapsedFrames * wakeFrame = null; * * public MovingRover(String filename) { * * tg = new TransformGroup(); t3d = new Transform3D(); * * t3d.setTranslation(new Vector3d(0.0, 0.0, 0.0)); t3d.setScale(1.0); * tg.setTransform(t3d); * * VrmlLoader loader = new VrmlLoader(); Scene s = null; * * try { s = loader.load(filename); } catch (Exception e) { * System.err.println(e); System.exit(1); } * * tg.addChild(s.getSceneGroup()); * * tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); * * BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), * 1000.0); this.setSchedulingBounds(bounds); } * * public void initialize() { wakeFrame = new WakeupOnElapsedFrames(0); * wakeupOn(wakeFrame); } * * public void processStimulus(Enumeration criteria) { t3dstep.set(new * Vector3d(0.0, 0.0, 0.003f)); tg.getTransform(t3d); t3d.mul(t3dstep); * tg.setTransform(t3d); * * wakeupOn(wakeFrame); } } */
}