【问题标题】:XNA View Matrix - Seeking explanationXNA View Matrix - 求解释
【发布时间】:2010-11-21 12:04:53
【问题描述】:

我在理解 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 轴?我认为您应该根据相机旋转来旋转世界,但方向相反,然后将世界沿相反方向平移相同的量。

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

【问题讨论】:

    标签: c# 3d matrix xna camera


    【解决方案1】:

    如果我没记错几何形状,组合两个反射会产生一个旋转。

    【讨论】:

    • 有趣。上面提到的反射应该对应于围绕 Y 旋转 180 度。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 感谢您的回答。我选择了排名最低的答案。你们都帮忙了。
    • 不用担心。很高兴你明白了:)
    【解决方案3】:

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

    变换 = 平移 * RotationZ * RotationY * RotationX

    【讨论】:

    • 谢谢,看来我最初的想法是正确的。但是我对所有这些不同的坐标系感到有些困惑。
    【解决方案4】:

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

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

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

    【讨论】:

    • 谢谢,看起来很全面。
    • 如果您在 XNA 中进行其他 3D 操作并希望获得信息链接,请询问。在开始之前我做了很多研究,并为更高级的东西编制了一个很好的信息列表。
    • 嗨,Remm,我正在做基于 3D 的 XNA 东西,我很想被信息链接吸引!对我有什么建议吗?
    • 天啊,好久不见了。如果您计划在 XNA 之上使用引擎,第一个建议是非常小心并进行大量研究。我使用了 Ox 引擎,想快速射击自己。然而,遗憾的是,当我开始在 java 中使用等轴测图时,我的大部分 XNA 3D 相关链接都从我的书签中删除了。道歉。一个非 3D 建议,但对 XNA 来说是一些东西——你只能通过 windows live 恶作剧($$$$)真正进行多人游戏。因此,如果您正在考虑添加多人游戏,我建议您选择以下两种方法之一:简单的方法:Lidgren 库或学习 WCF(谷歌它们)
    • 对于一般的建模,根据它们的类型,你会遇到一些麻烦。 Blender 是一个很好的工具,可以免费使用非盗版方式制作测试模型,尽管您将花费一周的时间来学习如何使用它。总的来说,要制作 3D 和可玩的东西,这是一个重要的时间承诺,不要睁大闪亮的眼睛,以为真棒让我们玩得开心,做一个很酷的游戏!因为你会在一周内筋疲力尽。着眼长远,设定小目标并让您的代码“面向未来”,这样您就不必不断重写编码不佳的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多