// Java 3D Test Applet // RotationInterpolatorTest.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.mouse.MouseRotate; public class RotationInterpolatorTest extends Applet { private AlphaPanel apanel = null; private RotationInterpolator rinterp = null; public RotationInterpolatorTest() { this.setLayout(new BorderLayout()); apanel = new AlphaPanel(); this.add(apanel, BorderLayout.NORTH); Panel spanel = new Panel(); this.add(spanel, BorderLayout.SOUTH); final Button sbutton = new Button("Stop"); sbutton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { String blabel = sbutton.getLabel(); if (blabel.equals("Start")) { rinterp.setEnable(true); apanel.reset(); sbutton.setLabel("Stop"); } else if (blabel.equals("Stop")) { rinterp.setEnable(false); sbutton.setLabel("Start"); } } }); spanel.add(sbutton); spanel.add( new Label("Mimimum - pi *") ); TextField minfield = new TextField("0.0"); minfield.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { float a = 0.0f; try { a = Float.parseFloat(e.getActionCommand()); rinterp.setMinimumAngle(a * (float)Math.PI); } catch (NumberFormatException ex) {} } }); spanel.add(minfield); spanel.add( new Label("Maximum - pi *") ); TextField maxfield = new TextField("2.0"); maxfield.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { float a = 0.0f; try { a = Float.parseFloat(e.getActionCommand()); rinterp.setMaximumAngle(a * (float)Math.PI); } catch (NumberFormatException ex) {} } }); spanel.add(maxfield); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas = new Canvas3D(config); this.add(canvas, BorderLayout.CENTER); SimpleUniverse universe = new SimpleUniverse(canvas); universe.getViewingPlatform().setNominalViewingTransform(); universe.addBranchGraph(createSceneGraph()); } private BranchGroup createSceneGraph() { BranchGroup root = new BranchGroup(); BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0); TransformGroup mtrans = new TransformGroup(); mtrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); mtrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); mtrans.setCapability(TransformGroup.ENABLE_PICK_REPORTING); root.addChild(mtrans); MouseRotate mrotator = new MouseRotate(); mrotator.setSchedulingBounds(bounds); mrotator.setTransformGroup(mtrans); root.addChild(mrotator); double[] vertices = { -0.8, -0.8, 0.0, -0.8, 0.8, 0.0, -0.4, -0.8, 0.0, -0.4, 0.8, 0.0, 0.0, -0.8, 0.0, 0.0, 0.8, 0.0, 0.4, -0.8, 0.0, 0.4, 0.8, 0.0, 0.8, -0.8, 0.0, 0.8, 0.8, 0.0, -0.8, -0.8, 0.0, 0.8, -0.8, 0.0, -0.8, -0.4, 0.0, 0.8, -0.4, 0.0, -0.8, 0.0, 0.0, 0.8, 0.0, 0.0, -0.8, 0.4, 0.0, 0.8, 0.4, 0.0, -0.8, 0.8, 0.0, 0.8, 0.8, 0.0 }; LineArray geom = new LineArray( vertices.length / 3, GeometryArray.COORDINATES); geom.setCoordinates(0, vertices); Shape3D grid = new Shape3D(geom); mtrans.addChild(grid); Transform3D t3d = new Transform3D(); t3d.set( new Vector3d(0.0, 0.0, 0.1) ); TransformGroup trans = new TransformGroup(t3d); mtrans.addChild(trans); TransformGroup rtrans = new TransformGroup(); rtrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); rtrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); rtrans.setCapability(TransformGroup.ENABLE_PICK_REPORTING); trans.addChild(rtrans); double[] rverts = { 0.0, 0.0, 0.0, 0.0, 0.6, 0.0 }; float[] rcolors = { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f }; LineArray rline = new LineArray(rverts.length / 3, LineArray.COORDINATES | LineArray.COLOR_3); rline.setCoordinates(0, rverts); rline.setColors(0, rcolors); Appearance rapp = new Appearance(); rapp.setLineAttributes( new LineAttributes( 6.0f, LineAttributes.PATTERN_SOLID, false ) ); Shape3D rshape = new Shape3D(rline, rapp); rtrans.addChild(rshape); Transform3D rt3d = new Transform3D(); rt3d.rotX( -(Math.PI / 2.0) ); rinterp = new RotationInterpolator( apanel.getAlpha(), rtrans, rt3d, 0.0f, (float)Math.PI * 2.0f ); rinterp.setSchedulingBounds(bounds); root.addChild(rinterp); return root; } public static void main(String[] args) { RotationInterpolatorTest applet = new RotationInterpolatorTest(); Frame frame = new MainFrame(applet, 500, 500); } }