DirectX で使われている XFILE(3Dモデル)を自動的に回転しながら描画します。

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

プログラムの作成

  1. メモ帳などでタイプして View_Auto.java の名前で保存して下さい。
    //★ XFILE 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:\\DATA\\Model\\char.x";
    
        // 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);
    
            // モデルの入力
            x_loader f = new x_loader(x_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);
            //BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
            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. 次のソースコードがモデルデータ(XFILE)の定義です。
    static String Model_name= "C:\\DATA\\Model\\char.x";
    char.x は、六角大王のフリー版のモデルを XFILE に変換したものです。
    今なら沢山のモデルをネットから無料でダウンロードすることが出来ます。 (^o^)/
  3. XFILE には TEXT 形式と BINARY 形式のものがありますが、x_loader は非圧縮の TEXT 形式しかロード出来ません。
    XFILE の変換は 前田稔の超初心者のプログラム入門 から 「Game Program & Tool のダウンロード/Xファイルのバイナリ⇔テキスト変換」を参照して下さい。
    Xモデルのローダー(x_loader.java) を取得して、プロジェクトのフォルダーに格納して下さい。
    x_loader.java は X_Loader α版 から取得して下さい。
    Xモデルが回転しながら描画されたら完成です。

プログラムの説明

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

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