0

谁能看到我在这里出错的地方。

我有一个具有模型和位置的 CameraObject 类(它不是相机,只是表示“相机”的框的模型)。它还具有常用的 LoadContent()、Draw() 和 Update() 方法。但是,当我绘制模型数组时,我只在屏幕上看到 1 个模型(嗯,可能有 3 个,但它们可能都在同一个位置)?

CameraModel 类的 Draw() 方法如下所示:

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 对象数组:

CameraObject[] cameraObject = new CameraObject[3]; 

我 Initialize() - 所以每个新对象应该与前一个对象相差 +10

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

最后是 Draw()

Matrix view = camera.viewMatrix; 
Matrix projection = camera.projectionMatrix; 

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

视图和投影来自我的 Camera() 类,如下所示:

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

但我只看到 1 个对象被绘制到屏幕上?我已经逐步完成了代码,一切看起来都很好,但我不知道为什么我看不到 3 个对象?

谁能发现我哪里出错了?

这是我的 Camera() 类中 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);
    }
4

2 回答 2

1

我没有在您的代码中看到您的 cameraObject[n].Position (这可能是唯一区分三个模型之间位置的唯一因素)正在影响 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);
  // ...
}
于 2012-04-12T19:04:36.220 回答
0

CameraObject[1] 和 [2] 位于比 camera[0] 更大的正 Z 值,并且视图矩阵位于原点并朝负 Z 方向看(请记住,视图矩阵是世界的倒置等价物矩阵)。与其将 viewMatrix 设置为 Matrix.Identity,不如将其设置为此,您可能会看到所有三个:

viewMatrix = Matrix.CreateLookAt(new Vector3(0,0,75), Vector3.Zero, Vector3.Up);
于 2012-04-12T01:47:13.040 回答