モデルを Switch で ON, OFF

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

Applet でプログラムを体験できます。
モデルを Switch で ON, OFF

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

プログラムの作成

  1. Checkbox をクリックすると、対応するモデルが「表示/非表示」に切り替わります。
    メモ帳などでタイプして SwitchTest.java の名前で保存して下さい。
    //★ 並べたモデルを Switch で ON, OFF
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.utils.geometry.*;
    
    public class SwitchTest extends JFrame
    {   private Switch switchNode = null;
        private BitSet bitset = null;
    
        // main Method
        public static void main(String[] args)
        {   new SwitchTest();  }
    
        // Constructor
        public SwitchTest()
        {   // JFrame の初期化
            super("Mouse Listener test");
            setSize(500,500);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            // 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);
            add(canvas, BorderLayout.CENTER);
    
            // SimpleUniverseを生成
            SimpleUniverse universe = new SimpleUniverse(canvas);
            universe.getViewingPlatform().setNominalViewingTransform();
    
            // Scene を生成
            BranchGroup scene = createSceneGraph();
            universe.addBranchGraph(scene);
            setVisible(true);
        }
    
        // 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 を生成して TransformGroup にアップ
            switchNode = new Switch(Switch.CHILD_MASK, bitset);
            switchNode.setCapability(Switch.ALLOW_SWITCH_READ);
            switchNode.setCapability(Switch.ALLOW_SWITCH_WRITE);
            trans.addChild(switchNode);
    
            // switchNode に Sphere(球)を登録した TransformGroup をアッド
            switchNode.addChild( createSphere(new Vector3d(-0.8,0.0,0.0), new Color3f(1.0f,0.0f,0.0f)));	// red
            switchNode.addChild( createSphere(new Vector3d(-0.4,0.0,0.0), new Color3f(1.0f,0.5f,0.0f)));	// orange
            switchNode.addChild( createSphere(new Vector3d(0.0,0.0,0.0),  new Color3f(1.0f,1.0f,0.0f)));	// yellow
            switchNode.addChild( createSphere(new Vector3d(0.4,0.0,0.0),  new Color3f(0.5f,1.0f,0.0f)));	// yellow green
            switchNode.addChild( createSphere(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(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(0.1f,Primitive.GENERATE_NORMALS,ap );
            trans.addChild(sphere);
            return trans;
        }
    }
    

プログラムの説明

  1. 基本的な説明は Java 3D で点を描画 を参照して下さい。
    表示/非表示を切り替えるときは Java3D API(Application Programming Interface) の Switch を使います。
    次の領域を大域領域で宣言して下さい。
        public class SwitchTest extends JFrame
        {   private Switch switchNode = null;
            private BitSet bitset = null;
        
  2. Constructor では Panel を生成して chkbox() メソッドで Checkbox を張り付けます。
        // Constructor
        public SwitchTest()
        {   // JFrame の初期化
            super("Mouse Listener test");
            setSize(500,500);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            // 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(ItemEvent e) で Checkbox のクリックを検出します。
    e.getStateChange() で Checkbox の状態を取得します。
    SELECTED, DESELECTED を調べて、bitset を set() または clear() に設定します。
        // 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 を生成して TransformGroup にアップ
            switchNode = new Switch(Switch.CHILD_MASK, bitset);
            switchNode.setCapability(Switch.ALLOW_SWITCH_READ);
            switchNode.setCapability(Switch.ALLOW_SWITCH_WRITE);
            trans.addChild(switchNode);
    
            // switchNode に Sphere(球)を登録した TransformGroup をアッド
            switchNode.addChild( createSphere(new Vector3d(-0.8,0.0,0.0), new Color3f(1.0f,0.0f,0.0f)));	// red
            switchNode.addChild( createSphere(new Vector3d(-0.4,0.0,0.0), new Color3f(1.0f,0.5f,0.0f)));	// orange
            switchNode.addChild( createSphere(new Vector3d(0.0,0.0,0.0),  new Color3f(1.0f,1.0f,0.0f)));	// yellow
            switchNode.addChild( createSphere(new Vector3d(0.4,0.0,0.0),  new Color3f(0.5f,1.0f,0.0f)));	// yellow green
            switchNode.addChild( createSphere(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(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(0.1f,Primitive.GENERATE_NORMALS,ap );
            trans.addChild(sphere);
            return trans;
        }
        

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