立方体をマウスで操作する

頂点 index を使って線で描画した立方体をマウスで操作します。

Java Applet の実行は、次のリンクをクリックして下さい。
立方体をマウスで操作

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

プログラムの作成

  1. メモ帳などでタイプして applet_index.java の名前で保存して下さい。
    //★ 頂点 index を使って線で描画した立方体をマウスで操作    前田 稔
    import java.applet.Applet;
    import java.awt.*;
    import javax.swing.*;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.utils.applet.MainFrame;
    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 applet_index extends Applet
    {   private SimpleUniverse universe = null;
    
        // main Method
        public static void main(String[] args)
        {   new MainFrame(new applet_index(), 300, 300);  }
    
        // Constructor
        public applet_index()  { }
    
        // Applet 初期化
        public void init()
        {   setLayout(new BorderLayout());
    
            // Java3D 関係の設定
            GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
            Canvas3D canvas = new Canvas3D(config);
            add("Center", canvas);
    
            // SimpleUniverseを生成
            universe = new SimpleUniverse(canvas);
            universe.getViewingPlatform().setNominalViewingTransform();
    
            // Scene を生成
            universe.addBranchGraph(createSceneGraph());
        }
    
        // 立方体の線を生成
        private BranchGroup createSceneGraph()
        {   BranchGroup objRoot = new BranchGroup();
    
            Point3d[] vertices =
            {  new Point3d(-0.5, 0.5, 0.5),  new Point3d(-0.5, -0.5, 0.5),
               new Point3d(0.5, -0.5, 0.5),  new Point3d(0.5, 0.5, 0.5),
               new Point3d(-0.5, 0.5, -0.5), new Point3d(-0.5, -0.5, -0.5),
               new Point3d(0.5, -0.5, -0.5), new Point3d(0.5, 0.5, -0.5)  };
    
            int[] indices = { 0, 1,  1, 2,  2, 3,  3, 0,
                              0, 4,  1, 5,  2, 6,  3, 7,
                              4, 5,  5, 6,  6, 7,  7, 4 };
    
            // 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);
    
            // 立方体の線を生成
            IndexedLineArray geometry =
              new IndexedLineArray(vertices.length, GeometryArray.COORDINATES, indices.length);
            geometry.setCoordinates(0, vertices);
            geometry.setCoordinateIndices(0, indices);
    
            Shape3D shape = new Shape3D(geometry);
            trans.addChild(shape);
            objRoot.addChild(trans);
    
            return objRoot;
        }
    
        // 終了処理
        public void destroy()
        {   universe.cleanup();  }
    }
    
  2. Java Applet を起動する HTMLファイルです。
    <html>
    <body>
    <h3>線で描画した立方体をマウスで操作</h3>
      <applet code="applet_pentagon" width="300" height="300">
      </applet>
    </body>
    </html>
    
  3. ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    Java Applet を使ったプログラムですが、コマンドラインから普通の Java と同様に実行することが出来ます。
    アプレットの実行は HTMLファイルをダブルクリックして起動して下さい。
    アプレットを実行しようとするとセキュリティの警告画面が表示されますが、解除して下さい。
     ・マウスの左ボタンを押しながらドラッグすると立方体が回転します。
     ・マウスの右ボタンを押しながらドラッグすると立方体が移動します。
     ・マウスの中央ボタンを押しながらドラッグすると立方体がズームイン・ズームアウトします。

プログラムの説明

  1. マウスを使うのでマウス関係のインポートが増えていますが createSceneGraph() メソッド以外は 「ColorCube を自動的に回転する」と同じ要領です。
    基本的な説明は ColorCube を自動的に回転する を参照して下さい。
  2. 12本の線で立方体を定義する createSceneGraph() メソッドです。
    BranchGroup を生成して、ここに描画するシーンを設定します。
    立方体の頂点座標は8個だけですが、立方体を線で定義するとなると頂点を結ぶ12本の線が必要です。
    線は2個の座標を持っているので「12本×2頂点=24」で24個の頂点座標を定義しなけれななりません。
    このようなときに威力を発揮するのが、頂点 Index です。
    具体的には、頂点座標の定義は8個だけで、12本の線の定義は頂点座標の番号(Index)を指定するのです。
    vertices[] で8個の頂点座標を定義します。
    立方体なので、Z座標が 0.5 と -0.5 に設定されていることに注目して下さい。
    indices[] で12本の線を Index で定義します。
    new TransformGroup() で座標変換を設定します。
    立方体を回転するので setCapability() で ALLOW_TRANSFORM_READ と ALLOW_TRANSFORM_WRITE を許可して下さい。
    BoundingSphere でマウス操作の及ぶ範囲を設定します。
    モデルの回転を設定します。
    モデルの移動を設定します。
    モデルのズームを設定します。
    後は何も書かなくても、これだけでマウスでモデルを操作できるようになります。
    new IndexedLineArray() で立方体を構成する線を生成して BranchGroup に追加します。
        // 立方体の線を生成
        private BranchGroup createSceneGraph()
        {   BranchGroup objRoot = new BranchGroup();
    
            Point3d[] vertices =
            {  new Point3d(-0.5, 0.5, 0.5),  new Point3d(-0.5, -0.5, 0.5),
               new Point3d(0.5, -0.5, 0.5),  new Point3d(0.5, 0.5, 0.5),
               new Point3d(-0.5, 0.5, -0.5), new Point3d(-0.5, -0.5, -0.5),
               new Point3d(0.5, -0.5, -0.5), new Point3d(0.5, 0.5, -0.5)  };
    
            int[] indices = { 0, 1,  1, 2,  2, 3,  3, 0,
                              0, 4,  1, 5,  2, 6,  3, 7,
                              4, 5,  5, 6,  6, 7,  7, 4 };
    
            // 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);
    
            // 立方体の線を生成
            IndexedLineArray geometry =
              new IndexedLineArray(vertices.length, GeometryArray.COORDINATES, indices.length);
            geometry.setCoordinates(0, vertices);
            geometry.setCoordinateIndices(0, indices);
    
            Shape3D shape = new Shape3D(geometry);
            trans.addChild(shape);
            objRoot.addChild(trans);
    
            return objRoot;
        }
        

Java Game Program