モデルを Switch で ON, OFF

並べたモデルを Switch で ON, OFF します。

Java Applet の実行は、次のリンクをクリックして下さい。
モデルを Switch で ON, OFF

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

プログラムの作成

  1. メモ帳などでタイプして applet_switch.java の名前で保存して下さい。
    //★ 並べたモデルを Switch で ON, OFF
    import java.applet.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    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.geometry.Primitive;
    import com.sun.j3d.utils.geometry.Sphere;
    
    public class applet_switch extends Applet
    {   private SimpleUniverse universe = null;
        private Switch switchNode = null;
        private BitSet bitset = null;
    
        // main Method
        public static void main(String[] args)
        {   new MainFrame(new applet_switch(), 500, 500);  }
    
        // Constructor
        public applet_switch() {  }
    
        // Applet 初期化
        public void init()
        {   this.setLayout(new BorderLayout());
    
            // Panel に Checkbox を張り付ける
            Panel panel = new Panel();
            this.add(panel, BorderLayout.SOUTH);
            chkbox(panel, "Red", 0);
            chkbox(panel, "Orange", 1);
            chkbox(panel, "Yellow", 2);
            chkbox(panel, "Green", 3);
            chkbox(panel, "Blue-green", 4);
    
            // Java3D 関係の設定
            GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
            Canvas3D canvas = new Canvas3D(config);
            this.add(canvas, BorderLayout.CENTER);
    
            // SimpleUniverseを生成
            universe = new SimpleUniverse(canvas);
            universe.getViewingPlatform().setNominalViewingTransform();
    
            // Scene を生成
            BranchGroup scene = createSceneGraph();
            universe.addBranchGraph(scene);
        }
    
        // Checkbox Memthod
        private void chkbox(Panel panel, String str, final int num)
        {   Checkbox check = new Checkbox(str, true);
            check.addItemListener(new ItemListener()
            {   public void itemStateChanged(ItemEvent e)
                {   int state = e.getStateChange();
                    if (state == ItemEvent.SELECTED)
                    {   bitset.set(num);  }
                    else if (state == ItemEvent.DESELECTED)
                    {   bitset.clear(num);  }
                    switchNode.setChildMask(bitset);
                }
            });
            panel.add(check);
        }
    
        // Scene を生成
        private BranchGroup createSceneGraph()
        {   BranchGroup root = new BranchGroup();
            BoundingSphere bounds = new BoundingSphere( new Point3d(), 100.0 );
    
            // 光源の設定
            DirectionalLight light =
            new DirectionalLight(new Color3f(1.0f, 1.0f, 1.0f), new Vector3f(-0.57f, -0.57f, -0.57f));
            light.setInfluencingBounds(bounds);
            root.addChild(light);
            AmbientLight alight = new AmbientLight();
            alight.setInfluencingBounds(bounds);
            root.addChild(alight);
    
            // 変換行列の設定
            Transform3D t3d = new Transform3D();
            TransformGroup trans = new TransformGroup(t3d);
    
            // 描画フラグの初期化
            bitset = new BitSet(5);
            for (int i=0; i<5; i++) bitset.set(i);
    
            // switchNode の設定
            switchNode = new Switch(Switch.CHILD_MASK, bitset);
            switchNode.setCapability(Switch.ALLOW_SWITCH_READ);
            switchNode.setCapability(Switch.ALLOW_SWITCH_WRITE);
            trans.addChild(switchNode);
    
            // switchNode に Sphere をアッド
            switchNode.addChild( createSphere( 0.1f, new Vector3d(-0.8, 0.0, 0.0),
                new Color3f(1.0f, 0.0f, 0.0f) ) ); // red
            switchNode.addChild( createSphere( 0.1f, new Vector3d(-0.4, 0.0, 0.0),
                new Color3f(1.0f, 0.5f, 0.0f) ) ); // orange
            switchNode.addChild( createSphere( 0.1f, new Vector3d(0.0, 0.0, 0.0),
                new Color3f(1.0f, 1.0f, 0.0f) ) ); // yellow
            switchNode.addChild( createSphere( 0.1f, new Vector3d(0.4, 0.0, 0.0),
                new Color3f(0.5f, 1.0f, 0.0f) ) ); // yellow green
            switchNode.addChild( createSphere( 0.1f, new Vector3d(0.8, 0.0, 0.0),
                new Color3f(0.0f, 1.0f, 0.5f) ) ); // blue green
    
            root.addChild(trans);
            return root;
        }
    
        // Sphere を生成するメソッド
        private TransformGroup createSphere(float size, Vector3d pos, Color3f color)
        {   Transform3D t3d = new Transform3D();
            t3d.set(pos);
            TransformGroup trans = new TransformGroup(t3d);
            Appearance ap = new Appearance();
            Material mat = new Material();
            mat.setDiffuseColor(color);
            mat.setShininess(100.0f);
            ap.setMaterial(mat);
            Sphere sphere =
            new Sphere( size, Primitive.GENERATE_NORMALS, ap );
            trans.addChild(sphere);
            return trans;
        }
    
        // 終了処理
        public void destroy()
        {   universe.cleanup();  }
    }
    
  2. Java Applet を起動する HTMLファイルは、何時もと同じです。
    アプレットのサイズを 500*500 で設定して下さい。
    Checkbox をクリックすると、対応するモデルが「表示/非表示」に切り替わります。

