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

Graphics 为什么缩放和平移的顺序对模型矩阵很重要?,graphics,3d,Graphics,3d,我在玩创建模型矩阵的游戏,意识到缩放和平移操作的顺序很重要。我在矩阵中使用Qt,使用QMatrix4x4和openGL(但这应该与库和平台无关,并且与数学相关)。缩小模型的比例,然后对其进行转换的结果只能按预期工作,就像这样 QMatrix4x4 model; model.translate(some_vec3d); model.scale(some_vec3d); 我的印象是,从数学上讲,由于比例出现在矩阵的前3x3中,平移只影响矩阵的最后一列(第4列),因此顺序是独

我在玩创建模型矩阵的游戏,意识到缩放和平移操作的顺序很重要。我在矩阵中使用Qt,使用QMatrix4x4和openGL(但这应该与库和平台无关,并且与数学相关)。缩小模型的比例,然后对其进行转换的结果只能按预期工作,就像这样

    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  |