ピッキングする

Box, Cylinder, Cone, Sphere を並べてピッキングします。

前田稔の超初心者のプログラム入門

プログラムの作成

  1. メモ帳などでタイプして Pick_Mouse.java の名前で保存して下さい。
    //★ Box, Cylinder, Cone, Sphere を並べてピッキング
    import java.awt.*;
    import javax.swing.*;
    import java.io.*;
    import java.awt.image.BufferedImage;
    import javax.imageio.ImageIO;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.utils.image.TextureLoader;
    import com.sun.j3d.utils.geometry.*;
    import com.sun.j3d.utils.geometry.Box;
    import com.sun.j3d.utils.behaviors.picking.*;
    
    public class Pick_Mouse extends JFrame
    {   private Canvas3D canvas = null;
    
        // main Method
        public static void main(String[] args)
        {   java.awt.EventQueue.invokeLater(new Runnable()
            {   public void run()
                {   new Pick_Mouse().setVisible(true);  }
            });
        }
    
        // Constructor
        public Pick_Mouse()
        {   // JFrame の初期化
            super("Mouse Rotate test");
            setSize(300,300);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            // Java3D 関係の設定
            GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
            //Canvas3D canvas = new Canvas3D(config);
            canvas = new Canvas3D(config);
            add(canvas);
    
            // SimpleUniverseを生成
            SimpleUniverse universe = new SimpleUniverse(canvas);
            universe.getViewingPlatform().setNominalViewingTransform();
    
            // Scene を生成
            universe.addBranchGraph(CreateScene());
        }
    
        private BranchGroup CreateScene()
        {   BranchGroup root = new BranchGroup();
            BoundingSphere bounds = new BoundingSphere( new Point3d(), 100.0 );
    
            // PickMouse の設定
            PickRotateBehavior rotator =
                new PickRotateBehavior(root, canvas, bounds, PickObject.USE_GEOMETRY);
            root.addChild(rotator);
    
            PickTranslateBehavior translator =
                new PickTranslateBehavior(root, canvas, bounds, PickObject.USE_GEOMETRY);
            root.addChild(translator);
    
            PickZoomBehavior zoomer =
                new PickZoomBehavior(root, canvas, bounds, PickObject.USE_GEOMETRY);
            root.addChild(zoomer);
    
            // TransformGroup の生成
            TransformGroup trans = new TransformGroup();
            root.addChild(trans);
            Appearance ap = createAppearance();
    
            // Box の生成
            Transform3D bt3d = new Transform3D();
            bt3d.set(new Vector3d(-0.4, 0.4, 0.0));
            TransformGroup btrans = new TransformGroup(bt3d);
            btrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
            btrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            btrans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
            trans.addChild(btrans);
    
            Box box = new Box( 0.25f, 0.25f, 0.25f,
                Primitive.GENERATE_TEXTURE_COORDS | Primitive.ENABLE_GEOMETRY_PICKING, ap );
            btrans.addChild(box);
    
            // Cylinder の生成
            Transform3D cyt3d = new Transform3D();
            cyt3d.set(new Vector3d(-0.4, -0.4, 0.0));
            TransformGroup cytrans = new TransformGroup(cyt3d);
            cytrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
            cytrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            cytrans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
            trans.addChild(cytrans);
    
            Cylinder cylinder = new Cylinder( 0.3f, 0.6f,
                Primitive.GENERATE_TEXTURE_COORDS | Primitive.ENABLE_GEOMETRY_PICKING, ap );
            cytrans.addChild(cylinder);
    
            // Cone の生成
            Transform3D cnt3d = new Transform3D();
            cnt3d.set(new Vector3d(0.4, 0.4, 0.0));
            TransformGroup cntrans = new TransformGroup(cnt3d);
            cntrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
            cntrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            cntrans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
    
            Cone cone = new Cone( 0.3f, 0.6f,
                Primitive.GENERATE_TEXTURE_COORDS | Primitive.ENABLE_GEOMETRY_PICKING, ap);
            cntrans.addChild(cone);
            trans.addChild(cntrans);
    
            // Sphere の生成
            Transform3D st3d = new Transform3D();
            st3d.set(new Vector3d(0.4, -0.4, 0.0));
            TransformGroup strans = new TransformGroup(st3d);
            strans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
            strans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            strans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
    
            Sphere sphere = new Sphere( 0.3f,
                Primitive.GENERATE_TEXTURE_COORDS | Primitive.ENABLE_GEOMETRY_PICKING, ap );
            strans.addChild(sphere);
            trans.addChild(strans);
    
            return root;
        }
    
        // テクスチャーを設定
        private Appearance createAppearance()
        {   Appearance app = new Appearance();
            BufferedImage bimage = loadImage("C:\\DATA\\Test\\earth.jpg");
            Texture2D texture2d = (Texture2D)new TextureLoader(bimage, this).getTexture();
            app.setTexture(texture2d);
            return app;
        }
    
        // 画像の入力
        public static BufferedImage loadImage(String fileName)
        {   InputStream is = null;
            try
            {   is = new FileInputStream(fileName);
                BufferedImage img = ImageIO.read(is);
                return img;
            }
            catch (IOException e)
            {   throw new RuntimeException(e);  }
            finally
            {   if (is != null)
                    try { is.close(); }
                    catch (IOException e) {}
            }
        }
    }
    
  2. ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    マウスの位置により Box, Cylinder, Cone, Sphere を選択して操作します。

