XNA查看矩阵 - 寻求解释

时间:2009-08-20 22:21:37

标签: c# 3d matrix xna camera

我在理解XNA中的视图矩阵时遇到了一些麻烦。我已经完成了所有其他部分,因为我刚刚学会了所需的数学,我不想使用内置的Matrix函数而不了解他们先做的事情。

现在我理解了旋转,投影和翻译的基础知识,但我无法理解视图矩阵在XNA中的工作原理。

从我收集的内容来看,视图矩阵应该将“世界”转变为自己的空间。看似合理,但库中的Matrix.CreateLookAt方法非常令人费解。

我已经建立(通过检查库函数输出的内容)这两段代码产生相同的结果:

Matrix view = Matrix.CreateReflection(new Plane(Vector3.UnitX, 0)) * Matrix.CreateReflection(new Plane(Vector3.UnitZ, 0)) * Matrix.CreateTranslation(Position);
// ..equals this if (Position = (0 0 -5), since LookAt "looks at" but the above just looks straight down Z)..
Matrix blah = Matrix.CreateLookAt(Position, Vector3.Zero, Vector3.UnitY);

为什么要翻转X轴和Z轴?我认为你应该根据相机的旋转来旋转世界,但是在相反的方向,然后在相反的方向上将世界翻转相同的数量。

或者视图矩阵根本不用作转换,只是编码摄像机在世界上的位置和旋转?

4 个答案:

答案 0 :(得分:22)

您需要了解三种类型的变换:世界,视图和投影。

世界变换将模型坐标从模型空间更改为世界空间。定义模型的顶点时,可以相对于该模型的原点定义它们。世界变换会转换这些顶点,使它们相对于场景中所有对象共享的原点,即世界空间。

视图变换然后将这些顶点转换为视图空间。查看器/摄像机在视图空间中具有位置和方向,这用于创建应用于场景中所有对象的视图矩阵。在视图空间中,查看器/摄像机位于原点,因此视图矩阵平移并旋转所有对象以将它们放置在视图空间中。

最后,投影变换确定相机使用的“镜头”类型。到目前为止,我们只翻译和旋转了对象,没有规模感或透视感。投影变换创建视锥体并将顶点转换为此视口。

现在提出你的问题。您可以反映围绕x轴的坐标系,然后是z轴,最后进行平移。这会产生与外观矩阵相同的结果,因为位置位于xz和yz平面上,但请注意如果将位置向上移动一个单位,则会发生什么。那两个基质不会相等

答案 1 :(得分:5)

视图矩阵正在将场景转换为视图空间。在视图空间中,虚拟摄像机位于原点并且正在正z方向上查看。有不同的方法来实现这一点,但最常见的是视图矩阵包括平移和围绕每个轴的三个旋转。

变换=翻译*旋转Z *旋转Y *旋转X

答案 2 :(得分:4)

以下链接帮助我更好地理解并更有效地使用矩阵。你可能会发现它们很有趣:

http://stevehazen.wordpress.com/2010/02/15/matrix-basics-how-to-step-away-from-storing-an-orientation-as-3-angles/

我现在和你做的事情相同:)

答案 3 :(得分:1)

如果我正确地记住了几何体,那么组成两个反射会产生一次旋转。