Порядок умножения матрицы преобразования

21

Я испытываю трудности, пытаясь выяснить правильный порядок умножения для окончательной матрицы преобразования. Я всегда получаю странное движение или искаженную геометрию. Моя текущая модель объясняется ниже:

Для одного узла мой порядок умножения:

L = S * R * T

где

L = матрица локального преобразования

S = матрица локального масштаба

R = матрица локального вращения

T = матрица локального перевода

Для преобразования мира узла:

W = PW * L

где

W = матрица преобразования мира

PW = матрица преобразования родительского мира

L = матрица локального преобразования, вычисленная выше

При рендеринге для каждого узла вычисляю матрицу:

MV = Inv (C) * NW

где

MV = матрица преобразования вида модели для конкретного узла

Inv (C) = матрица обратного преобразования камеры

NW = матрица преобразования мира узла, рассчитанная выше.

Наконец, в шейдере происходит следующее преобразование:

TVP = PRP * MV * VP

где

TVP = окончательно преобразованная позиция вершины

PRP = перспективная матрица

MV = матрица преобразования мира узла, вычисленная выше

VP = нетрансформированная позиция вершины.

В текущей модели дочерние узлы, имеющие локальное вращение, странно вращаются при преобразовании камеры. Где я ошибся с порядком умножения?

Колин Думитру
источник

Ответы:

37

Любая комбинация заказа S*R*Tдает действительную матрицу преобразования. Тем не менее, довольно часто сначала масштабировать объект, затем вращать его, а затем переводить:

L = T * R * S

Если вы не сделаете это в таком порядке, то предыдущее вращение повлияет на неравномерное масштабирование, в результате чего ваш объект будет выглядеть перекошенным. И вращение будет зависеть от перевода, в результате чего конечная позиция вашего объекта будет сильно отличаться от ожидаемой вами ценности перевода.

Сэм Хоцевар
источник
Можете ли вы объяснить это немного больше? Из того, к чему я привык, на поворот не может повлиять перевод, так как это разница в ориентации между двумя кадрами, независимо от положения. Вместо этого на перемещение может повлиять вращение, которое происходит до него, поскольку оно будет перемещаться по вновь определенной оси вращения. В L = TRS, перевод происходит первым, поэтому на него не влияют новые векторы, созданные вращением.
user-2147482637
4
Путаница возникает из-за того, что вы говорите о локальных преобразованиях (где фрейм остается связанным с объектом), тогда как описанные здесь преобразования происходят в мировом пространстве (где существует только одна фиксированная система отсчета, мир). Концептуально, ваш взгляд на вещи действителен, и это эквивалентно применению преобразований в обратном порядке.
Сэм Хочевар