我正在研究创建模型矩阵,并意识到缩放和转换操作的顺序很重要。我将Qt用于我的矩阵,并使用QMatrix4x4和openGL(但这应该与库和平台无关,并且与数学有关)。缩小模型然后进行转换的结果只能像预期的那样工作。
QMatrix4x4 model;
model.translate(some_vec3d);
model.scale(some_vec3d);
在数学上,我的印象是,比例尺出现在矩阵的前3x3中,平移仅影响矩阵的最后一列(第四列),因此顺序是独立的。当我查看矩阵时,我知道顺序很重要,但是我不明白为什么。
答案 0 :(得分:1)
考虑:
p
中的顶点S
T
构成的转换矩阵t
通过应用以下内容获得的变换点:
Translation first:
S * T * p = S * (p + t)
= S * p + S * t
----- <---
Scaling first:
T * S * p = S * p + t
- <---
矩阵乘法所示的差异:
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 |