3種類のモデルを切り替える

Switch を使ってマウスのクリックで3種類のモデルを切り替えます。

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

プログラムの作成

  1. Switch を使ってマウスがクリックされたX座標で3種類のモデルを切り替えます。
    メモ帳などでタイプして ChangeModel.java の名前で保存して下さい。
    //★ マウスがクリックされた座標で3種類のモデルを切り替える
    import java.awt.*;
    import javax.swing.*;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.utils.behaviors.mouse.*;
    import java.util.*;
    import java.awt.event.*;
    
    // Main Class
    public class ChangeModel extends JFrame
    {   private Switch switchNode = null;
        private BitSet bitset = null;
    
        // main Method
        public static void main(String[] args)
        {   new ChangeModel();  }
    
        // Constructor
        public ChangeModel()
        {   // JFrame の初期化
            super("Model Change");
            setSize(300,300);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            // Java3D関係の設定
            GraphicsConfiguration g_config = SimpleUniverse.getPreferredConfiguration();
            Canvas3D canvas = new Canvas3D(g_config);
            add(canvas);
    
            // マウスイベントが通知される
            canvas.addMouseListener(new MouseAdapter()
            {   public void mouseClicked( MouseEvent e )
                {   System.out.println("Mouse Click" + "  X=" + e.getX() + "  Y=" + e.getY());
                    for (int i=0; i<3; i++) bitset.clear(i);
                    bitset.set(e.getX()/100);
                    switchNode.setChildMask(bitset);
                }
            });
    
            // SimpleUniverseを生成
            SimpleUniverse universe = new SimpleUniverse(canvas);
            universe.getViewingPlatform().setNominalViewingTransform();
    
            // シーンの生成
            universe.addBranchGraph(CreateScene());
            setVisible(true);
        }
    
        //  モデルを生成
        private BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
    
            // Mouse 操作の設定
            TransformGroup trans = new TransformGroup();
            SetMouse(objRoot, trans);
            objRoot.addChild(trans);
    
            // 描画フラグの初期化
            bitset = new BitSet(3);
            for (int i=0; i<3; i++) bitset.clear(i);
            bitset.set(0);
    
            // switchNode の設定
            switchNode = new Switch(Switch.CHILD_MASK, bitset);
            switchNode.setCapability(Switch.ALLOW_SWITCH_READ);
            switchNode.setCapability(Switch.ALLOW_SWITCH_WRITE);
            switchNode.setChildMask(bitset);
            trans.addChild(switchNode);
    
            QuadArray g[] = new QuadArray[3];
            Shape3D shape[] = new Shape3D[3];
    
            g[0] = new ColorPyramidUp();        // 正面水色4面体
            g[1] = new ColorCube();             // 正面赤色立方体
            g[2] = new ColorPyramidDown();      // 正面緑逆さ4面体
    
            // Switch にモデルをアップ
            Appearance a = new Appearance();
            for(int i=0; i<3;i++)
            {   shape[i] = new Shape3D(g[i],a); // Shape3D を生成
                switchNode.addChild(shape[i]);  // objTrans に追加
            }
    
            return objRoot;
        }
    
        // Mouse 操作の設定
        public void SetMouse(BranchGroup objRoot, TransformGroup trans)
        {
            // Model の修正を許可
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    
            // 回転を設定
            BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);
            MouseRotate rotator = new MouseRotate(trans);
            rotator.setSchedulingBounds(bounds);
            objRoot.addChild(rotator);
    
            // 移動を設定
            MouseTranslate translator = new MouseTranslate(trans);
            translator.setSchedulingBounds(bounds);
            objRoot.addChild(translator);
    
            // ズームを設定
            MouseZoom zoomer = new MouseZoom(trans);
            zoomer.setSchedulingBounds(bounds);
            objRoot.addChild(zoomer);
        }
    }
    
  2. 1個目のモデル(正面が水色の4面体)を生成する class ColorPyramidUp.java です。
    ChangeModel.java と同じフォルダーに格納して下さい。
    4面体はもっとシンプルに定義できるのですが、Morphing に使うために立方体に合わせています。
    // 正面水色4面体です。
    
    import javax.media.j3d.*;
    import javax.vecmath.*;
    
    class ColorPyramidUp extends QuadArray {
        private static final float[] verts = {
        // front face
         1.0f, -1.0f,  1.0f,
         0.0f,  1.0f,  0.0f,
         0.0f,  1.0f,  0.0f,
        -1.0f, -1.0f,  1.0f,
        // back face
        -1.0f, -1.0f, -1.0f,
         0.0f,  1.0f, 0.0f,
         0.0f,  1.0f, 0.0f,
         1.0f, -1.0f, -1.0f,
        // right face
         1.0f, -1.0f, -1.0f,
         0.0f,  1.0f,  0.0f,
         0.0f,  1.0f,  0.0f,
         1.0f, -1.0f,  1.0f,
        // left face
        -1.0f, -1.0f,  1.0f,
         0.0f,  1.0f,  0.0f,
         0.0f,  1.0f,  0.0f,
        -1.0f, -1.0f, -1.0f,
        // top face
         0.0f,  1.0f,  0.0f,
         0.0f,  1.0f,  0.0f,
         0.0f,  1.0f,  0.0f,
         0.0f,  1.0f,  0.0f,
        // bottom face
        -1.0f, -1.0f,  1.0f,
        -1.0f, -1.0f, -1.0f,
         1.0f, -1.0f, -1.0f,
         1.0f, -1.0f,  1.0f,
        };
    
        private static final float[] colors = {
        // front face (cyan)
        0.0f, 1.0f, 1.0f,
        0.0f, 1.0f, 1.0f,
        0.0f, 1.0f, 1.0f,
        0.0f, 1.0f, 1.0f,
        // back face (magenta)
        1.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 1.0f,
        // right face (yellow)
        1.0f, 1.0f, 0.0f,
        1.0f, 1.0f, 0.0f,
        1.0f, 1.0f, 0.0f,
        1.0f, 1.0f, 0.0f,
        // left face (blue)
        0.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 1.0f,
        // top face (green)
        0.0f, 1.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
        // bottom face (red)
        1.0f, 0.0f, 0.0f,
        1.0f, 0.0f, 0.0f,
        1.0f, 0.0f, 0.0f,
        1.0f, 0.0f, 0.0f,
        };
    
        ColorPyramidUp() {
        super(24, QuadArray.COORDINATES | QuadArray.COLOR_3);
    
        setCoordinates(0, verts);
        setColors(0, colors);
        }
    }
    
  3. 2個目のモデル(正面が赤色の立方体)を生成する class ColorCube.java です。
    ChangeModel.java と同じフォルダーに格納して下さい。
    // 各面に色を設定した立方体です。
    
    import javax.media.j3d.*;
    import javax.vecmath.*;
    
    class ColorCube extends QuadArray {
        private static final float[] verts = {
        // front face
         1.0f, -1.0f,  1.0f,
         1.0f,  1.0f,  1.0f,
        -1.0f,  1.0f,  1.0f,
        -1.0f, -1.0f,  1.0f,
        // back face
        -1.0f, -1.0f, -1.0f,
        -1.0f,  1.0f, -1.0f,
         1.0f,  1.0f, -1.0f,
         1.0f, -1.0f, -1.0f,
        // right face
         1.0f, -1.0f, -1.0f,
         1.0f,  1.0f, -1.0f,
         1.0f,  1.0f,  1.0f,
         1.0f, -1.0f,  1.0f,
        // left face
        -1.0f, -1.0f,  1.0f,
        -1.0f,  1.0f,  1.0f,
        -1.0f,  1.0f, -1.0f,
        -1.0f, -1.0f, -1.0f,
        // top face
         1.0f,  1.0f,  1.0f,
         1.0f,  1.0f, -1.0f,
        -1.0f,  1.0f, -1.0f,
        -1.0f,  1.0f,  1.0f,
        // bottom face
        -1.0f, -1.0f,  1.0f,
        -1.0f, -1.0f, -1.0f,
         1.0f, -1.0f, -1.0f,
         1.0f, -1.0f,  1.0f,
        };
    
        private static final float[] colors = {
        // front face (red)
        1.0f, 0.0f, 0.0f,
        1.0f, 0.0f, 0.0f,
        1.0f, 0.0f, 0.0f,
        1.0f, 0.0f, 0.0f,
        // back face (green)
        0.0f, 1.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
        // right face (blue)
        0.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 1.0f,
        // left face (yellow)
        1.0f, 1.0f, 0.0f,
        1.0f, 1.0f, 0.0f,
        1.0f, 1.0f, 0.0f,
        1.0f, 1.0f, 0.0f,
        // top face (magenta)
        1.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 1.0f,
        // bottom face (cyan)
        0.0f, 1.0f, 1.0f,
        0.0f, 1.0f, 1.0f,
        0.0f, 1.0f, 1.0f,
        0.0f, 1.0f, 1.0f,
        };
    
        ColorCube() {
        super(24, QuadArray.COORDINATES | QuadArray.COLOR_3);
    
        setCoordinates(0, verts);
        setColors(0, colors);
        }
    }
    
  4. 3個目のモデル(正面が緑色の逆さ4面体)を生成する class ColorPyramidDown.java です。
    ChangeModel.java と同じフォルダーに格納して下さい。
    4面体はもっとシンプルに定義できるのですが、Morphing に使うために立方体に合わせています。
    // 正面緑逆さ4面体です。
    
    import javax.media.j3d.*;
    import javax.vecmath.*;
    
    class ColorPyramidDown extends QuadArray {
        private static final float[] verts = {
        // front face
         0.0f, -1.0f,  0.0f,
         1.0f,  1.0f,  1.0f,
        -1.0f,  1.0f,  1.0f,
         0.0f, -1.0f,  0.0f,
        // back face
         0.0f, -1.0f, 0.0f,
        -1.0f,  1.0f, -1.0f,
         1.0f,  1.0f, -1.0f,
         0.0f, -1.0f, 0.0f,
        // right face
         0.0f, -1.0f, 0.0f,
         1.0f,  1.0f, -1.0f,
         1.0f,  1.0f,  1.0f,
         0.0f, -1.0f,  0.0f,
        // left face
         0.0f, -1.0f,  0.0f,
        -1.0f,  1.0f,  1.0f,
        -1.0f,  1.0f, -1.0f,
         0.0f, -1.0f, 0.0f,
        // top face
         1.0f,  1.0f,  1.0f,
         1.0f,  1.0f, -1.0f,
        -1.0f,  1.0f, -1.0f,
        -1.0f,  1.0f,  1.0f,
        // bottom face
         0.0f, -1.0f,  0.0f,
         0.0f, -1.0f,  0.0f,
         0.0f, -1.0f, 0.0f,
         0.0f, -1.0f, 0.0f, 
        };
    
        private static final float[] colors = {
        // front face (green)
        0.0f, 1.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
        // back face (red)
        1.0f, 0.0f, 0.0f,
        1.0f, 0.0f, 0.0f,
        1.0f, 0.0f, 0.0f,
        1.0f, 0.0f, 0.0f,
        // right face (yellow)
        1.0f, 1.0f, 0.0f,
        1.0f, 1.0f, 0.0f,
        1.0f, 1.0f, 0.0f,
        1.0f, 1.0f, 0.0f,
        // left face (magenta)
        1.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 1.0f,
        // top face  (blue)
        0.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 1.0f,
        // bottom face (cyan)
        0.0f, 1.0f, 1.0f,
        0.0f, 1.0f, 1.0f,
        0.0f, 1.0f, 1.0f,
        0.0f, 1.0f, 1.0f,
        };
    
        ColorPyramidDown() {
        super(24, QuadArray.COORDINATES | QuadArray.COLOR_3);
    
        setCoordinates(0, verts);
        setColors(0, colors);
        }
    }
    
  5. ウインドウ上でマウスをクリックしてみて下さい。
    クリックされたX座標によって、3種類のモデルが切り替わります。

