C# XNA视图矩阵-查找说明

C# XNA视图矩阵-查找说明,c#,3d,matrix,xna,camera,C#,3d,Matrix,Xna,Camera,我在理解XNA中的视图矩阵时遇到了一些严重的问题。我对所有其他部分都有了相当的了解,因为我刚刚学会了所需的数学知识,我不想在不了解内置矩阵函数的情况下使用它们 现在我了解了旋转、投影和平移的基础知识,但我一辈子都无法理解视图矩阵在XNA中的工作原理 根据我收集的信息,视图矩阵应该将“世界”转换为它自己的空间。看起来很合理,但是库中的Matrix.CreateLookAt方法非常令人费解 我已经确定(通过检查库函数的输出)这两段代码产生相同的结果: Matrix view = Matrix.Cre

我在理解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轴向上移动一个单位,会发生什么。然后两个矩阵将不相等

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


Transform=Translate*RotationZ*RotationY*RotationX

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


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

谢谢,看来我原来的想法是正确的。但是我把所有这些不同的坐标系都弄糊涂了。谢谢你的回答。我选择了排名最低的答案。你们都帮了忙,不用担心。很高兴你弄明白了:)很有趣。上面提到的反射应该对应于围绕Y旋转180度。谢谢,这看起来很全面。如果你在XNA中做任何其他基于3D的事情,并且希望获得信息链接,请询问。在我开始之前,我做了很多研究,为更高级的东西整理了一个很好的信息列表。嗨,雷姆,我在做基于3D的XNA的东西,我很想得到信息链接!有什么建议给我吗?好久不见了。第一个建议是,如果您计划在XNA上使用引擎,请非常小心并进行大量研究。我用的是Ox引擎,我想很快射死自己。遗憾的是,当我开始在java中使用等轴测时,我的大部分XNA3D相关链接都从书签中删除了。道歉。这是一个非3D的建议,但对于XNA来说,你只能通过windows live的恶作剧($$$)进行多人游戏。因此,如果你想加入多人游戏,我建议你做两件事之一:简单的方法:Lidgren库或学习WCF(谷歌他们)建模。一般来说,根据他们的类型,你会遇到一些麻烦。Blender是制作测试模型的免费非盗版方法的好工具,不过您将花一周时间学习如何使用它。总的来说,要制作3D和可玩的东西,这是一个很大的时间承诺,不要带着一双明亮的眼睛去想太棒了,让我们玩一些有趣的东西,做一个很酷的游戏吧!因为你一周后就会筋疲力尽。长远考虑,设定小目标,并“证明未来”你的代码,这样你就不必继续重写那些编码不好的东西。