我在理解 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 轴?我认为你应该根据相机的旋转来旋转世界,但方向相反,然后将世界沿相反方向平移相同的量。
或者视图矩阵根本不用作变换而只是编码相机在世界中的位置和旋转?
您需要了解三种类型的变换:世界变换、视图变换和投影变换。
世界变换将模型坐标从模型空间更改为世界空间。当您定义模型的顶点时,您是相对于该模型的原点来定义它们的。世界变换对这些顶点进行变换,使它们相对于场景中所有对象共享的原点(即世界空间)。
然后视图变换将这些顶点变换到视图空间。观察者/相机在视图空间中具有位置和方向,这用于创建应用于场景中所有对象的视图矩阵。在视图空间中,观察者/相机位于原点,因此视图矩阵会平移并旋转所有对象以将它们放置在视图空间中。
最后,投影变换决定相机使用什么类型的“镜头”。到目前为止,我们只平移和旋转了对象,没有比例感或透视感。投影变换创建一个视锥体并将顶点变换到该视口中。
现在回答你的问题。您先绕 x 轴反映坐标系,然后再反映 z 轴,最后进行平移。这恰好会产生与观察矩阵相同的结果,因为位置位于 xz 和 yz 平面上,但请注意如果将位置沿 y 轴向上移动一个单位会发生什么。那么两个矩阵将不相等
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)