プログラムの説明

  1. 基本的な説明は クリック座標で色を設定 を参照して下さい。
    モデルの表示/非表示を切り替えるときは Java3D API(Application Programming Interface) の Switch を使います。
    次の領域を大域領域で宣言して下さい。
        public class ChangeModel extends JFrame
        {   private Switch switchNode = null;
            private BitSet bitset = null;
        
  2. ChangeModel() の Constructor でマウスのクリックを検出して、描画するモデルを切り替えます。
    System.out.println() でマウスの座標を印字してみました。
    bitset.clear(i); でフラグをリセットして、bitset.set(e.getX()/100); で描画するモデルを計算します。
    switchNode.setChildMask(bitset); で描画するモデルを Switch に設定します。
    あとは何時もと同じです。
        // Constructor
        public ChangeModel()
        {   // JFrame の初期化
                ・・・
            // マウスイベントが通知される
            canvas.addMouseListener(new MouseAdapter()
            {   public void mouseClicked( MouseEvent e )
                {   System.out.println("Mouse Click" + "  X=" + e.getX() + "  Y=" + e.getY());
                    for (int i=0; i<3; i++) bitset.clear(i);
                    bitset.set(e.getX()/100);
                    switchNode.setChildMask(bitset);
                }
            });
        
  3. モデルを生成する CreateScene() メソッドです。
    SetMouse() メソッドでマウスでモデルを操作出来るように設定します。
    new BitSet(3); で BitSet を生成します。
    3は Switch にアップするモデルの数です。
    最初は0番のモデルが描画されるように設定しています。
    BitSet をパラメータにして Switch を生成します。
    Switch にアップされたモデルは setChildMask(bitset); で表示/非表示を切り替えることが出来ます。
    モデルをマウスで操作するので Switch を trans にアッドします。
        // モデルを生成
        private BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
    
            // Mouse 操作の設定
            TransformGroup trans = new TransformGroup();
            SetMouse(objRoot, trans);
            objRoot.addChild(trans);
    
            // 描画フラグの初期化
            bitset = new BitSet(3);
            for (int i=0; i<3; i++) bitset.clear(i);
            bitset.set(0);
    
            // switchNode の設定
            switchNode = new Switch(Switch.CHILD_MASK, bitset);
            switchNode.setCapability(Switch.ALLOW_SWITCH_READ);
            switchNode.setCapability(Switch.ALLOW_SWITCH_WRITE);
            switchNode.setChildMask(bitset);
            trans.addChild(switchNode);
        
  4. 先に掲載した Object Class を使って3種類のモデルを生成します。
    生成したモデルを Switch にアップします。
            QuadArray g[] = new QuadArray[3];
            Shape3D shape[] = new Shape3D[3];
    
            g[0] = new ColorPyramidUp();        // 正面水色4面体
            g[1] = new ColorCube();             // 正面赤色立方体
            g[2] = new ColorPyramidDown();      // 正面緑逆さ4面体
    
            // Switch にモデルをアップ
            Appearance a = new Appearance();
            for(int i=0; i<3;i++)
            {   shape[i] = new Shape3D(g[i],a); // Shape3D を生成
                switchNode.addChild(shape[i]);  // objTrans に追加
            }
        

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