// Java 3Dテスト用アプレット // AlphaTest.java // Copyright (c) 1999 ENDO Yasuyuki // mailto:yasuyuki@javaopen.org // http://www.javaopen.org/j3dbook/index.html import java.applet.Applet; import java.awt.BorderLayout; import java.awt.Button; import java.awt.GraphicsConfiguration; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.util.Vector; import javax.media.j3d.Canvas3D; import javax.media.j3d.Background; import javax.media.j3d.BranchGroup; import javax.media.j3d.TransformGroup; import javax.media.j3d.LineStripArray; import javax.media.j3d.GeometryArray; import javax.media.j3d.Appearance; import javax.media.j3d.LineAttributes; import javax.media.j3d.ColoringAttributes; import javax.media.j3d.Shape3D; import javax.media.j3d.Alpha; import javax.media.j3d.BoundingSphere; import javax.vecmath.Point3d; import javax.vecmath.Color3f; import com.sun.j3d.utils.universe.SimpleUniverse; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.behaviors.mouse.MouseTranslate; //import com.sun.j3d.utils.behaviors.mouse.MouseZoom; public class AlphaTest extends Applet { public static final double STEP = 0.01; public static final Color3f BLACK = new Color3f(0.0f, 0.0f, 0.0f); public static final Color3f WHITE = new Color3f(1.0f, 1.0f, 1.0f); public static final Color3f RED = new Color3f(1.0f, 0.0f, 0.0f); public static final Color3f BLUE = new Color3f(0.0f, 0.0f, 1.0f); private GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); private Canvas3D canvas = new Canvas3D(config); private SimpleUniverse universe = new SimpleUniverse(canvas); private BranchGroup root = new BranchGroup(); private Alpha alpha = new Alpha( 1, Alpha.INCREASING_ENABLE | Alpha.DECREASING_ENABLE, 2000, // trigger 2 sec 2000, // delay 2 sec 10000, // inc 10 sec 4000, // ramp 4 sec 4000, // one 4 sec 10000, // dec 10 sec 4000, // ramp 4 sec 4000 // zero 4 sec ); private AlphaPanel apanel = new AlphaPanel(alpha); private TimerInterpolator timer = new TimerInterpolator(apanel.getAlpha(), 200); private BranchGroup lineRoot = null; private TransformGroup trans = null; private Point3d[] vertices = null; private Color3f[] colors = null; private LineStripArray line = null; private Appearance app = new Appearance(); private ColoringAttributes cattr = new ColoringAttributes(BLACK, ColoringAttributes.SHADE_FLAT); private Shape3D shape = null; private Point3d[] averts = new Point3d[3]; private float[] acolors = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }; private int[] astrips = {averts.length}; private LineStripArray aline = null; private Shape3D ashape = null; private Vector vvector = new Vector(); private Vector cvector = new Vector(); private double x = 0.0; private long startTime = 0; private long startIncreasingRamp = 0; private long endIncreasingRamp = 0; private long endIncreasingStraight = 0; private long startOne = 0; private long endOne = 0; private long endDecreasingRamp = 0; private long endDecreasingStraight = 0; private long startZero = 0; private long endZero = 0; private void resetTimes() { startTime = System.currentTimeMillis(); apanel.reset(startTime); Alpha alpha = apanel.getAlpha(); startIncreasingRamp = startTime + alpha.getTriggerTime() + alpha.getPhaseDelayDuration(); endIncreasingRamp = startIncreasingRamp + alpha.getIncreasingAlphaRampDuration(); startOne = startIncreasingRamp + alpha.getIncreasingAlphaDuration(); endIncreasingStraight = startOne - alpha.getIncreasingAlphaRampDuration(); endOne = startOne + alpha.getAlphaAtOneDuration(); endDecreasingRamp = endOne + alpha.getDecreasingAlphaRampDuration(); startZero = endOne + alpha.getDecreasingAlphaDuration(); endDecreasingStraight = startZero - alpha.getDecreasingAlphaRampDuration(); endZero = startZero + alpha.getAlphaAtZeroDuration(); } public AlphaTest() { this.setLayout(new BorderLayout()); this.add(apanel, BorderLayout.NORTH); final Button button = new Button("Start"); button.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { String label = button.getLabel(); if (label.equals("Start")) { timer.setEnable(true); resetTimes(); x = 0.0; vvector.removeAllElements(); cvector.removeAllElements(); button.setLabel("Stop"); } else if (label.equals("Stop")) { timer.setEnable(false); button.setLabel("Start"); } } }); this.add(button, BorderLayout.SOUTH); this.add(canvas, BorderLayout.CENTER); } public void init() { universe.getViewingPlatform().setNominalViewingTransform(); root.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE); root.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND); BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0); Background background = new Background(WHITE); background.setApplicationBounds(bounds); root.addChild(background); timer.setEnable(false); timer.setupCallback(new TimerInterpolatorCallback() { public void wakeup() { x += STEP; long current = System.currentTimeMillis(); if (current > startTime + apanel.getAlpha().getTriggerTime()) { Point3d point = new Point3d(x, apanel.getAlpha().value()/2.0, 0.0); vvector.addElement(point); if (current < startIncreasingRamp) { cvector.addElement(BLACK); } else if (current > startIncreasingRamp && current <= endIncreasingRamp) { cvector.addElement(RED); } else if (current > endIncreasingRamp && current <= endIncreasingStraight) { cvector.addElement(BLACK); } else if (current > endIncreasingStraight && current <= startOne) { cvector.addElement(RED); } else if (current > startOne && current <= endOne) { cvector.addElement(BLUE); } else if (current > endOne && current <= endDecreasingRamp) { cvector.addElement(RED); } else if (current > endDecreasingRamp && current <= endDecreasingStraight) { cvector.addElement(BLACK); } else if (current > endDecreasingStraight && current <= startZero) { cvector.addElement(RED); } else if (current > startZero && current <= endZero) { cvector.addElement(BLUE); } else if (current > endZero) { cvector.addElement(WHITE); } System.out.println("point=" + point);//DEBUG if (vvector.size() > 1) { lineRoot.detach(); java.util.Enumeration e = trans.getAllChildren(); for (int i=0; e.hasMoreElements(); i++) { Object o = e.nextElement(); if (o == shape) trans.removeChild(i); } e = trans.getAllChildren(); for (int i=0; e.hasMoreElements(); i++) { Object o = e.nextElement(); if (o == ashape) trans.removeChild(i); } vertices = new Point3d[vvector.size()]; vvector.copyInto(vertices); colors = new Color3f[cvector.size()]; cvector.copyInto(colors); int[] strips = {vertices.length}; line = new LineStripArray( vertices.length, GeometryArray.COORDINATES | GeometryArray.COLOR_3, strips ); line.setCoordinates(0, vertices); line.setColors(0, colors); shape = new Shape3D(line, app); trans.addChild(shape); averts[2].x = x; aline = new LineStripArray( averts.length, GeometryArray.COORDINATES | GeometryArray.COLOR_3, astrips ); aline.setCoordinates(0, averts); aline.setColors(0, acolors); ashape = new Shape3D(aline); trans.addChild(ashape); root.addChild(lineRoot); } } } }); timer.setSchedulingBounds(bounds); root.addChild(timer); lineRoot = new BranchGroup(); lineRoot.setCapability(BranchGroup.ALLOW_DETACH); root.addChild(lineRoot); trans = new TransformGroup(); trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); lineRoot.addChild(trans); MouseTranslate translator = new MouseTranslate(trans); translator.setSchedulingBounds(bounds); lineRoot.addChild(translator); //MouseZoom zoomer = new MouseZoom(trans); //zoomer.setSchedulingBounds(bounds); //lineRoot.addChild(zoomer); vertices = new Point3d[2]; Point3d point = new Point3d(); vertices[0] = point; vertices[1] = point; colors = new Color3f[vertices.length]; colors[0] = BLACK; colors[1] = BLACK; int[] strips = {vertices.length}; line = new LineStripArray( vertices.length, GeometryArray.COORDINATES | GeometryArray.COLOR_3, strips ); line.setCoordinates(0, vertices); line.setColors(0, colors); app.setColoringAttributes(cattr); app.setLineAttributes(new LineAttributes(6.0f, LineAttributes.PATTERN_SOLID, false)); shape = new Shape3D(line, app); trans.addChild(shape); averts[0] = new Point3d(0.0, 0.5, 0.0); averts[1] = new Point3d(0.0, 0.0, 0.0); averts[2] = new Point3d(0.0, 0.0, 0.0); aline = new LineStripArray( averts.length, GeometryArray.COORDINATES | GeometryArray.COLOR_3, astrips ); aline.setCoordinates(0, averts); aline.setColors(0, acolors); ashape = new Shape3D(aline); trans.addChild(ashape); } public void start() { universe.addBranchGraph(root); } public void stop() { root.detach(); } public static void main(String[] args) { new MainFrame(new AlphaTest(), 800, 600); } }