为什么缩放和平移的顺序对模型矩阵很重要?

时间:2018-11-06 17:12:00

标签: graphics 3d

我正在研究创建模型矩阵,并意识到缩放和转换操作的顺序很重要。我将Qt用于我的矩阵,并使用QMatrix4x4和openGL(但这应该与库和平台无关,并且与数学有关)。缩小模型然后进行转换的结果只能像预期的那样工作。

    QMatrix4x4 model;
    model.translate(some_vec3d);
    model.scale(some_vec3d);

在数学上,我的印象是,比例尺出现在矩阵的前3x3中,平移仅影响矩阵的最后一列(第四列),因此顺序是独立的。当我查看矩阵时,我知道顺序很重要,但是我不明白为什么。

1 个答案:

答案 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  |