我有一个" 3D引擎"它有一个模型矩阵。 我的所有3D对象都使用此模型矩阵(用于转换内容)。 对于每个对象,我在使用之前设置模型标识。 到目前为止,它似乎工作得很好,并且正如预期的那样。
但现在我突然想知道我是否有设计缺陷。 每个3D对象(基础对象)应该有自己的模型矩阵吗? 这样做是否有任何价值(每个3D对象的模型矩阵)?
答案 0 :(得分:6)
这就是模型矩阵的重点。它是从对象空间(其局部坐标系)到世界空间(共享坐标系)绘制的每个对象的可选变换。您可以定义对象,使其位置已经位于世界空间中,然后不需要模型矩阵(如果您使用身份模型矩阵,则如此)。
GL使用(或者至少在历史上它确实)这样的矩阵堆栈,从技术上讲,它是使用列主矩阵和后乘法的原因。这允许您在绘制对象之前/之后立即将本地坐标转换推送/弹出到堆栈的 顶部 ,同时保留其他很少改变的转换,例如世界 - > eye(视图矩阵)或eye-> clip(投影矩阵)未触及。
答案 1 :(得分:1)
在一个单独的答案中阐述,因为评论太短,但Andon的回答是正确的。
第一位艺术家认为模型空间中的1个单位是1米,而另一个艺术家则假设1英寸。
所以,你加载第一位艺术家完成的汽车网格,可能是3个单位长;和一个香蕉网,然后是8个单位长。
此外,第一位艺术家决定将汽车网格的点的原点放在其中心,而做香蕉网格的艺术家将香蕉放在X轴上,水果底部放在X轴上= 2000点。
所以 你如何在你的3D世界中展示这两个网格? 你是否会有一个长度几乎是你车长三倍的香蕉?这完全没有意义。
你打算如何将它们放在一起?或者你打算如何将它们放在飞机上?局部坐标系完全随机的事实使得无法以连贯的方式翻译对象。
它允许您指定每个模型的转换,将所有模型带入“共享”,独特,连贯的空间 - 世界空间。
例如,你可以翻译两个模型,使它们的原点位于“一个角落”,所有网格的顶点都位于第一个八分圆中。此外,如果您的世界空间使用“米”,您需要将香蕉网格缩放0.0254以使其大小以米为单位。此外,也许您想要旋转香蕉并使其位于Y轴而不是X.
在游戏结束时,对于您世界中的每个“独特模型”,您将拥有其关联的模型矩阵,并在绘制时使用它。
另外:对于模型的每个实例,您可以考虑应用额外的局部转换(在世界坐标中)。例如,您想将汽车模型转换为世界上的某个特定点。所以没有
(Model space) --> Model matrix ---> (World space) ---> World matrix ---> (Final world space)
你可以将两个矩阵相乘,并且只有一个矩阵可以将模型空间中的点直接带到最终的世界空间。
¹这一点有点没有意义,因为在任何适当的资产管道中,你要做的第一件事就是将所有模型带入一个连贯的坐标系统,只是做一个例子......