我创建了一个Camera类,允许我以第一人称的方式移动场景。相机工作得很好,直到我决定用它作为一个位置来添加3D世界的东西。我想要做的是当我按下鼠标按钮时向世界添加一个立方体。我想立即最终离开相机,但是现在我只想在它前面创建它。有时候它会起作用,有时会将它创建到一侧或另一侧。这一切都取决于我旋转和翻译相机的程度。
我正在试着通过使用View Matrix来找到我相机前的矢量:
Vector3 inFront = Camera.ViewMatrix.Forward;
我计划使用矢量在立方体后面添加一些物理,让它远离相机。现在我只是想得到一个正确的Vector。
我知道你通常使用WorldMatrix在世界上绘制东西,但我无法弄清楚如何将我的ViewMatrix转换为WorldMatrix。还在学习: - )
我做错了什么?
-Scott
答案 0 :(得分:10)
首先,“世界矩阵”和“视图矩阵”之间没有真正的区别,它们都是变换矩阵,区别有些随意。有些系统甚至将两者结合起来(OpenGL只有一个“ModelView”矩阵)。
传统上,“世界矩阵”用于将个人模型从“模型空间”移动到“世界空间”。然后使用“视图矩阵”将所有模型从世界空间移动到它们在摄像机前面的相对位置(实际上,“移动摄像机”)。最后,“投影矩阵”将3D位置转换为屏幕上的2D位置(通常使用透视投影)。因为它们是矩阵,所以它们可以相乘成一个矩阵,可以在一个步骤中转换点。
首先,看看properties of the Matrix
struct。
您还需要意识到Matrix.Forward
会返回Vector3
。 Vector3
可以表示位置 或 标量和方向。您需要两个来表示 和 的位置。
现在,我的3D矩阵数学有点生疏,但我很确定你想要的是Matrix.Translation
作为世界空间中摄像机的位置。并Matrix.Forward
作为世界空间中摄像机的前向方向。
除非您的相机/视图矩阵在世界上执行缩放操作(实际上它不应该),否则从Vector3
返回的Matrix.Forward
将具有单位长度 - 换句话说只是一个方向(没有标量)。使用它来指定移动对象的方向。
答案 1 :(得分:1)
我假设您必须定位相机。你有没有试过这样的东西(我几年没有完成Matrix / Vector数学运算,所以这可能会关闭):
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;