XNA 4.0相机问题

时间:2011-06-24 16:58:46

标签: xna

我无法理解相机在我的测试应用程序中的工作原理。我已经能够将一个工作相机拼凑在一起 - 现在我正在努力确保我理解它是如何工作的。我的相机封装在自己的类中。这是从我的Game.Update()方法调用的更新方法:

public void Update(float dt)
    {
      Yaw += (200 - Game.MouseState.X) * dt * .12f;
      Pitch += (200 - Game.MouseState.Y) * dt * .12f;

      Mouse.SetPosition(200, 200);

      _worldMatrix = Matrix.CreateFromAxisAngle(Vector3.Right, Pitch) * Matrix.CreateFromAxisAngle(Vector3.Up, Yaw);

      float distance = _speed * dt;

      if (_game.KeyboardState.IsKeyDown(Keys.E))
        MoveForward(distance);
      if (_game.KeyboardState.IsKeyDown(Keys.D))
        MoveForward(-distance);
      if (_game.KeyboardState.IsKeyDown(Keys.S))
        MoveRight(-distance);
      if (_game.KeyboardState.IsKeyDown(Keys.F))
        MoveRight(distance);
      if (_game.KeyboardState.IsKeyDown(Keys.A))
        MoveUp(distance);
      if (_game.KeyboardState.IsKeyDown(Keys.Z))
        MoveUp(-distance);

      _worldMatrix *= Matrix.CreateTranslation(_position);
      _viewMatrix = Matrix.Invert(_worldMatrix);      // What's gong on here???
    }

首先,我理解这个方法中的所有内容,而不是操作矩阵的最后一部分。我认为术语也会妨碍我。例如,我的_worldMatrix实际上是一个旋转矩阵。让我感到困惑的是通过反转_viewMatrix来计算_worldMatrix的部分。我只是不明白这是什么。

在之前的测试中,我总是使用Matrix.CreateLookAt()来创建视图矩阵,所以我有点困惑。我希望有人可以简单地解释发生了什么。

谢谢,

-Scott

1 个答案:

答案 0 :(得分:2)

视图矩阵对图形管道的一个操作是它将一个3d点从世界空间(x,y,z,我们都知道和爱)转换为视图(或相机)空间,相机被认为是世界的中心(0,0,0),并且所有点/物体都与它相关。因此,虽然相对于世界而言,一个点可能是1,1,1,相对于相机位置,它的坐标是什么?好吧,事实证明,要找出答案,您可以通过表示相机世界空间位置/旋转的矩阵的倒数来转换该点。

如果你考虑它有点意义......让我们说相机的位置是2,2,2。任意点位于3,3,3。我们知道距离相机的距离是1,1,1,对吧?那么你应该对点3,3,3进行什么样的转换才能使它成为1,1,1(相对于相机的位置)?你会将3,3,3变换为-2,-2,-2,得到1,1,1。 -2,-2,-2也是相机的倒置位置。这个例子是为了翻译,因为杂货相对容易,但轮换基本相同。但是,不要指望能够简单地否定所有基础向量来反转矩阵......还有更多用于轮换的东西。

Matrix.CreateLookAt()方法会自动返回反转矩阵,因此除非您反映其代码,否则您并未真正注意到它。

更进一步,投影矩阵然后在视图空间中获取该点并将其投影到平面上,并且从3d空间开始的那个点现在位于2d空间中。