XNA 4.0相机问题

XNA 4.0相机问题,xna,Xna,我很难理解相机在我的测试应用程序中是如何工作的。我已经能够拼凑出一个可以正常工作的相机——现在我正在努力确保我了解它是如何工作的。我的相机封装在自己的类中。下面是从我的游戏调用的update方法。update()方法: 首先,我了解这个方法中的所有内容,除了最后一部分矩阵被操纵的部分。我认为术语也在妨碍我。例如,我的\u worldMatrix实际上是一个旋转矩阵。真正让我困惑的是,\u viewMatrix是通过反转\u worldMatrix来计算的。我只是不明白这是怎么回事 在之前的测试中

我很难理解相机在我的测试应用程序中是如何工作的。我已经能够拼凑出一个可以正常工作的相机——现在我正在努力确保我了解它是如何工作的。我的相机封装在自己的类中。下面是从我的游戏调用的update方法。update()方法:

首先,我了解这个方法中的所有内容,除了最后一部分矩阵被操纵的部分。我认为术语也在妨碍我。例如,我的
\u worldMatrix
实际上是一个旋转矩阵。真正让我困惑的是,
\u viewMatrix
是通过反转
\u worldMatrix
来计算的。我只是不明白这是怎么回事

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

谢谢


-Scott

视图矩阵对图形管道所做的一项操作是,它将一个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也是相机的反转位置。这个例子是针对平移的,因为它相对容易进行groc,但对于旋转,情况基本相同。但不要期望能够简单地对所有基向量求反来求逆矩阵。。。对于旋转,还有更多的事情要做

CreateLookAt()方法会自动返回反转矩阵,因此除非您反映其代码,否则不会真正注意到它的发生


再进一步,投影矩阵将该点在视图空间中投影到一个平面上,从三维空间开始的点现在在二维空间中。

这个问题的答案可能会帮助你:LOL。这是我关于另一个问题的问题。我很难让我的头脑集中在3D空间和不同的视图/矩阵/投影上。。。
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???
    }