自作の OBJ Loader を使って3Dモデルを自動的に回転しながら描画します。

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

プログラムの作成

  1. メモ帳などでタイプして View_Auto.java の名前で保存して下さい。
    //★ OBJ Model Viewer Sample    前田 稔
    import java.awt.*;
    import javax.swing.*;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.loaders.*;
    import com.sun.j3d.utils.behaviors.mouse.*;
    
    public class View_Auto extends JFrame
    {   static String  Model_name= "C:\\TMP\\mikuAB_obj\\mikuA.obj";
    
        // main Method
        public static void main(String[] args)
        {   java.awt.EventQueue.invokeLater(new Runnable()
            {   public void run()
                {   new View_Auto().setVisible(true);  }
            });
        }
    
        // Constructor
        public View_Auto()
        {   // 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);
    
            // 座標変換の設定
            TransformGroup objTrans = new TransformGroup();
            objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            objRoot.addChild(objTrans);
    
            // モデルの入力
            obj_loader f = new obj_loader(obj_loader.RESIZE);
            Scene s = null;
            s = f.load(Model_name);
            objTrans.addChild(s.getSceneGroup());
    
            // モデルの回転設定
            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);
            rotator.setSchedulingBounds(bounds);
            objRoot.addChild(rotator);
    
            // 背景色の設定
            Color3f bgColor = new Color3f(0.25f, 0.3f, 0.25f);
            Background bgNode = new Background(bgColor);
            bgNode.setApplicationBounds(bounds);
            objRoot.addChild(bgNode);
            return objRoot;
        }
    }
    
  2. 次のソースコードがモデルデータの定義です。
    Model_name= "C:\\TMP\\mikuAB_obj\\mikuA.obj";
    mikuA.obj のモデルは、次のサイトからダウンロードすることが出来ます。
    初音ミク素体 モデルデータ
    ファイル 説明
    mikuA.obj 初音ミク OBJ モデル
    mikuA.mtl マテリアルファイル
    miku.png テクスチャ画像
    body.png テクスチャ画像
  3. OBJ モデルのローダー(obj_loader.java) を取得して、プロジェクトのフォルダーに格納して下さい。
    obj_loader.java は OBJ Loader α版 から取得して下さい。
    初音ミクが回転しながら描画されたら完成です。

プログラムの説明

  1. このプログラムは、自作の OBJ Loader を使って描画しています。
    モデルを自動的に回転しながら描画するプログラムは ColorCube の自動回転 を参照して下さい。
  2. モデルをロードしてシーンを生成する CreateScene() メソッドです。
    BranchGroup を生成して、ここに描画するシーンを設定します。
    モデルを自動的に回転するために TransformGroup を生成します。
    new obj_loader(obj_loader.RESIZE); で OBJ モデルのローダーを生成します。
    obj_loader.RESIZE はモデルの大きさを標準サイズに拡大・縮小する指定です。
    s = f.load(Model_name); で OBJ モデルをロードします。
        // Scene の生成
        public BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
                ・・・
    
            // 座標変換の設定
            TransformGroup objTrans = new TransformGroup();
            objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            objRoot.addChild(objTrans);
    
            // モデルの入力
            obj_loader f = new obj_loader(obj_loader.RESIZE);
            Scene s = null;
            s = f.load(Model_name);
            objTrans.addChild(s.getSceneGroup());
        
  3. Model_name の領域はプログラムの最初の方で次のように定義されています。
    Model_name= "C:\\TMP\\mikuAB_obj\\mikuA.obj";
    モデルの名前や格納されているフォルダーが異なるときは、ここを修正して下さい。

OBJ Viewer の作成

  1. View_Auto.java をベースに、簡単な OBJ モデルを描画するビューアを作成します。
    プログラムの修正は簡単です。
  2. View_Auto.java をコピーして、OBJview.java を作成して下さい。
    ファイル名の変更に伴い、class View_Auto を class OBJview に修正して下さい。
  3. OBJview.java の main() メソッドで、Command Line から指定された OBJ FILE の名前を取得します。
    public class OBJview extends JFrame
    {   static String  Model_name= "C:\\DATA\\OBJ\\mikuA.obj";
    
        // main Method
        public static void main(String[] args)
        {
           if (args.length>0)   Model_name= args[0];
           java.awt.EventQueue.invokeLater(new Runnable()
            {   public void run()
                {   new OBJview().setVisible(true);  }
            });
        }
    
  4. コンパイルして Class ファイルを作成して下さい。
    そのまま実行すると mikuA.obj が描画されます。
    これだけで OBJ Viewer の完成です。
  5. OBJ Viewer の起動方法です。
    コンパイルで作成された Class FILE を、OBJ モデルと同じフォルダー(例えば C:\DATA\OBJ)に格納して下さい。
    ・obj_loader.class
    ・OBJview.class
    ・OBJview$1.class
    コマンドプロンプトを立ち上げて C:\DATA\OBJ に移動します。
    OBJview を起動するコマンドの例です。
    C:\DATA\OBJ>java OBJview       //既定値で mikuA.obj が描画される
    C:\DATA\OBJ>java OBJview  mikuA.obj
    C:\DATA\OBJ>java OBJview  ak47.obj
    C:\DATA\OBJ>java OBJview  cup.obj
    
  6. OBJ モデルとは別のフォルダー(例えば C:\Bin)に置いて、起動することも出来ます。
    コマンドプロンプトを立ち上げて C:\Bin に移動します。
    C:\Bin>java OBJview
    C:\Bin>java OBJview "c:\data\obj\mikuA.obj"
    C:\Bin>java OBJview "c:\data\obj\ak47.obj"
    
  7. X-FILE の Viewer は Mview を作成する を参照して下さい。
    DXUT メッシュ の Viewer は sdkmesh の Viewer を作成 を参照して下さい。
    OBJ モデルの Viewer は 自作の OBJ Loader を使う を参照して下さい。

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