【问题标题】:XNA WorldMatrix and ViewMatrixXNA WorldMatrix 和 ViewMatrix
【发布时间】:2011-06-23 23:19:46
【问题描述】:

我创建了一个相机类,它允许我以第一人称在场景中移动。在我决定将它用作向 3D 世界添加一些东西之前,相机一直工作得很好。我想要做的是当我按下鼠标按钮时向世界添加一个立方体。我希望立方体最终远离相机,但现在我只想在它前面创建它。有时它会起作用,有时它会在一侧或另一侧创建它。这完全取决于我旋转和平移相机的程度。

我正在尝试通过使用 View Matrix 来找到相机前的矢量,如下所示:

Vector3 inFront = Camera.ViewMatrix.Forward;

我计划使用向量在立方体后面添加一些物理特性,并让它远离相机。现在我只想得到一个正确的向量。

我知道您通常使用 WorldMatrix 在世界上绘制东西,但我不知道如何将 ViewMatrix 转换为 WorldMatrix。还在学习:-)

我做错了什么?

-斯科特

【问题讨论】:

    标签: xna


    【解决方案1】:

    首先,“世界矩阵”和“视图矩阵”之间没有真正的区别,它们都是变换矩阵,区别有些随意.有些系统甚至将两者结合起来(OpenGL 只是有一个“ModelView”矩阵)。

    传统上,“世界矩阵”用于将个体模型从“模型空间”移动到“世界空间”。然后“视图矩阵”用于将 所有模型从世界空间移动到它们在相机前面的相对位置(实际上,“移动相机”)。最后,“投影矩阵”将 3D 位置转换为它们在屏幕上的 2D 位置(通常使用透视投影)。因为它们是矩阵,所以可以将它们相乘成一个矩阵,可以一步变换点。

    首先,看看properties of the Matrix struct

    您还需要意识到Matrix.Forward 返回一个Vector3Vector3 可以表示 位置 标量和方向。您需要 两个 来代表一个位置一个方向。

    现在,我的 3D 矩阵数学有点生疏了,但我很确定您想要的是 Matrix.Translation 作为相机在世界空间中的位置。并且Matrix.Forward 作为世界空间中相机的前向方向

    除非您的相机/视图矩阵正在对世界执行缩放操作(实际上不应该),否则您从 Matrix.Forward 返回的 Vector3 将具有单位长度 - 换句话说只是一个方向(没有标量)。使用它来指定移动对象的方向。

    【讨论】:

      【解决方案2】:

      我假设您必须确定相机的位置。你有没有尝试过这样的事情(我几年没做过矩阵/向量数学,所以这可能会关闭):

      float scalar = 10; // how far away from the camera you want to move the object
      Vector3 camPos = ???; // supplied from somewhere elese
      Vector3 inFront = Camera.ViewMatrix.Forward;
      Vector3 newPos = camPos + inFront * scalar;
      

      【讨论】:

      • 不,这实际上不起作用,因为视图矩阵的组件(包括 .Forward)在视图空间中具有值,而不是在您尝试使用它们的世界空间中。为了使您的方法起作用,您必须创建一个与视图矩阵相反的矩阵,并改用它的 .Forward 属性。通过这种调整,你的想法是合理的,我一直在应用它。 +1
      • 啊是的...我现在记得了。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多