XNA WorldMatrix和ViewMatrix

XNA WorldMatrix和ViewMatrix,xna,Xna,我创建了一个Camera类,允许我以第一人称在场景中移动。在我决定将它用作向3D世界添加内容的位置之前,相机一直工作得很好。我想做的是在我按下鼠标按钮时向世界添加一个立方体。我希望立方体最终远离相机,但现在我只想在它前面创建立方体。有时它起作用,有时它在一边或另一边创造它。这完全取决于我旋转和平移了多少相机 我正在尝试使用视图矩阵查找相机前面的矢量,如下所示: Vector3 inFront = Camera.ViewMatrix.Forward; 我计划用这个向量在立方体后面添加一些物理元素

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

我正在尝试使用视图矩阵查找相机前面的矢量,如下所示:

Vector3 inFront = Camera.ViewMatrix.Forward;
我计划用这个向量在立方体后面添加一些物理元素,让它远离摄像机。现在我只想得到一个正确的向量

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

我做错了什么


-斯科特

我想你应该知道摄像机的位置。您是否尝试过类似的方法(我已经有几年没有做过矩阵/向量数学了,所以这可能不适用):


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

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

首先,看一看

您还需要了解的是,
Matrix.Forward
返回一个
Vector3
Vector3
可以表示位置或标量和方向。您需要其中两个来表示位置和方向

现在,我的3D矩阵数学有点生疏了,但我很确定你想要的是
矩阵。平移
作为相机在世界空间中的位置。和
Matrix.Forward
作为摄影机在世界空间中的前进方向


除非您的相机/视图矩阵正在世界上执行缩放操作(实际上不应该),否则从
矩阵返回的
矢量3
将具有单位长度-换句话说,只有一个方向(没有标量)。使用此选项可以给出移动对象的方向。

不,这实际上不起作用,因为视图矩阵(.Forward included)的组件在视图空间中有值,而不是在世界空间中有值,而您正试图在世界空间中利用这些值。要使方法有效,您必须创建一个与视图矩阵相反的矩阵,并使用它的.Forward属性。通过这种调整,你的想法是正确的,我一直在应用它+1啊,是的。。。我现在记起来了。谢谢
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;