2007年6月8日金曜日

3D ゲームチュートリアル(3)

前回の3D ゲームチュートリアル(2)に引き続き、作業を進めています。原文は英文なので、一度機械翻訳した結果を意訳しています。原文は以下にあります。Microsoft Visual C# 2005 Express Edition のヘルプにあります。

ms-help://MS.VSExpressCC.v80/MS.VSIPCC.v80/MS.XNAFX.1033/XNA/
Going_Beyond.htm



ステップ3:
コンテンツ・パイプラインを使用し、モデルをロードする
Game1.cs のコードを見てください; プロジェクトを開ければ、スクリーンにあります。既にいろいろな事が記述済みです。

LoadGraphicsContent メソッドを変更することから始めます。
ソリューションエクスプローラーで、Game1.cs ファイルをダブルクリックして、コードを開きます。


コードの中から、LoadGraphicsContent メソッドを見つけて、コードを以下のように変更してください:

C#

// 3Dモデル
Model myModel;

// アスペクト比は、3D を2D に投影するスケールを決定します.
float aspectRatio;

protected override void LoadGraphicsContent(bool loadAllContent)
{
    if  (loadAllContent)
    {
        myModel = content.Load
                    ( "Content
\\Models\\p1_wedge" );
    }
    aspectRatio = graphics.GraphicsDevice.Viewport.Width /
        graphics.GraphicsDevice.Viewport.Height;
}

LoadGraphicsContent がゲームの始めに呼ばれ、モデルをゲームにロードするようにContent Pipeline に宣言しました。どのように資産の名前を変えるかに関する詳しい情報を見るには、Game Asset Propertiesを見てください。
コードはモデルをロードします。次のステップはそれをスクリーンに表示させることです。


ステップ4:
スクリーンにモデルを表示し、回転させる

Game1.cs ファイルの中の2つのメソッドを変更します。
Draw メソッド:
 テクスチャと照明付モデルをスクリーンに描画します。
Update メソッド:
 モデルの向きを時間変化(回転)させます。

最初に、より困難な仕事をしてください:  モデルの描画
第一歩はモデルの位置と照明をセットアップするいくつかのXNA Framework メソッドを使用します。コード中で、Draw メソッドを見つけて、コードを以下のように変更してください:

C#

// ワールド座標における、モデルの位置と回転を設定します。
Vector3 modelPosition = Vector3.Zero;
float modelRotation = 0.0f;

// 視点行列のために、ワールド座標におけるカメラ位置を
// 設定します。
Vector3 cameraPosition = new Vector3( 0.0f, 50.0f, 5000.0f );

protected override void Draw( GameTime gameTime )
{
  graphics.GraphicsDevice.Clear( Color.CornflowerBlue );

  // Copy any parent transforms.
  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]
        * Matrix.CreateRotationY(modelRotation)
        * Matrix.CreateTranslation( modelPosition );
      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 数学と照明を設定するXNA Framework によって提供されたアシスタント方法を使用します。

ワールド座標におけるモデル位置を変化させるために、ワールド行列を使用します。カメラの位置と向きを変化させるために、ビュー行列を使用します。3D ワールドが画面の2D 画像にどのように変換(射影)されるかを決めるために、射影行列を使用します。

ワールド行列のセットアップの際に、CopyAbsoluteBoneTransformsTo の呼び出しとそれに関連するコードは、厳密にこのモデルでは必要ありません。しかし、階層構造(メッシュ位置、回転が「ボーン」で制御されている構造)を持つような、より複雑なモデルを使用する際には、このコードは、どんなメッシュも最初にボーンにより変換されることを確実にします。そして、メッシュはボーンの変換に比例して変化します。

コードをコンパイルし実行させると、モデルがスクリーンに現れます! 詳細なテクスチャの宇宙船です。




●コードにおいて、Update メソッドを見つけてください。
●以下のように、 コードを修正してください。

C#

protected override void Update( GameTime gameTime )
{
  if (GamePad.GetState ( PlayerIndex.One ).Buttons.Back ==
                          ButtonState.Pressed )
    this.Exit();

  modelRotation +=
      (float)gameTime.ElapseGameTime.TotalMilliseconds *
      MathHelper.ToRadians(0.1f);

  base.Update( gameTime );
}

「F5」キーを打つか、Debug メニューをクリックして、または次に、Start Debugging をクリックすることによって、プロジェクトをコンパイル、ランしてください。

おめでとうございます!
あなたは成し遂げました。ゲーム制作にはいろいろな事がありますが、あなたは第一歩を踏み出しました。 リアルタイムの照明と動きを伴う3D モデル。 ここから始めるゲーム制作の可能性に限界はありません。

簡単さのために、より良い性能のために最適化することができるいくつかの近道がありました。明白は改良は、ビュー射影の行列を事前計算することです。いまは、アップデート毎に計算していますが、その値は変化しません。第一歩としてこの最適化を十分に試してください。ゲームをインタラクティブにする準備ができたならば、次のチュートリアルに行ってください。

次…
チュートリアル2:  コントローラ入力によりモデルを動かす。

広がるアイデア
プロジェクトを少し、へたにいじくり回す衝動がありますか?
これらのアイデアを試みてください。
Draw 呼び出しにおける照明パラメタを変更してください。
  変更するためには、BasicEffect を参照してください。
青い背景の代わりに、背景に画像を加えてみてください。
 ガイダンスを参照してください:How to:スクロールするバックグラウンドを作る。 ヒント:layerDepth パラメタを指定するSpriteBatch.Draw を必ず使用してください、そして、その深さを1.0f に設定してください。

完全ソース(Game1.cs)
原文を参照してください。

0 件のコメント: