2012-04-11 4 views
0

ここでどこが間違っているのか誰にでも分かります。XNAで3の配列のうち1つのオブジェクトしか表示されない

モデルと位置を持つCameraObjectクラス(カメラではなく、単に「カメラ」を表すボックスのモデル)があります。また、通常のLoadContent()、Draw()およびUpdate()メソッドもあります。 しかし、モデルの配列を描画すると、画面上に1つのモデルしか表示されません(3つありますが、すべてが同じ場所にある可能性があります)。

public void Draw(Matrix view, Matrix projection) 
    { 
     transforms = new Matrix[CameraModel.Bones.Count]; 
     CameraModel.CopyAbsoluteBoneTransformsTo(transforms); 

     // Draw the model 
     foreach(ModelMesh myMesh in CameraModel.Meshes) 
     { 
      foreach (BasicEffect myEffect in myMesh.Effects) 
      { 
       myEffect.World = transforms[myMesh.ParentBone.Index]; 
       myEffect.View = view; 
       myEffect.Projection = projection; 

       myEffect.EnableDefaultLighting(); 
       myEffect.SpecularColor = new Vector3(0.25f); 
       myEffect.SpecularPower = 16; 
      } 
      myMesh.Draw(); 
     } 
    } 

はその後、私のGame1クラスで私はCameraObjectオブジェクトの配列を作成:

CameraModelクラスのdraw()メソッドは次のようになり、私は(初期化

CameraObject[] cameraObject = new CameraObject[3]; 

を) - 新しいオブジェクトは前のオブジェクトから+10になるはずです

for (int i = 0; i < cameraObject.Length; i++) 
     { 
      cameraObject[i] = new CameraObject(); 
      cameraObject[i].Position = new Vector3(i * 10, i * 10, i * 10); 
     } 

最後に描画します()

ビューと投影がそうのように見える私のカメラから()クラスです
Matrix view = camera.viewMatrix; 
Matrix projection = camera.projectionMatrix; 

for (int i = 0; i < cameraObject.Length; i++) 
{ 
    cameraObject[i].Draw(view, projection); 
} 

viewMatrix = Matrix.Identity; 
projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), 16/9, .5f, 500f); 

しかし、私は1つのだけオブジェクトを画面に描画され参照してください?私はコードを踏んで、すべてがうまくいくように見えますが、3つのオブジェクトが見えないのはなぜですか?

誰かが私が間違っている場所を見つけることができますか?

これはUpdateViewMatrixにコードマイカメラにおいて()クラスである:

private void UpdateViewMatrix(Matrix chasedObjectsWorld) 
    { 
     switch (currentCameraMode) 
     { 
      case CameraMode.free: 
       // To be able to rotate the camera and and not always have it looking at the same point 
       // Normalize the cameraRotation’s vectors, as those are the vectors that the camera will rotate around 
       cameraRotation.Forward.Normalize(); 
       cameraRotation.Up.Normalize(); 
       cameraRotation.Right.Normalize(); 

       // Multiply the cameraRotation by the Matrix.CreateFromAxisAngle() function, 
       // which rotates the matrix around any vector by a certain angle 
       // Rotate the matrix around its own vectors so that it works properly no matter how it’s rotated already 
       cameraRotation *= Matrix.CreateFromAxisAngle(cameraRotation.Right, pitch); 
       cameraRotation *= Matrix.CreateFromAxisAngle(cameraRotation.Up, yaw); 
       cameraRotation *= Matrix.CreateFromAxisAngle(cameraRotation.Forward, roll); 

       // After the matrix is rotated, the yaw, pitch, and roll values are set back to zero 
       yaw = 0.0f; 
       pitch = 0.0f; 
       roll = 0.0f; 

       // The target is changed to accommodate the rotation matrix 
       // It is set at the camera’s position, and then cameraRotation’s forward vector is added to it 
       // This ensures that the camera is always looking in the direction of the forward vector, no matter how it’s rotated 
       target = Position + cameraRotation.Forward; 

       break; 

      case CameraMode.chase: 
       // Normalize the rotation matrix’s forward vector because we’ll be using that vector to roll around 
       cameraRotation.Forward.Normalize(); 
       chasedObjectsWorld.Right.Normalize(); 
       chasedObjectsWorld.Up.Normalize(); 

       cameraRotation = Matrix.CreateFromAxisAngle(cameraRotation.Forward, roll); 

       // Each frame, desiredTarget will be set to the position of whatever object we’re chasing 
       // Then set the actual target equal to the desiredTarget, can then change the target’s X and Y coordinates at will 
       desiredTarget = chasedObjectsWorld.Translation; 
       target = desiredTarget; 

       target += chasedObjectsWorld.Right * yaw; 
       target += chasedObjectsWorld.Up * pitch; 

       // Always want the camera positioned behind the object, 
       // desiredPosition needs to be transformed by the chased object’s world matrix 
       desiredPosition = Vector3.Transform(offsetDistance, chasedObjectsWorld); 

       // Smooth the camera’s movement and transition the target vector back to the desired target 
       Position = Vector3.SmoothStep(Position, desiredPosition, .15f); 

       yaw = MathHelper.SmoothStep(yaw, 0f, .1f); 
       pitch = MathHelper.SmoothStep(pitch, 0f, .1f); 
       roll = MathHelper.SmoothStep(roll, 0f, .1f); 

       break; 

      case CameraMode.orbit: 
       // Normalizing the rotation matrix’s forward vector, and then cameraRotation is calculated 
       cameraRotation.Forward.Normalize(); 

       // Instead of yawing and pitching over cameraRotation’s vectors, we yaw and pitch over the world axes 
       // By rotating over world axes instead of local axes, the orbiting effect is achieved 
       cameraRotation = Matrix.CreateRotationX(pitch) * Matrix.CreateRotationY(yaw) * Matrix.CreateFromAxisAngle(cameraRotation.Forward, roll); 

       desiredPosition = Vector3.Transform(offsetDistance, cameraRotation); 
       desiredPosition += chasedObjectsWorld.Translation; 
       Position = desiredPosition; 

       target = chasedObjectsWorld.Translation; 

       roll = MathHelper.SmoothStep(roll, 0f, .2f); 

       break; 
     } 

     // Use this line of code to set up the View Matrix 
     // Calculate the view matrix 
     // The up vector is based on how the camera is rotated and not off the standard Vector3.Up 
     // The view matrix needs an up vector to fully orient itself in 3D space, otherwise, 
     // the camera would have no way of knowing whether or not it’s upside-down 
     viewMatrix = Matrix.CreateLookAt(Position, target, cameraRotation.Up); 
    } 
+0

カメラの位置は何ですか:

はこのような何かを試してみてください?作成したオブジェクトのx位置だけを変更し、カメラを元に戻してみてください。 – GGulati

+0

それを試してみてください。カメラは次の位置にあります。Position = new Vector3(0、10、70); – heyred

+0

いいえ、まだ1つのオブジェクト – heyred

答えて

1

私はあなたのcameraObject [n]は、おそらくです.Position(あなたのコードでは見ていないよと3つのモデル間の位置を一意に区別する唯一のもの)は、effect.Worldプロパティに影響します。

effect.World = transforms[myMesh.ParentBone.Index]; 

は、通常、個々のモデル位置を考慮しません。

for (int i = 0; i < cameraObject.Length; i++) 
{ 
    cameraObject[i].Draw(view, projection, cameraObject[i].Position); 
} 


//later in the draw method 
public void Draw(Matrix view, Matrix projection, Vector3 pos) 
{ 
    // ... 
    myEffect.World = transforms[myMesh.ParentBone.Index] * Matrix.CreateTranslation(pos); 
    // ... 
} 
+0

イップ、それはまさに私の問題だった。 Steveの助けを借りてありがとう – heyred

0

CameraObject [1] & [2] [0]カメラより大きい正のZ値に配置され、ビュー行列でありさ(負のZ方向を向いている起点にある&にあります(覚えておいて、ビューマトリックスはワールドマトリックスの逆の等価物です)。 代わりMatrix.IdentityにあなたにviewMatrixを設定するので、これにそれを設定し、すべての3つ表示される場合があります。

viewMatrix = Matrix.CreateLookAt(new Vector3(0,0,75), Vector3.Zero, Vector3.Up); 
+0

ええ、それを試してみましたが、幸運は申し訳ありません。上記の私の投稿の編集を参照してください、私はCamera()クラスのUpdateViewMatrix()メソッドを含んでいます。申し訳ありませんが本当に最初にそれを含める必要があります – heyred

関連する問題