ColorCube をマウスで操作します。

Applet でプログラムを体験できます。
立方体をマウスで操作する

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

プログラムの作成

  1. メモ帳などでタイプして Rot_Mouse.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.mouse.MouseRotate;
    import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
    import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
    
    public class Rot_Mouse extends JFrame
    {
        // main Method
        public static void main(String[] args)
        {   java.awt.EventQueue.invokeLater(new Runnable()
            {   public void run()
                {   new Rot_Mouse().setVisible(true);  }
            });
        }
    
        // Constructor
        public Rot_Mouse()
        {   // JFrame の初期化
            super("Mouse 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();
    
            // Model の修正を許可
            TransformGroup trans = new TransformGroup();
            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);
    
            // ColorCube を生成
            trans.addChild( new ColorCube(0.4) );
            objRoot.addChild(trans);
    
            return objRoot;
        }
    }
    
  2. ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    マウスの左ボタンを押しながらドラッグすると ColorCube が回転します。
    マウスの右ボタンを押しながらドラッグすると ColorCube が移動します。
    マウスの中央ボタンを押しながらドラッグすると ColorCube がズームイン・ズームアウトします。

プログラムの説明

  1. これまでのプログラムと同様に Swing を使って JFrame を継承しています。
    Java3D 用のライブラリを import します。
    ColorCube を使うので geometry.ColorCube を import します。
    マウスを使うので Mouse 関係のライブラリを 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.mouse.MouseRotate;
        import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
        import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
        
  2. main Method では Rot_Mouse Class をインスタンス化するだけなのですが、Runnable が使われています。
    Sun から提供されたサンプルが Runnable を使っているので、尊重することにします。 ヽ(^^ )
        public class Rot_Mouse extends JFrame
        {
            // main Method
            public static void main(String[] args)
            {   java.awt.EventQueue.invokeLater(new Runnable()
                {   public void run()
                    {   new Rot_Mouse().setVisible(true);  }
                });
            }
        
    試しに従来と同じようにプログラムしても、動くことを確認しました。 (^_^;)
        public static void main(String[] args)
        {   new Rot_Mouse();  }
    
        // Constructor
        public Rot_Mouse()
        {   ・・・
    
            setVisible(true);
        }
        
  3. Rot_Mouse Class の Constructor です。
    これまのプログラムと同様に JFrame の初期設定を行います。
    次に Java3D の初期化です。
    GraphicsConfiguration を取得して Canvas3D を生成(インスタンス化)します。
    add(canvas); で JFrame に Canvas3D を追加します。
    SimpleUniverse(canvas) で、Java3D の標準的な描画環境を設定します。
    CreateScene() メソッドで ColorCube を生成して、SimpleUniverse に追加します。
        // Constructor
        public Rot_Mouse()
        {   // JFrame の初期化
            super("Mouse 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 を生成して、ここに描画するシーンを設定します。
    new TransformGroup() で座標変換を設定します。
    立方体を回転するので setCapability() で ALLOW_TRANSFORM_READ と ALLOW_TRANSFORM_WRITE を許可して下さい。
    BoundingSphere でマウス操作の及ぶ範囲を設定します。
    モデルの回転を設定します。
    モデルの移動を設定します。
    モデルのズームを設定します。
    後は何も書かなくても、これだけでマウスでモデルを操作できるようになります。
    SetMouse() メソッドにまとめる方法は OBJ モデルを描画 を参照して下さい。
    ColorCube() を生成して BranchGroup に追加します。
        // Scene の生成
        public BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
    
            // Model の修正を許可
            TransformGroup trans = new TransformGroup();
            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);
    
            // ColorCube を生成
            trans.addChild( new ColorCube(0.4) );
            objRoot.addChild(trans);
    
            return objRoot;
        }
        

カメラをマウスで操作

  1. モデルと同じようにマウスでカメラを操作してみましょう。
    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 を取得します。
    viewtrans に対して、MouseRotate, MouseTranslate, MouseZoom を設定します。
    これでカメラをマウスで操作できるようになります。
        // Scene の生成
        public BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
            BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);
    
            // ViewingPlatform を取得
            TransformGroup viewtrans = universe.getViewingPlatform().getViewPlatformTransform();
    
            // 回転を設定
            MouseRotate rotator = new MouseRotate(viewtrans);
            rotator.setSchedulingBounds(bounds);
            objRoot.addChild(rotator);
    
            // 移動を設定
            MouseTranslate translator = new MouseTranslate(viewtrans);
            translator.setSchedulingBounds(bounds);
            objRoot.addChild(translator);
    
            // ズームを設定
            MouseZoom zoomer = new MouseZoom(viewtrans);
            zoomer.setSchedulingBounds(bounds);
            objRoot.addChild(zoomer);
    
            // ColorCube を生成
            objRoot.addChild(new ColorCube(0.4));
    
            return objRoot;
        }
        
  3. 最初は ColorCube の正面(赤い矩形)が描画されています。
    マウスを右ボタンでドラッグしてカメラを移動して下さい。
    次に ColorCube が中央にくるように左ボタンでドラッグしてカメラの向きを変えて下さい。
    数回繰り返すと ColorCube の他の面が見えてきます。
    また、回転と移動とズームを組み合わせると裏面も見えるようになります。

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