プログラムの説明

  1. 基本的な説明は ColorCube を自動的に回転する を参照して下さい。
    表示/非表示を切り替えるときは Java3D API(Application Programming Interface) の Switch を使います。
    次の領域を大域領域で宣言して下さい。
        public class applet_switch extends Applet
        {   private SimpleUniverse universe = null;
            private Switch switchNode = null;
            private BitSet bitset = null;
        
  2. Applet 初期化では Panel を生成して chkbox() メソッドで Checkbox を張り付けます。
    あとは何時もと同じです。
        // Applet 初期化
        public void init()
        {   this.setLayout(new BorderLayout());
    
            // Panel に Checkbox を張り付ける
            Panel panel = new Panel();
            this.add(panel, BorderLayout.SOUTH);
            chkbox(panel, "Red", 0);
            chkbox(panel, "Orange", 1);
            chkbox(panel, "Yellow", 2);
            chkbox(panel, "Green", 3);
            chkbox(panel, "Blue-green", 4);
    
            // Java3D 関係の設定
                ・・・
        }
        
  3. Checkbox を張り付ける chkbox() メソッドです。
    itemStateChanged() で Checkbox の切替を検出します。
        // Checkbox Memthod
        private void chkbox(Panel panel, String str, final int num)
        {   Checkbox check = new Checkbox(str, true);
            check.addItemListener(new ItemListener()
            {   public void itemStateChanged(ItemEvent e)
                {   int state = e.getStateChange();
                    if (state == ItemEvent.SELECTED)
                    {   bitset.set(num);  }
                    else if (state == ItemEvent.DESELECTED)
                    {   bitset.clear(num);  }
                    switchNode.setChildMask(bitset);
                }
            });
            panel.add(check);
        }
        
  4. createSceneGraph() メソッドです。
    BitSet を生成して初期化して下さい。
    Switch を生成して ALLOW_SWITCH_READ と ALLOW_SWITCH_WRITE を許可します。
    Switch に createSphere() メソッドで、5個の Sphere(球)に色を設定してアッドします。
        // Scene を生成
        private BranchGroup createSceneGraph()
        {   BranchGroup root = new BranchGroup();
                ・・・
            // 描画フラグの初期化
            bitset = new BitSet(5);
            for (int i=0; i<5; i++) bitset.set(i);
    
            // switchNode の設定
            switchNode = new Switch(Switch.CHILD_MASK, bitset);
            switchNode.setCapability(Switch.ALLOW_SWITCH_READ);
            switchNode.setCapability(Switch.ALLOW_SWITCH_WRITE);
            trans.addChild(switchNode);
    
            // switchNode に Sphere をアッド
            switchNode.addChild( createSphere( 0.1f, new Vector3d(-0.8, 0.0, 0.0),
                new Color3f(1.0f, 0.0f, 0.0f) ) ); // red
            switchNode.addChild( createSphere( 0.1f, new Vector3d(-0.4, 0.0, 0.0),
                new Color3f(1.0f, 0.5f, 0.0f) ) ); // orange
            switchNode.addChild( createSphere( 0.1f, new Vector3d(0.0, 0.0, 0.0),
                new Color3f(1.0f, 1.0f, 0.0f) ) ); // yellow
            switchNode.addChild( createSphere( 0.1f, new Vector3d(0.4, 0.0, 0.0),
                new Color3f(0.5f, 1.0f, 0.0f) ) ); // yellow green
            switchNode.addChild( createSphere( 0.1f, new Vector3d(0.8, 0.0, 0.0),
                new Color3f(0.0f, 1.0f, 0.5f) ) ); // blue green
    
            root.addChild(trans);
            return root;
        }
        
  5. Sphere を生成する createSphere() メソッドです。
    setDiffuseColor() で色を設定して new Sphere() で球を生成します。
        // Sphere を生成するメソッド
        private TransformGroup createSphere(float size, Vector3d pos, Color3f color)
        {   Transform3D t3d = new Transform3D();
            t3d.set(pos);
            TransformGroup trans = new TransformGroup(t3d);
            Appearance ap = new Appearance();
            Material mat = new Material();
            mat.setDiffuseColor(color);
            mat.setShininess(100.0f);
            ap.setMaterial(mat);
            Sphere sphere = new Sphere( size, Primitive.GENERATE_NORMALS, ap );
            trans.addChild(sphere);
            return trans;
        }
        

Java Game Program