保留Model Matrix的标准位置是什么?

时间:2014-06-12 19:03:55

标签: opengl 3d webgl direct3d

我有一个" 3D引擎"它有一个模型矩阵。 我的所有3D对象都使用此模型矩阵(用于转换内容)。 对于每个对象,我在使用之前设置模型标识。 到目前为止,它似乎工作得很好,并且正如预期的那样。

但现在我突然想知道我是否有设计缺陷。 每个3D对象(基础对象)应该有自己的模型矩阵吗? 这样做是否有任何价值(每个3D对象的模型矩阵)?

2 个答案:

答案 0 :(得分:6)

这就是模型矩阵的重点。它是从对象空间(其局部坐标系)到世界空间(共享坐标系)绘制的每个对象的可选变换。您可以定义对象,使其位置已经位于世界空间中,然后不需要模型矩阵(如果您使用身份模型矩阵,则如此)。

GL使用(或者至少在历史上它确实)这样的矩阵堆栈,从技术上讲,它是使用列主矩阵和后乘法的原因。这允许您在绘制对象之前/之后立即将本地坐标转换推送/弹出到堆栈的 顶部 ,同时保留其他很少改变的转换,例如世界 - > eye(视图矩阵)或eye-> clip(投影矩阵)未触及。

答案 1 :(得分:1)

在一个单独的答案中阐述,因为评论太短,但Andon的回答是正确的。


想想加载两个不同艺术家完成的两个3D网格的例子。 ¹

第一位艺术家认为模型空间中的1个单位是1米,而另一个艺术家则假设1英寸。

所以,你加载第一位艺术家完成的汽车网格,可能是3个单位长;和一个香蕉网,然后是8个单位长。

此外,第一位艺术家决定将汽车网格的点的原点放在其中心,而做香蕉网格的艺术家将香蕉放在X轴上,水果底部放在X轴上= 2000点。

所以 你如何在你的3D世界中展示这两个网格? 你是否会有一个长度几乎是你车长三倍的香蕉?这完全没有意义。

你打算如何将它们放在一起?或者你打算如何将它们放在飞机上?局部坐标系完全随机的事实使得无法以连贯的方式翻译对象。

这是模型 - >世界矩阵的用武之地。

它允许您指定每个模型的转换,将所有模型带入“共享”,独特,连贯的空间 - 世界空间。

例如,你可以翻译两个模型,使它们的原点位于“一个角落”,所有网格的顶点都位于第一个八分圆中。此外,如果您的世界空间使用“米”,您需要将香蕉网格缩放0.0254以使其大小以米为单位。此外,也许您想要旋转香蕉并使其位于Y轴而不是X.

在游戏结束时,对于您世界中的每个“独特模型”,您将拥有其关联的模型矩阵,并在绘制时使用它。


另外:对于模型的每个实例,您可以考虑应用额外的局部转换(在世界坐标中)。例如,您想将汽车模型转换为世界上的某个特定点。所以没有

(Model space) --> Model matrix ---> (World space) ---> World matrix ---> (Final world space)

你可以将两个矩阵相乘,并且只有一个矩阵可以将模型空间中的点直接带到最终的世界空间。


¹这一点有点没有意义,因为在任何适当的资产管道中,你要做的第一件事就是将所有模型带入一个连贯的坐标系统,只是做一个例子......