6

我在理解 XNA 中的视图矩阵时遇到了一些严重的问题。我已经完成了所有其他部分,并且因为我刚刚学会了所需的数学知识,所以我不想在不了解它们首先做什么的情况下使用内置的矩阵函数。

现在我了解了旋转、投影和平移的基础知识,但我一生都无法理解视图矩阵在 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

4 回答 4

22

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

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

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

最后,投影变换决定了相机使用什么类型的“镜头”。到目前为止,我们只平移和旋转了对象,没有比例或透视感。投影变换创建了一个视锥并将顶点变换到这个视口中。

现在回答你的问题。您反映关于 x 轴的坐标系,然后是 z 轴,最后是平移它。这恰好产生与观察矩阵相同的结果,因为该位置位于 xz 和 yz 平面上,但请注意,如果将位置向上移动一个单位 y 轴会发生什么。那么这两个矩阵将不相等

于 2009-08-21T02:37:23.093 回答
5

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

变换 = 平移 * RotationZ * RotationY * RotationX

于 2009-08-21T02:41:06.987 回答
5

以下链接极大地帮助了我理解和更有效地使用矩阵。你可能会觉得它们很有趣:

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

我现在做的事情和你差不多:)

于 2011-03-11T01:09:04.853 回答
1

如果我正确地记住了我的几何形状,组合两个反射会产生一个旋转。

于 2009-08-20T22:29:47.603 回答