ColorCube をキーで操作します。

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

プログラムの作成

  1. メモ帳などでタイプして Rot_Key.java の名前で保存して下さい。
    //★ ColorCube をキーで操作する    前田 稔
    import java.awt.*;
    import javax.swing.*;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.utils.geometry.ColorCube;
    import com.sun.j3d.utils.behaviors.keyboard.*;
    
    public class Rot_Key extends JFrame
    {
        // main Method
        public static void main(String[] args)
        {   java.awt.EventQueue.invokeLater(new Runnable()
            {   public void run()
                {   new Rot_Key().setVisible(true);  }
            });
        }
    
        // Constructor
        public Rot_Key()
        {   // JFrame の初期化
            super("Key Rotate test");
            setSize(250,250);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            // Java3D 関係の設定
            GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
            Canvas3D canvas = new Canvas3D(config);
            add(canvas);
    
            // SimpleUniverse を生成
            SimpleUniverse universe = new SimpleUniverse(canvas);
            universe.getViewingPlatform().setNominalViewingTransform();
    
            // Scene を生成
            universe.addBranchGraph(CreateScene());
        }
    
        // Scene の生成
        public BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
            BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);
    
            // Model の修正を許可
            TransformGroup trans = new TransformGroup();
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    
            // KeyNavigatorBehavior の定義
            KeyNavigatorBehavior keybehavior = new KeyNavigatorBehavior(trans);
            keybehavior.setSchedulingBounds(bounds);
            objRoot.addChild(keybehavior);
    
            // ColorCube を生成
            trans.addChild( new ColorCube(0.4) );
            objRoot.addChild(trans);
    
            return objRoot;
        }
    }
    
  2. ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    上下のキーで ColorCube がズームイン・ズームアウトします。
    左右のキーで ColorCube が回転します。

プログラムの説明

  1. これまでのプログラムと同様に Swing を使って JFrame を継承しています。
    Java3D 用のライブラリを import します。
    ColorCube を使うので geometry.ColorCube を import します。
    キーを使うので keyboard 関係のライブラリを import します。
        import java.awt.*;
        import javax.swing.*;
        import javax.media.j3d.*;
        import javax.vecmath.*;
        import com.sun.j3d.utils.universe.*;
        import com.sun.j3d.utils.geometry.ColorCube;
        import com.sun.j3d.utils.behaviors.keyboard.*;
        
  2. main Method では Rot_Key Class をインスタンス化するだけなのですが、Runnable が使われています。
    Sun から提供されたサンプルが Runnable を使っているので、尊重することにします。 ヽ(^^ )
        public class Rot_Key extends JFrame
        {
            // main Method
            public static void main(String[] args)
            {   java.awt.EventQueue.invokeLater(new Runnable()
                {   public void run()
                    {   new Rot_Key().setVisible(true);  }
                });
            }
        
    試しに従来と同じようにプログラムしても、動くことを確認しました。 (^_^;)
        public static void main(String[] args)
        {   new Rot_Key();  }
    
        // Constructor
        public Rot_Key()
        {   ・・・
    
            setVisible(true);
        }
        
  3. Rot_Key Class の Constructor です。
    これまのプログラムと同様に JFrame の初期設定を行います。
    次に Java3D の初期化です。
    GraphicsConfiguration を取得して Canvas3D を生成(インスタンス化)します。
    add(canvas); で JFrame に Canvas3D を追加します。
    SimpleUniverse(canvas) で、Java3D の標準的な描画環境を設定します。
    CreateScene() メソッドで ColorCube を生成して、SimpleUniverse に追加します。
        // Constructor
        public Rot_Key()
        {   // JFrame の初期化
            super("Key Rotate test");
            setSize(250,250);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            // Java3D 関係の設定
            GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
            Canvas3D canvas = new Canvas3D(config);
            add(canvas);
    
            // SimpleUniverse を生成
            SimpleUniverse universe = new SimpleUniverse(canvas);
            universe.getViewingPlatform().setNominalViewingTransform();
    
            // Scene を生成
            universe.addBranchGraph(CreateScene());
        }
        
  4. ColorCube を生成する CreateScene() メソッドです。
    BranchGroup を生成して、ここに描画するシーンを設定します。
    BoundingSphere でキー操作の及ぶ範囲を設定します。
    new TransformGroup() で座標変換を設定します。
    立方体を回転するので setCapability() で ALLOW_TRANSFORM_READ と ALLOW_TRANSFORM_WRITE を許可して下さい。
    TransformGroup を引数にして KeyNavigatorBehavior を生成します。
    これで TransformGroup をキーで操作出来るようになります。
    ColorCube() を生成して BranchGroup に追加します。
        // Scene の生成
        public BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
            BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);
    
            // Model の修正を許可
            TransformGroup trans = new TransformGroup();
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    
            // KeyNavigatorBehavior の定義
            KeyNavigatorBehavior keybehavior = new KeyNavigatorBehavior(trans);
            keybehavior.setSchedulingBounds(bounds);
            objRoot.addChild(keybehavior);
    
            // ColorCube を生成
            trans.addChild( new ColorCube(0.4) );
            objRoot.addChild(trans);
    
            return objRoot;
        }
        

カメラをキーで操作

  1. KeyNavigatorBehavior でカメラをキーで操作してみましょう。
    SimpleUniverse を大域領域で宣言して下さい。
        public class Rot_KeyView extends JFrame
        {   private SimpleUniverse universe = null;
                ・・・
            //SimpleUniverse universe = new SimpleUniverse(canvas);
            universe = new SimpleUniverse(canvas);
        
  2. CreateScene() メソッドです。
    TransformGroup に universe の ViewingPlatform を取得して KeyNavigatorBehavior に登録します。
    これでカメラを矢印キーで操作できるようになります。
    ColorCube を正面から描画したのでは矩形にしか見えないので、傾けて配置します。
    上下の矢印キーで、カメラがズームイン・ズームアウトします。
    左右の矢印キーで、カメラの向きが変わります。
        // Scene の生成
        public BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
            BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);
    
            TransformGroup viewtrans = universe.getViewingPlatform().getViewPlatformTransform();
    
            // KeyNavigatorBehavior の定義
            KeyNavigatorBehavior keybehavior = new KeyNavigatorBehavior(viewtrans);
            keybehavior.setSchedulingBounds(bounds);
            PlatformGeometry vp = new PlatformGeometry();
            vp.addChild(keybehavior);
            universe.getViewingPlatform().setPlatformGeometry(vp);
    
            // 座標を回転して描画
            Transform3D t3d = new Transform3D();
            t3d.setRotation(new AxisAngle4d(0.2,0.3,-0.1,Math.PI/4.0));
    
            // Model の修正を許可
            TransformGroup trans = new TransformGroup(t3d);
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    
            // ColorCube を生成
            trans.addChild( new ColorCube(0.4) );
            objRoot.addChild(trans);
    
            return objRoot;
        }
        

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