【问题标题】:XNA 4.0 Camera QuestionXNA 4.0 相机问题
【发布时间】:2011-06-26 08:04:14
【问题描述】:

我无法理解相机在我的测试应用程序中的工作原理。我已经能够拼凑出一台正常工作的相机——现在我正在努力确保我了解它是如何工作的。我的相机被封装在它自己的类中。这是从我的 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()来创建一个视图矩阵,所以我有点困惑。我希望有人可以简单地解释发生了什么。

谢谢,

-斯科特

【问题讨论】:

  • 这个问题的答案可能会对你有所帮助:stackoverflow.com/questions/6461740/…
  • 哈哈。那是我发布的关于另一个问题的问题。我很难让我的头围绕 3D 空间和不同的视图/矩阵/投影......

标签: xna


【解决方案1】:

视图矩阵对图形管道所做的一个操作是将 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 相对容易,但旋转基本相同。但是不要指望能够简单地否定所有基向量来反转矩阵......还有更多关于旋转的事情。

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

更进一步,投影矩阵将视空间中的那个点投影到一个平面上,而那个开始于 3d 空间的点现在位于 2d 空间中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-26
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2012-06-17
    相关资源
    最近更新 更多