ColorCube を自動的に回転する

Java3D Applet で ColorCube を自動的に回転しながら描画します。
Java3D でサンプルとして良く使われているプログラムです。

Java Applet の実行は、次のリンクをクリックして下さい。
アプレットを実行しようとするとセキュリティの警告画面が表示されますが、解除して下さい。
Hello Applet3D

Java 3D Applet が実行できない。
ジャバアプレットが動くか否かは、ユーザーサイド(パソコン側)の問題です。
現在の OS は Java の実行環境を含んでいるので、通常のアプレットが動くか否かはブラウザに依存します。
ところが、Java3D Applet を動かすには、ユーザーサイドで Java3D の実行環境を設定する必要があるようです。
Java3D をインストールしていない、もう一台の Vista(Explorer7) では動きませんでした。
Vista はもちろん WindowsXP でも Java3D をインストールすると動くようになりました。
Java3D のセットアップは Java3D のセットアップ を参照して下さい。

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

プログラムの作成

  1. メモ帳などでタイプして helloapplet3d の名前で保存して下さい。
    Applet はサーバーにアップロードすることが前提なので、ファイル名やクラス名を小文字で統一しています。
    //★ Applet で ColorCube を自動的に回転する    前田 稔
    import java.applet.Applet;
    import java.awt.BorderLayout;
    import java.awt.event.*;
    import java.awt.GraphicsConfiguration;
    import com.sun.j3d.utils.applet.MainFrame;
    import com.sun.j3d.utils.geometry.ColorCube;
    import com.sun.j3d.utils.universe.*;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    
    public class helloapplet3d extends Applet
    {   private SimpleUniverse universe = null;
    
        // main Method
        public static void main(String[] args)
        {   new MainFrame(new helloapplet3d(), 256, 256);  }
    
        // Constructor
        public helloapplet3d() {  }
    
        // 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 を生成
            BranchGroup scene = createSceneGraph();
            universe.addBranchGraph(scene);
        }
    
        // ColorCube を生成する
        public BranchGroup createSceneGraph()
        {   BranchGroup objRoot = new BranchGroup();
            TransformGroup objTrans = new TransformGroup();
            objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            objRoot.addChild(objTrans);
    
            // ColorCube を生成
            objTrans.addChild(new ColorCube(0.4));
    
            // モデルの回転設定
            Transform3D yAxis = new Transform3D();      // 回転軸
            Alpha rotationAlpha = new Alpha(-1, 4000);  // 繰り返し回数:無限  変化時間:4秒
            RotationInterpolator rotator =
                new RotationInterpolator(rotationAlpha, objTrans, yAxis, 0.0f, (float) Math.PI*2.0f);
            BoundingSphere bounds =
                new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
            rotator.setSchedulingBounds(bounds);
            objRoot.addChild(rotator);
    
            // BranchGroup の設定
            objRoot.compile();
            return objRoot;
        }
    
        // 終了処理
        public void destroy()
        {   universe.cleanup();  }
    }
    
  2. Java Applet を起動する helloapplet3d.htm です。
    <html>
    <body>
    <h3>Hello Applet3D</h3>
      <applet code="helloapplet3d" width="256" height="256">
      </applet>
    </body>
    </html>
    
  3. ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    Java Applet を使ったプログラムですが、コマンドラインから普通の Java と同様に実行することが出来ます。
    アプレットの実行は helloapplet3d.htm をダブルクリックして起動して下さい。
    アプレットを実行しようとするとセキュリティの警告画面が表示されますが、解除して下さい。
    ColorCube が回転しながら描画されたら完成です。
    j3d-examples-1_5_2-src.zip の中の \examples\hello_universe\ を参考にしました。

