// Java 3D Test Applet // PositionPathTest.java // Copyright (c) 1999 ENDO Yasuyuki // mailto:yasuyuki@javaopen.org // http://www.javaopen.org/j3dbook/index.html import java.applet.*; import java.awt.*; import java.awt.event.*; 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.behaviors.picking.PickRotateBehavior; import com.sun.j3d.utils.behaviors.picking.PickingCallback; import com.sun.j3d.utils.geometry.Box; import com.sun.j3d.utils.geometry.ColorCube; public class PositionPathTest extends Applet { private Canvas3D canvas = null; private SimpleUniverse universe = null; private BranchGroup scene = null; private TransformGroup mtrans = null; private Point3f[] pverts = null; private TuplePanel tp0 = new TuplePanel( new Point3f( 0.0f, -0.6f, 0.1f) ); private TuplePanel tp1 = new TuplePanel( new Point3f(-0.4f, -0.2f, 0.1f) ); private TuplePanel tp2 = new TuplePanel( new Point3f( 0.4f, 0.2f, 0.1f) ); private TuplePanel tp3 = new TuplePanel( new Point3f( 0.0f, 0.6f, 0.1f) ); private float[] knots = { 0.0f, 0.4f, 0.6f, 1.0f }; private AlphaPanel apanel = null; private PositionPathInterpolator pinterp = null; private Shape3D pshape = null; public PositionPathTest() { this.setLayout(new BorderLayout()); apanel = new AlphaPanel(); this.add(apanel, BorderLayout.NORTH); Panel ppanel = new Panel(); ppanel.setLayout( new GridLayout(4, 0) ); this.add(ppanel, BorderLayout.SOUTH); Panel[] ppanels = new Panel[4]; for (int i=0; i<4; i++) { ppanels[i] = new Panel(); ppanel.add(ppanels[i]); } final Button sbutton = new Button("Start"); sbutton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { String blabel = sbutton.getLabel(); if (blabel.equals("Start")) { pinterp.setEnable(true); apanel.reset(); sbutton.setLabel("Stop"); } else if (blabel.equals("Stop")) { pinterp.setEnable(false); sbutton.setLabel("Start"); } } }); ppanels[0].add(sbutton); ppanels[0].add( new Label("k0") ); TextField k0field = new TextField("0.0"); k0field.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { float k = 0.0f; try { k = Float.parseFloat(e.getActionCommand()); if (k < 0.0f) k = 0.0f; if (k > 1.0f) k = 1.0f; knots[0] = k; pinterp.setKnot(0, k); } catch (NumberFormatException ex) {} } }); ppanels[0].add(k0field); String[] labels0 = {"p0.x", "p0.y", "p0.z"}; tp0.setLabels(labels0); tp0.addTupleEventListener( new TupleEventListener() { public void tupleStateChanged(TupleEvent e) { universe.getLocale().removeBranchGraph(scene); removeChild(mtrans, pshape); pverts[0] = e.getPoint3f(); pshape = createPoints(pverts); mtrans.addChild(pshape); universe.addBranchGraph(scene); pinterp.setPosition(0, pverts[0]); } }); ppanels[0].add(tp0); ppanels[1].add( new Label("k1") ); TextField k1field = new TextField("0.4"); k1field.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { float k = 0.0f; try { k = Float.parseFloat(e.getActionCommand()); if (k < 0.0f) k = 0.0f; if (k > 1.0f) k = 1.0f; knots[1] = k; pinterp.setKnot(1, k); } catch (NumberFormatException ex) {} } }); ppanels[1].add(k1field); String[] labels1 = {"p1.x", "p1.y", "p1.z"}; tp1.setLabels(labels1); tp1.addTupleEventListener( new TupleEventListener() { public void tupleStateChanged(TupleEvent e) { universe.getLocale().removeBranchGraph(scene); removeChild(mtrans, pshape); pverts[1] = e.getPoint3f(); pshape = createPoints(pverts); mtrans.addChild(pshape); universe.addBranchGraph(scene); pinterp.setPosition(1, pverts[1]); } }); ppanels[1].add(tp1); ppanels[2].add( new Label("k2") ); TextField k2field = new TextField("0.6"); k2field.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { float k = 0.0f; try { k = Float.parseFloat(e.getActionCommand()); if (k < 0.0f) k = 0.0f; if (k > 1.0f) k = 1.0f; knots[2] = k; pinterp.setKnot(2, k); } catch (NumberFormatException ex) {} } }); ppanels[2].add(k2field); String[] labels2 = {"p2.x", "p2.y", "p2.z"}; tp2.setLabels(labels2); tp2.addTupleEventListener( new TupleEventListener() { public void tupleStateChanged(TupleEvent e) { universe.getLocale().removeBranchGraph(scene); removeChild(mtrans, pshape); pverts[2] = e.getPoint3f(); pshape = createPoints(pverts); mtrans.addChild(pshape); universe.addBranchGraph(scene); pinterp.setPosition(2, pverts[2]); } }); ppanels[2].add(tp2); ppanels[3].add( new Label("k3") ); TextField k3field = new TextField("1.0"); k3field.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { float k = 0.0f; try { k = Float.parseFloat(e.getActionCommand()); if (k < 0.0f) k = 0.0f; if (k > 1.0f) k = 1.0f; knots[3] = k; pinterp.setKnot(3, k); } catch (NumberFormatException ex) {} } }); ppanels[3].add(k3field); String[] labels3 = {"p3.x", "p3.y", "p3.z"}; tp3.setLabels(labels3); tp3.addTupleEventListener( new TupleEventListener() { public void tupleStateChanged(TupleEvent e) { universe.getLocale().removeBranchGraph(scene); removeChild(mtrans, pshape); pverts[3] = e.getPoint3f(); pshape = createPoints(pverts); mtrans.addChild(pshape); universe.addBranchGraph(scene); pinterp.setPosition(3, pverts[3]); } }); ppanels[3].add(tp3); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); canvas = new Canvas3D(config); this.add(canvas, BorderLayout.CENTER); universe = new SimpleUniverse(canvas); universe.getViewingPlatform().setNominalViewingTransform(); scene = createSceneGraph(); universe.addBranchGraph(scene); } private void removeChild(Group group, Node node) { for (int i=0; i