Почему порядок масштабирования и перевода имеет значение для модельной матрицы? - PullRequest
0 голосов
/ 06 ноября 2018

Я поигрался с созданием модельной матрицы и понял, что порядок операций по масштабированию и переводу имеет значение. Я использую Qt для своих матриц и использую QMatrix4x4 и использую openGL (но это должно быть независимо от библиотеки и платформы и связано с математикой). Результат уменьшения модели с последующим ее переводом работает только так, как ожидалось, вот так.

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

У меня сложилось впечатление, что математически, поскольку масштаб отображается в первых 3x3 матрицы, а перевод влияет только на последний столбец матрицы (4-й столбец), порядок не зависит. Когда я смотрю на матрицы, я понимаю, что порядок имеет значение, но я не могу понять, почему.

1 Ответ

0 голосов
/ 06 ноября 2018

Рассмотрим:

  • Точка вершины в вашей модели 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  |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...