プログラムの説明

  1. アプレットのプログラムは Applet を継承しています。
    通常のライブラリと Java3D 用のライブラリを import します。
    ColorCube を使うので geometry.ColorCube を import します。
    SimpleUniverse は Java3D の標準的な描画環境を設定する領域です。
        import java.applet.Applet;
        import java.awt.BorderLayout;
        import java.awt.event.*;
        import java.awt.GraphicsConfiguration;
        import com.sun.j3d.utils.applet.MainFrame;
        import com.sun.j3d.utils.geometry.ColorCube;
        import com.sun.j3d.utils.universe.*;
        import javax.media.j3d.*;
        import javax.vecmath.*;
    
        public class helloapplet3d extends Applet
        {   private SimpleUniverse universe = null;
        
  2. main Method と Constructor は、普通の Java と同様に実行するときに必要です。
        public static void main(String[] args)
        {   new MainFrame(new helloapplet3d(), 256, 256);  }
    
        // Constructor
        public helloapplet3d() {  }
        
  3. Applet 初期化を行う init() メソッドです。
    GraphicsConfiguration を取得して Canvas3D を生成(インスタンス化)します。
    add("Center", canvas); でフレームに Canvas3D を追加します。
    createSceneGraph() で ColorCube を描画するシーンを生成します。
    SimpleUniverse(c) で、Java3D の標準的な描画環境を設定します。
    アプレットの標準的な setNominalViewingTransform を設定します。
    universe.addBranchGraph(scene); で SimpleUniverse に追加します。
        // 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 を生成
            BranchGroup scene = createSceneGraph();
            universe.addBranchGraph(scene);
        }
        
  4. ColorCube を描画するシーンを生成する createSceneGraph() です。
    BranchGroup を生成して、ここに描画するシーンを設定します。
    new TransformGroup() で座標変換を設定します。
    モデルを回転するので setCapability() で ALLOW_TRANSFORM_WRITE を許可して下さい。
    ColorCube() を生成して TransformGroup に追加します。
    次にモデルの回転を設定します。
    new Transform3D() で回転軸を設定します。
    既定値では、Y軸を中心に回転します。
    new Alpha(-1, 4000); で繰り返し回数と速度を設定します。
    繰り返し回数に -1 を設定すると無限に繰り返されます。
    4000 が速度で、4秒で一回転します。
    この値を大きくすると回転速度が遅くなり、小さくすると速くなります。
    RotationInterpolator() で繰り返し実行される回転情報を設定します。
    rotationAlpha が繰り返し回数と速度で、objTrans が回転対象で、yAxis が回転軸です。
    続く 0.0f, (float)Math.PI*2.0f が回転角度の最小(0度)と最大(360度)です。
    BoundingSphere で RotationInterpolator の及ぶ範囲を設定して BranchGroup に追加します。
        // ColorCube を生成する
        public BranchGroup createSceneGraph()
        {   BranchGroup objRoot = new BranchGroup();
            TransformGroup objTrans = new TransformGroup();
            objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            objRoot.addChild(objTrans);
    
            // ColorCube を生成
            objTrans.addChild(new ColorCube(0.4));
    
            // モデルの回転設定
            Transform3D yAxis = new Transform3D();      // 回転軸
            Alpha rotationAlpha = new Alpha(-1, 4000);  // 繰り返し回数:無限  変化時間:4秒
            RotationInterpolator rotator =
                new RotationInterpolator(rotationAlpha, objTrans, yAxis, 0.0f, (float) Math.PI*2.0f);
            BoundingSphere bounds =
                new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
            rotator.setSchedulingBounds(bounds);
            objRoot.addChild(rotator);
    
            // BranchGroup の設定
            objRoot.compile();
            return objRoot;
        }
        
  5. 後始末をする destroy() メソッドです。
        // 終了処理
        public void destroy()
        {   u.cleanup();  }
        

【NOTE】

「Internet Explorer で Java3D が動かないときは HtmlConverter.exe を使って HTML ファイルをコンバートして下さい」の記述をみつけました。
どうやらこれは Internet Explorer のバージョンが古いときの話らしく、Internet Explorer7 以降は必要無いようです。

Java Game Program