2011-09-15 10 views
1

モデルを画面に描画したい。ここに私のコードです:XNA 3Dグラフィックス - 私のコードの意味?

保護されたオーバーライド無効ドロー(GameTime gameTime) {

 GraphicsDevice.Clear(Color.CornflowerBlue); 

     // TODO: Add your drawing code here 
     Matrix[] transforms = new Matrix[model.Bones.Count]; 
     model.CopyAbsoluteBoneTransformsTo(transforms); 

     foreach (ModelMesh mesh in model.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(); 
     } 

     base.Draw(gameTime); 
    } 

しかし、私は削除する場合:

行列[]トランスフォーム=新しいMatrixを[ model.Bones.Count]; model.CopyAbsoluteBoneTransformsTo(transforms);ループ内

及び変更コード:

effect.World = Matrix.CreateRotationY(modelRotation)。

まだ正常です。だからなぜ私のプロジェクトに上記のコードを追加する必要がありますか?それの利点は何ですか?どうもありがとう!

答えて

1

主な違いは、変換部品が使用されている場合には、メカ部品変換を完全に制御できることです。単純なケースでは、追加の変換マトリックスを適用できません。

メッシュを回転させたり、人形のようにメカを回転させたりすることができます。

しかし、私はまだあなたのサンプルで、骨のインデックスを介してアクセスされた同一のマトリックスを知りません。あなたがコードでそれらを使って何かをするまで、それはまだ役に立たないように見えますが、1つの場所で毎回それを作成して、マルティスを適切に使用しないように見えます。

+0

これはMSDNページのサンプルコードです。だから私はそれを理解していない。ご回答有難うございます :) – beanhorstmann

0
effect.World = transforms[mesh.ParentBone.Index] * 
       Matrix.CreateRotationY(modelRotation) * 
       Matrix.CreateTranslation(modelPosition); 
  1. 、次にY軸( が画面上でスピンを有する)の周りに回転させる
  2. 、( 親骨が変形含む)変換をそれ自身によって各メッシュ骨を変換
  3. は、 ワールドスペースの別の場所に移動します。

ステップ1では単純なボックスか何かであり、ステップ2ではmodelPositionが0,0,0なので、実際にはどこにも移動されていないと推測しています。

modelPositionの値を変更すると、モデルが画面上を移動しますが、変更は反映されません。