OBJ モデルを描画

Wavefront で作成した OBJ ファイルを入力して3Dモデルを描画します。

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

プログラムの作成

  1. メモ帳などでタイプして View_Obj.java の名前で保存して下さい。
    //★ galleon.obj をサイズ調整して描画する    前田 稔
    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;
    
    public class View_Obj extends JFrame
    {
        // main Method
        public static void main(String[] args)
        {   java.awt.EventQueue.invokeLater(new Runnable()
            {   public void run()
                {   new View_Obj().setVisible(true);  }
            });
        }
    
        // Constructor
        public View_Obj()
        {   // JFrame の初期化
            super("OBJ Model");
            setSize(512,512);
            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();
    
            // 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);
    
            // モデルの入力
            ObjectFile f = new ObjectFile(ObjectFile.RESIZE);
            Scene s = null;
            try
            {   s = f.load("C:\\TMP\\j3d-examples\\src\\resources\\geometry\\galleon.obj");  }
            catch(FileNotFoundException e)
            {   System.err.println(e);
                System.exit(1);
            }
            catch(ParsingErrorException e)
            {   System.err.println(e);
                System.exit(1);
            }
            catch(IncorrectFormatException e)
            {   System.err.println(e);
                System.exit(1);
            }
    
            objRoot.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;
        }
    }
    
  2. j3d-examples-1_5_2-src.zip(Java3D のセットアップ)を解凍して C:\TMP に格納して下さい。
    "C:\\TMP\\j3d-examples\\src\\resources\\geometry\\galleon.obj" が入力する OBJ ファイルです。
    帆船のモデルが描画されたら完成です。
    ネットからダウンロードした OBJ ファイルも描画することが出来ます。

プログラムの説明

  1. このプログラムは Java3D のサンプル(j3d-examples-1_5_2-src.zip)に格納されている OBJ モデルを描画しています。
    またサンプルの中の \examples\objload\ を参考に作成しました。
    OBJ をロードするので import 文に多少の違いはありますが「マウスで操作する」と同じ要領です。
    基本的な説明は マウスで操作する を参照して下さい。
  2. モデルをロードしてシーンを生成する CreateScene() メソッドです。
    BranchGroup を生成して、ここに描画するシーンを設定します。
    モデルを照らすために平行光源を設定します。
    new ObjectFile(ObjectFile.RESIZE); でローダーを生成します。
    ObjectFile.RESIZE はモデルの大きさを標準サイズに拡大・縮小する指定です。
    new ObjectFile(); で実行して、その効果を確かめて下さい。
    s = f.load() で OBJ モデルをロードします。
    背景色が真っ黒では見栄えが悪いので、ちょっと変えてみました。
        // Scene の生成
        public BranchGroup CreateScene()
        {   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);
    
            // モデルの入力
            ObjectFile f = new ObjectFile(ObjectFile.RESIZE);   // サイズを調整
            //ObjectFile f = new ObjectFile();                  // そのままのサイズ
            Scene s = null;
            try
            {   s = f.load("C:\\TMP\\j3d-examples\\src\\resources\\geometry\\galleon.obj");  }
            catch(FileNotFoundException e)
            {   System.err.println(e);
                System.exit(1);
            }
            catch(ParsingErrorException e)
            {   System.err.println(e);
                System.exit(1);
            }
            catch(IncorrectFormatException e)
            {   System.err.println(e);
                System.exit(1);
            }
    
            objScale.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;
        }
        
  3. サンプル(j3d-examples-1_5_2-src.zip)に格納されている他のモデルも描画してみましょう。
    順番に試してみて下さい。
            {   s = f.load("C:\\TMP\\j3d-examples\\src\\resources\\geometry\\galleon.obj");  }
            {   s = f.load("C:\\TMP\\j3d-examples\\src\\resources\\geometry\\beethoven.obj");  }
            {   s = f.load("C:\\TMP\\j3d-examples\\src\\resources\\geometry\\p51_mustang.obj");  }
        

マウスで操作

  1. 今度は OBJ モデルをマウスで操作してみましょう。
    OBJ をロードしてマウス操作で「回転/移動/ズームイン・アウト」するので、import 文を追加して下さい。
        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.*;
        
  2. main Method と Constructor は前回と同じ要領です。
    モデルをロードしてシーンを生成する CreateScene() メソッドに、マウス操作のメソッドを組み込みます。
        // Scene の生成
        public BranchGroup CreateScene()
        {   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
            {   s = f.load("C:\\TMP\\j3d-examples\\src\\resources\\geometry\\galleon.obj");  }
            catch(FileNotFoundException e)
            {   System.err.println(e);
                System.exit(1);
            }
            catch(ParsingErrorException e)
            {   System.err.println(e);
                System.exit(1);
            }
            catch(IncorrectFormatException e)
            {   System.err.println(e);
                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;
        }
        
  3. マウスで操作するための 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);
       }
        

【NOTE】

  1. ネットから OBJ モデルをダウンロードして試してみて下さい。
    私も幾つかのモデルをダウンロードしましたが、一部を除いて描画することが出来ました。
    但し、描画は出来てもマテリアルやテクスチャの設定がおかしいかも知れません。
  2. ネットからフリーソフトの Hira3DViewer をダウンロードして描画してみました。
    Hira3DViewer で描画すると、乱数でモデルに色が設定されるようです。
    ロード(インポート)する度に色が変わるので試してみて下さい。
    但し、こちらはテクスチャの機能が備わっていないかも知れません。
    標準で「.3ds」「.dxf」「.gts」「.obj」「.stl」のプラグインが添付されています。

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