XNAStudy/3Dモデルの表示

Last-modified: 2006-12-15 (金) 16:04:11
  • プロジェクトを新規作成する。Windowsゲームなので「Windows Game」プロジェクトを選択。
    これに手を入れて作っていく。
  • プロジェクトにモデルデータとそれに貼り付けるテクスチャデータを追加する
    • ソリューションエクスプローラーからプロジェクト名を右クリック「追加→新しいフォルダ」を選択
    • 新規に作ったフォルダ名を「Contents」に変更
    • Contentsフォルダを右クリック「追加→新しいフォルダ」を選択
    • 新規に作ったフォルダ名を「Models」に変更
    • 同様にContentsフォルダ内に「Textures」フォルダを作成
    • Modelsフォルダを右クリック「追加→既存項目の追加」を選択し、表示させるモデルデータを選択
    • 同様にモデルで使うテクスチャをTextureフォルダに追加
    • 追加したモデルデータを右クリック「プロパティ」を選択
    • 「出力ディレクトリにコピー」という項目を「常にコピー」に変更
    • テクスチャデータも同様に行う
  • 変数の作成
    • 以下の変数を作成する
         Model MyModel;                            // モデルデータを格納する変数
         Vector3 modelPosition = Vector3.Zero;     // モデル描画位置(初期位置(0.0f, 0.0f, 0.0f))
         Vector3 cameraPosition = new Vector3( 0.0f, 50.0f, 5000.0f );     // カメラ位置(初期位置(0.0f, 50.0f, 5000.0f))
         float aspectRatio  = 640.0f / 480.0f;     // アスペクト比
  • モデルデータを読み込む
    • クラス内に存在する「protected override void LoadGraphicsContent( bool loadAllContent )」に以下のように記述
         MyModel = content.Load<Model>("モデルデータファイル名");
  • content変数はプロジェクトを作成した際に既にクラス内に定義されているはず。
  • 3Dモデルの描画
    • クラス内に存在する「protected override void Draw( GameTime gameTime )」関数の中
      「graphics.GraphicsDevice.Clear( Color.CornflowerBlue );」以下に次の記述をする。
         Matrix[] transforms = new Matrix[ MyModel.Bones.Count ];   // モデルのボーンの数だけマトリクスを作る?(未確認)
         MyModel.CopyAbsoluteBoneTransformsTo(transforms);          // モデルのボーンごとのマトリクスをコピーする?(未確認)
         foreach( ModelMesh mesh in MyModel.Meshes )        // 読み込んだモデルから順番にメッシュ情報を引き出す。
         {
              foreach( BasicEffect effect in mesh.Effects )         // メッシュの効果情報を順番に引き出す
              {
                   // 分割されたメッシュ毎にステータスを設定
                   // デフォルトのライティングを行う
                   effect.EnableDefaultLighting();
                   // ワールドマトリクス設定
                   effect.World = transforms[ mesh.ParentBone.Index ];
                   // ビューマトリクス設定
                   effect.View = Matrix.CreateLookAt(cameraPosition, Vector3.Zero, Vector3.Up );
                   // プロジェクションマトリクス設定
                   effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), aspectRatio, 1.0f, 10000.0f);
              }
              mesh.Draw();    // メッシュ描画
         }
  • 実行すると3Dモデルが表示されるはず。

解説

  • foreach構文
    • C#の構文
      foreach( 変数 in コレクション )
      順番にコレクションから変数へ値を渡していく。
  • Modelクラス
    モデルの情報を保持
    • メンバ
      • ModelMeshCollection Meshes 複数のメッシュ情報
  • ModelMeshCollectionクラス
    複数のメッシュ情報を持つ
  • ModelMeshクラス
    1つのメッシュ情報を保持
    • メンバ
      • ModelBone ParentBone 親ボーン
      • ModelEffectCollection Effects 複数の効果情報
      • void Draw(); 描画
  • ModelEffectCollectionクラス
    複数の効果情報を保持
  • BasicEffectクラス
    基本的な効果情報を保持
    • メンバ
      • Matrix World ワールド変換行列
      • Matrix View ビュー変換行列
      • Matrix Projection 射影変換行列
    • メソッド
      • void EnableDefaultLighting(); デフォルトライトの指定
  • ParentBornクラス
    親のボーン情報を持つ