Graphics 为什么缩放和平移的顺序对模型矩阵很重要?
我在玩创建模型矩阵的游戏,意识到缩放和平移操作的顺序很重要。我在矩阵中使用Qt,使用QMatrix4x4和openGL(但这应该与库和平台无关,并且与数学相关)。缩小模型的比例,然后对其进行转换的结果只能按预期工作,就像这样Graphics 为什么缩放和平移的顺序对模型矩阵很重要?,graphics,3d,Graphics,3d,我在玩创建模型矩阵的游戏,意识到缩放和平移操作的顺序很重要。我在矩阵中使用Qt,使用QMatrix4x4和openGL(但这应该与库和平台无关,并且与数学相关)。缩小模型的比例,然后对其进行转换的结果只能按预期工作,就像这样 QMatrix4x4 model; model.translate(some_vec3d); model.scale(some_vec3d); 我的印象是,从数学上讲,由于比例出现在矩阵的前3x3中,平移只影响矩阵的最后一列(第4列),因此顺序是独
QMatrix4x4 model;
model.translate(some_vec3d);
model.scale(some_vec3d);
我的印象是,从数学上讲,由于比例出现在矩阵的前3x3中,平移只影响矩阵的最后一列(第4列),因此顺序是独立的。当我看矩阵时,我明白顺序很重要,但我不明白为什么。考虑一下:
- 模型中的顶点
p
- 比例矩阵
S
- 位移向量的平移矩阵
T
Translation first:
S * T * p = S * (p + t)
= S * p + S * t
----- <---
Scaling first:
T * S * p = S * p + t
- <---
这是一个很好的例子。谢谢我展示的代码之所以有效,是因为它将其应用于列major中,所以操作是相反的,与您展示的行major相反?这就是缩放,然后是转换。@dev_nut哦,好的,我不知道Qt使用的是什么矩阵约定,但OpenGL使用row MAJURE(Y和Z交换)。这取决于Qt如何实现平移和缩放功能;有些库以相反的方式应用转换。即使是glm,您也必须以相反的方式进行操作。我相信openGL是一门专业-。但是,数学都是一样的。您只需要知道您使用的底层库所期望的顺序,即qt或glm或其他任何东西。@dev_nut oops请原谅这个错误;底线是,矩阵方程是约定不变的,它们表明,如果第二次应用缩放,平移本身也将被缩放,反之则不适用。
Translation first:
| Sx 0 0 0 | | 1 0 0 Tx | | Sx 0 0 Sx * Tx |
| 0 Sy 0 0 | * | 0 1 0 Ty | = | 0 Sy 0 Sy * Ty |
| 0 0 Sz 0 | | 0 0 1 Tz | | 0 0 Sz Sz * Tz |
| 0 0 0 1 | | 0 0 0 1 | | 0 0 0 1 |
Scaling first:
| 1 0 0 Tx | | Sx 0 0 0 | | Sx 0 0 Tx |
| 0 1 0 Ty | * | 0 Sy 0 0 | = | 0 Sy 0 Ty |
| 0 0 1 Tz | | 0 0 Sz 0 | | 0 0 Sz Tz |
| 0 0 0 1 | | 0 0 0 1 | | 0 0 0 1 |