// Java 3Dテスト用アプレット // PickSelectionFeedback.java // Copyright (c) 1999 ENDO Yasuyuki // mailto:yasuyuki@javaopen.org // http://www.javaopen.org/j3dbook/index.html import java.awt.*; import java.awt.event.*; import javax.media.j3d.*; import javax.vecmath.*; import com.sun.j3d.utils.geometry.Primitive; import com.sun.j3d.utils.geometry.Cone; import com.sun.j3d.utils.geometry.Cylinder; import com.sun.j3d.utils.geometry.Box; import com.sun.j3d.utils.behaviors.picking.PickObject; import com.sun.j3d.utils.behaviors.picking.PickRotateBehavior; import com.sun.j3d.utils.behaviors.picking.PickTranslateBehavior; import com.sun.j3d.utils.behaviors.picking.PickZoomBehavior; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.universe.*; public class PickSelectionFeedback extends java.applet.Applet { private Canvas3D canvas = null; private BranchGroup scene = null; public PickSelectionFeedback() { this.setLayout(new BorderLayout()); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); canvas = new Canvas3D(config); this.add(canvas, BorderLayout.CENTER); //これでマウスイベントが通知される canvas.addMouseListener(new MouseAdapter() { public void mouseClicked( MouseEvent e ){ Node node = pickNode(e.getX(), e.getY()); if (node != null) { String data = (String)node.getUserData(); System.out.println("UserData=" + data); } } }); SimpleUniverse universe = new SimpleUniverse(canvas); universe.getViewingPlatform().setNominalViewingTransform(); scene = createSceneGraph(); universe.addBranchGraph(scene); } private Node pickNode(int mx, int my) { PickObject pickObject = new PickObject(canvas, scene); SceneGraphPath sgPath = pickObject.pickClosest(mx, my, PickObject.USE_GEOMETRY); if (sgPath == null) return null; Node node = pickObject.pickNode(sgPath, PickObject.PRIMITIVE, 1); return node; } public BranchGroup createSceneGraph() { BranchGroup root = new BranchGroup(); BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0); DirectionalLight light = new DirectionalLight( new Color3f(1.0f, 1.0f, 1.0f), new Vector3f(0.0f, 0.0f, -1.0f)); light.setInfluencingBounds(bounds); root.addChild(light); Cone cone = new Cone( 0.1f, 0.2f, Primitive.GENERATE_NORMALS | Primitive.ENABLE_GEOMETRY_PICKING, createAppearance(1.0f, 0.0f, 0.0f)); cone.setUserData("This is cone."); TransformGroup coneTrans = new TransformGroup(); coneTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); coneTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); coneTrans.setCapability(TransformGroup.ENABLE_PICK_REPORTING); Transform3D coneT3D = new Transform3D(); coneT3D.setTranslation(new Vector3d(0.0, 0.5, 0.0)); coneTrans.setTransform(coneT3D); coneTrans.addChild(cone); root.addChild(coneTrans); Cylinder cylinder = new Cylinder( 0.1f, 0.2f, Primitive.GENERATE_NORMALS | Primitive.ENABLE_GEOMETRY_PICKING, createAppearance(0.0f, 1.0f, 0.0f)); cylinder.setUserData("This is cylinder."); TransformGroup cylinderTrans = new TransformGroup(); cylinderTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); cylinderTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); cylinderTrans.setCapability(TransformGroup.ENABLE_PICK_REPORTING); cylinderTrans.addChild(cylinder); root.addChild(cylinderTrans); Box box = new Box( 0.1f, 0.1f, 0.1f, Primitive.GENERATE_NORMALS | Primitive.ENABLE_GEOMETRY_PICKING, createAppearance(0.0f, 0.0f, 1.0f)); box.setUserData("This is box."); TransformGroup boxTrans = new TransformGroup(); boxTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); boxTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); boxTrans.setCapability(TransformGroup.ENABLE_PICK_REPORTING); Transform3D boxT3D = new Transform3D(); boxT3D.setTranslation(new Vector3d(0.0, -0.5, 0.0)); boxTrans.setTransform(boxT3D); boxTrans.addChild(box); root.addChild(boxTrans); PickRotateBehavior rotate = new PickRotateBehavior(root, canvas, bounds, PickObject.USE_GEOMETRY); root.addChild(rotate); PickTranslateBehavior translate = new PickTranslateBehavior(root, canvas, bounds, PickObject.USE_GEOMETRY); root.addChild(translate); PickZoomBehavior zoom = new PickZoomBehavior(root, canvas, bounds, PickObject.USE_GEOMETRY); root.addChild(zoom); return root; } private Appearance createAppearance(float r, float g, float b) { Material material = new Material(); material.setLightingEnable(true); material.setDiffuseColor(new Color3f(r, g, b)); material.setSpecularColor(new Color3f(0.0f, 0.0f, 0.0f)); material.setShininess(32.0f); Appearance appearance = new Appearance(); appearance.setMaterial(material); return appearance; } public static void main(String[] args) { PickSelectionFeedback me = new PickSelectionFeedback(); MainFrame frame = new MainFrame(me, 500, 500); } }