OBJ モデルを描画

Java Applet で Wavefront で作成した OBJ ファイルを描画します。
幾つかのモデルが j3d-examples-1_5_2-src.zip (Java3D のセットアップ)の中に格納されています。

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

プログラムの作成

  1. メモ帳などでタイプして applet_obj の名前で保存して下さい。
    //★ OBJファイルをマウスで操作する    前田 稔
    //   galleon.obj を格納して下さい。
    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.loaders.objectfile.ObjectFile;
    import com.sun.j3d.loaders.ParsingErrorException;
    import com.sun.j3d.loaders.IncorrectFormatException;
    import com.sun.j3d.loaders.Scene;
    import java.io.FileNotFoundException;
    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_obj extends Applet
    {   private SimpleUniverse universe;
    
        // 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(getCodeBase().toString(),"galleon.obj"));
        }
    
        // Scene の生成
        public BranchGroup createSceneGraph(String url, String file)
        {   BranchGroup objRoot = new BranchGroup();
    
            // Light の設定
            BoundingSphere bounds = new BoundingSphere(new Point3d(),100.0);
            DirectionalLight dlight =
              new DirectionalLight(true, new Color3f(1.0f,1.0f,1.0f), new Vector3f(0.3f,-0.3f,-0.3f));
            dlight.setInfluencingBounds(bounds);
            objRoot.addChild(dlight);
            AmbientLight alight = new AmbientLight();
            alight.setInfluencingBounds(bounds);
            objRoot.addChild(alight);
    
            // Mouse 操作の設定
            TransformGroup trans = new TransformGroup();
            SetMouse(objRoot, trans);
            objRoot.addChild(trans);
    
            // モデルの入力
            ObjectFile f = new ObjectFile(ObjectFile.RESIZE);
            Scene s = null;
    
            try
            {   java.net.URL u = new java.net.URL(url+file);
                s = f.load(u);
            }
            catch(Exception e)
            {   e.printStackTrace();
                System.exit(1);
            }
    
            trans.addChild(s.getSceneGroup());
    
            // 背景色の設定
            Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
            Background bgNode = new Background(bgColor);
            bgNode.setApplicationBounds(bounds);
            objRoot.addChild(bgNode);
            return objRoot;
        }
    
        // Mouse 操作の設定
        public void SetMouse(BranchGroup objRoot, TransformGroup trans)
        {
            // Model の修正を許可
            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);
       }
    
        // 終了処理
        public void destroy()
        {   universe.cleanup();  }
    }
    
  2. Java Applet を起動する applet_obj.htm ファイルです。
    <html>
      <title>Applet OBJ</title>
      <body>
        <h3>obj ファイルをマウスで操作する</h3>
        <hr>
        <applet code="applet_obj" width="300" height="300">
        </applet>
      </body>
    </html>
    
  3. プロジェクトのフォルダーに galleon.obj を格納して下さい。
    Applet ではローカルディスクにアクセス出来ないので、起動した URL からリソースを取得します。
    galleon.obj は j3d-examples-1_5_2-src.zip の中に格納されています。
    詳細は Java3D のプログラムを動かす を参照して下さい。
    ネットからダウンロードした OBJ ファイルも描画することが出来ます。
  4. ソースプログラムをコンパイルして下さい。
    main() メソッドが定義されていないので警告が出ますが、無視して下さい。
    ウインドウサイズを 300*300 ぐらいに設定して、Java Applet を起動する HTMLファイルを作成して下さい。
    アプレットの実行は HTMLファイルをダブルクリックして起動します。
    アプレットを実行しようとするとセキュリティの警告画面が表示されますが、解除して下さい。
    帆船のモデルが描画されたら完成です。
     ・マウスの左ボタンを押しながらドラッグするとモデルが回転します。
     ・マウスの右ボタンを押しながらドラッグするとモデルが移動します。
     ・マウスの中央ボタンを押しながらドラッグするとモデルがズームイン・ズームアウトします。

プログラムの説明

  1. OBJモデルは Wavefront で作成した3Dモデルです。
    Java3D のサンプルに格納されている galleon.obj をプロジェクトのフォルダーに格納して下さい。
    createSceneGraph() メソッドにパラメータを設定する以外は「ColorCube を自動的に回転する」と同じ要領です。
    基本的な説明は ColorCube を自動的に回転する を参照して下さい。
  2. 起動した URL からリソースを取得するために createSceneGraph() にパラメータを設定します。
    getCodeBase() が URL で "galleon.obj" が OBJ モデルの名前です。
        // Applet 初期化
        public void init()
        {   setLayout(new BorderLayout());
                ・・・
            // Scene を生成
            universe.addBranchGraph(createSceneGraph(getCodeBase().toString(),"galleon.obj"));
        }
        
  3. モデルをロードしてシーンを生成する createSceneGraph() メソッドです。
    BranchGroup を生成して、ここに描画するシーンを設定します。
    モデルを照らすために平行光源を設定します。
    モデルをそのまま描画するとサイズが大きすぎるので ObjectFile.RESIZE で縮小しています。
    モデルをマウスで操作するために SetMouse() メソッドを呼び出します。
    new ObjectFile() でローダーを生成して s = f.load() で OBJ モデルをロードします。
    背景色が真っ黒では見栄えが悪いので、ちょっと変えてみました。
        // Scene の生成
        public BranchGroup createSceneGraph(String url, String file)
        {   BranchGroup objRoot = new BranchGroup();
                ・・・
            // モデルの入力
            ObjectFile f = new ObjectFile(ObjectFile.RESIZE);
            Scene s = null;
    
            try
            {   java.net.URL u = new java.net.URL(url+file);
                s = f.load(u);
            }
            catch(Exception e)
            {   e.printStackTrace();
                System.exit(1);
            }
    
            trans.addChild(s.getSceneGroup());
    
            // 背景色の設定
            Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
            Background bgNode = new Background(bgColor);
            bgNode.setApplicationBounds(bounds);
            objRoot.addChild(bgNode);
            return objRoot;
        }
        
  4. マウスで操作するための SetMouse() メソッドです。
        // Mouse 操作の設定
        public void SetMouse(BranchGroup objRoot, TransformGroup trans)
        {
            // Model の修正を許可
            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);
        }
        
  5. Java3D のプログラムは「超初心者のJava入門」から OBJ モデルを描画 を参照して下さい。

Java Game Program