Xモデル(DirectX)を描画する

x_loader Alpha版を使って DirectX の XFILE(Xモデル)を描画します。 \(^o^)/
x_loader の説明は x_loader Alpha版 を参照して下さい。

XFILE の立方体モデルを描画するアプレットです。
素敵なモデルはネットで探して下さい。
XFILE(立方体)を描画

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

プログラムの作成

  1. メモ帳などでタイプして x_applet の名前で保存して下さい。
    //★ x_loader のテスト(Applet)    前田 稔
    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.Scene;
    import com.sun.j3d.utils.behaviors.mouse.*;
    import com.sun.j3d.utils.applet.MainFrame;
    import java.net.URL;
    
    public class x_applet extends Applet
    {   private SimpleUniverse universe;
    
        // main Method
        public static void main(String[] args)
        {   new MainFrame(new x_applet(), 300, 300);  }
    
        // Constructor
        public x_applet() {  }
    
        // 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(),"cube_c3.x"));
            setVisible(true);
        }
    
        // Scene の生成
        public BranchGroup createSceneGraph(URL 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);
    
            // モデルの入力
            x_loader f = new x_loader(x_loader.RESIZE);
            Scene s = null;
            try
            {   if (url!=null)
                {   URL u = new URL(url+file);
                    s = f.load(u);
                }
                else
                {   s = f.load(file);  }
            }
            catch(Exception e)
            {   e.printStackTrace();
                System.exit(1);
            }
    
            trans.addChild(s.getSceneGroup());
    
            // 背景色の設定
            Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
            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 を起動する x_applet.htm ファイルです。
    <html>
      <title>x_loader</title>
      <body>
        <h3>x_loader Test</h3>
        <hr>
        <applet code="x_applet" width="300" height="300">
        </applet>
      </body>
    </html>
    
  3. プロジェクトのフォルダーに次のファイルを格納して下さい。
    Applet ではローカルディスクにアクセス出来ないので、起動した URL からリソースを取得します。
    ファイル名 説明 掲載場所
    x_applet.java XFILE モデルを描画するメインプログラム このページに掲載
    x_applet.htm Java Applet を起動する HTMLファイル このページに掲載
    x_loader.java x_loader のソースファイル x_loader Alpha版
    cube_c3.x 立方体に3色を設定したXモデル このページに掲載
  4. ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    Java Applet を使ったプログラムですが、コマンドラインから普通の Java と同様に実行することが出来ます。
    アプレットの実行は HTMLファイルをダブルクリックして起動して下さい。
    アプレットを実行しようとするとセキュリティの警告画面が表示されますが、解除して下さい。
    立方体に3色の色を設定したXモデルが描画されたら完成です。 (●^o^●)
    マウスの操作でモデルを回転/移動/ズームイン・ズームアウトすることが出来ます。
  5. ネットからXファイルのモデルをダウンロードして描画してみて下さい。
    ページ先頭の画像は、六角大王のフリー版のモデルを XFILE に変換して描画しました。
    今なら結構沢山のモデルがネットから無料でダウンロード出来ます。 (^o^)/

プログラムの説明

  1. 基本的にプログラムは OBJ モデルを描画 と同じ要領です。
    起動した URL からリソースを取得するために createSceneGraph() にパラメータを設定します。
    getCodeBase() が URL で "cube_c3.x" が XFILE の名前です。
        // Applet 初期化
        public void init()
        {   setLayout(new BorderLayout());
                ・・・
    
            // Scene を生成
            universe.addBranchGraph(createSceneGraph(getCodeBase(),"cube_c3.x"));
            setVisible(true);
        }
        
  2. モデルをロードしてシーンを生成する createSceneGraph() メソッドです。
    new x_loader(x_loader.RESIZE); でローダーを生成します。
    パラメータに x_loader.RESIZE を指定するとモデルのサイズを標準の大きさに合わせてくれます。
    url が null のときは通常の方法(アプレットでは無い)で起動されたときです。
        // Scene の生成
        public BranchGroup createSceneGraph(URL url, String file)
        {   BranchGroup objRoot = new BranchGroup();
                ・・・
    
            // モデルの入力
            x_loader f = new x_loader(x_loader.RESIZE);
            Scene s = null;
            try
            {   if (url!=null)
                {   URL u = new URL(url+file);
                    s = f.load(u);
                }
                else
                {   s = f.load(file);  }
            }
            catch(Exception e)
            {   e.printStackTrace();
                System.exit(1);
            }
        

XFILE

  1. 立方体に3色を設定したテスト用のXファイル Cube_c3.x です。
    TEXT 形式なのでエディッタなどでタイプして保存して下さい。
    xof 0302txt 0064
    
    Header {
     1;
     0;
     1;
    }
    
    Material Matred {
     1.000000;0.000000;0.000000;1.000000;;
     21.333333;
     0.000000;0.000000;0.000000;;
     0.000000;0.000000;0.000000;;
    }
    Material Matgr {
     0.000000;0.866667;0.000000;1.000000;;
     21.333333;
     0.000000;0.000000;0.000000;;
     0.000000;0.000000;0.000000;;
    }
    Material Matbr {
     0.000000;0.000000;1.000000;1.000000;;
     21.333333;
     0.000000;0.000000;0.000000;;
     0.000000;0.000000;0.000000;;
    }
    Material Matwh {
     1.000000;1.000000;1.000000;1.000000;;
     21.333333;
     0.000000;0.000000;0.000000;;
     0.000000;0.000000;0.000000;;
    }
    Material Matye {
     1.000000;1.000000;0.000000;1.000000;;
     21.333333;
     0.000000;0.000000;0.000000;;
     0.000000;0.000000;0.000000;;
    }
    Material Matpi {
     1.000000;0.501961;1.000000;1.000000;;
     21.333333;
     0.000000;0.000000;0.000000;;
     0.000000;0.000000;0.000000;;
    }
    Mesh {
     8;
     1.0;-1.0;-1.0;,
     -1.0;-1.0;-1.0;,
     -1.0;1.0;-1.0;,
     1.0;1.0;-1.0;,
     -1.0;-1.0;1.0;,
     1.0;-1.0;1.0;,
     1.0;1.0;1.0;,
     -1.0;1.0;1.0;;
    
     6;
     4;0,1,2,3;,
     4;4,5,6,7;,
     4;5,0,3,6;,
     4;1,4,7,2;,
     4;1,0,5,4;,
     4;2,7,6,3;;
    
     MeshMaterialList {
      6;
      6;
      0,
      1,
      2,
      3,
      4,
      5;;
      {Matred}
      {Matred}
      {Matgr}
      {Matgr}
      {Matbr}
      {Matbr}
     }
     MeshNormals {
      6;
      0.000000;0.000000;-1.000000;,
      0.000000;0.000000;1.000000;,
      1.000000;0.000000;0.000000;,
      -1.000000;0.000000;0.000000;,
      0.000000;-1.000000;0.000000;,
      0.000000;1.000000;0.000000;;
    
      6;
      4;0,0,0,0;,
      4;1,1,1,1;,
      4;2,2,2,2;,
      4;3,3,3,3;,
      4;4,4,4,4;,
      4;5,5,5,5;;
     }
    }
    

Java Game Program