首页 > 解决方案 > 为什么缩放和平移的顺序对模型矩阵很重要?

问题描述

我正在尝试创建一个模型矩阵,并意识到缩放和平移的操作顺序很重要。我将 Qt 用于我的矩阵并使用 QMatrix4x4 并使用 openGL(但这应该与库和平台无关,并且与数学有关)。缩小模型然后翻译它的结果只能按预期工作,就像这样。

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

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

标签: graphics3d

解决方案


考虑:

  • 模型中的顶点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  |

推荐阅读