プログラムの説明

  1. 基本的な説明は Java 3D で点を描画 を参照して下さい。
    画像関係の import 文を追加して下さい。
    import com.sun.j3d.utils.behaviors.picking.*; を追加して下さい。
    Canvas3D を大域領域で宣言します。
        public class Pick_Mouse extends JFrame
        {   private Canvas3D canvas = null;
                ・・・
            //Canvas3D canvas = new Canvas3D(config);
            canvas = new Canvas3D(config);
        
  2. モデルを生成する CreateScene() メソッドです。
    PickRotateBehavior で PickMouse の回転を設定します。
    PickTranslateBehavior で PickMouse の移動を設定します。
    PickZoomBehavior で PickMouse のズームを設定します。
        // Scene を生成
        private BranchGroup CreateScene()
        {   BranchGroup root = new BranchGroup();
            BoundingSphere bounds = new BoundingSphere( new Point3d(), 100.0 );
    
            // PickMouse の設定
            PickRotateBehavior rotator =
                new PickRotateBehavior(root, canvas, bounds, PickObject.USE_GEOMETRY);
            root.addChild(rotator);
    
            PickTranslateBehavior translator =
                new PickTranslateBehavior(root, canvas, bounds, PickObject.USE_GEOMETRY);
            root.addChild(translator);
    
            PickZoomBehavior zoomer =
                new PickZoomBehavior(root, canvas, bounds, PickObject.USE_GEOMETRY);
            root.addChild(zoomer);
        
  3. Box, Cylinder, Cone, Sphere を生成して地球のテクスチャを張り付けてみました。
    地球のテクスチャの張り付けは 地球がまわる を参照して下さい。
    createAppearance() でテクスチャを設定してモデルに張り付けます。
    ピッキングするので ENABLE_PICK_REPORTING を許可します。
    各モデルに GENERATE_TEXTURE_COORDS と ENABLE_GEOMETRY_PICKING フラグを設定して下さい。
    これだけで、マウスの位置により Box, Cylinder, Cone, Sphere を選択できるようになります。
            // TransformGroup の生成
            TransformGroup trans = new TransformGroup();
            root.addChild(trans);
            Appearance ap = createAppearance();
    
            // Box の生成
            Transform3D bt3d = new Transform3D();
            bt3d.set(new Vector3d(-0.4, 0.4, 0.0));
            TransformGroup btrans = new TransformGroup(bt3d);
            btrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
            btrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            btrans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
            trans.addChild(btrans);
    
            Box box = new Box( 0.25f, 0.25f, 0.25f,
                Primitive.GENERATE_TEXTURE_COORDS | Primitive.ENABLE_GEOMETRY_PICKING, ap );
            btrans.addChild(box);
    
            // Cylinder の生成
            Transform3D cyt3d = new Transform3D();
            cyt3d.set(new Vector3d(-0.4, -0.4, 0.0));
            TransformGroup cytrans = new TransformGroup(cyt3d);
            cytrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
            cytrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            cytrans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
            trans.addChild(cytrans);
    
            Cylinder cylinder = new Cylinder( 0.3f, 0.6f,
                Primitive.GENERATE_TEXTURE_COORDS | Primitive.ENABLE_GEOMETRY_PICKING, ap );
            cytrans.addChild(cylinder);
    
            // Cone の生成
            Transform3D cnt3d = new Transform3D();
            cnt3d.set(new Vector3d(0.4, 0.4, 0.0));
            TransformGroup cntrans = new TransformGroup(cnt3d);
            cntrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
            cntrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            cntrans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
    
            Cone cone = new Cone( 0.3f, 0.6f,
                Primitive.GENERATE_TEXTURE_COORDS | Primitive.ENABLE_GEOMETRY_PICKING, ap);
            cntrans.addChild(cone);
            trans.addChild(cntrans);
    
            // Sphere の生成
            Transform3D st3d = new Transform3D();
            st3d.set(new Vector3d(0.4, -0.4, 0.0));
            TransformGroup strans = new TransformGroup(st3d);
            strans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
            strans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            strans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
    
            Sphere sphere = new Sphere( 0.3f,
                Primitive.GENERATE_TEXTURE_COORDS | Primitive.ENABLE_GEOMETRY_PICKING, ap );
            strans.addChild(sphere);
            trans.addChild(strans);
    
            return root;
        }
        
  4. createAppearance() メソッドと loadImage() メソッドの説明は「地球がまわる」を参照して下さい。

超初心者のプログラム入門(Java2)