Конвертировать матрицу вращения 3d 4x4 в 2d
Скажем, у нас есть матрица 4x4 с индексами, такими как:
00 01 02 03
10 11 12 13
20 21 22 23
30 31 32 33
Как преобразовать данные вращения (игнорируя ось z, если это помогает), содержащиеся в этой матрице, в один двумерный угол вращения (в радианах)?
Фон: у меня есть 3D .dae анимация, экспортированная из Blender в формат Collada. Технически анимация 2d, все значения по оси Z равны 0. Я пытаюсь преобразовать матрицы 4x4 в данные 2D перемещения, поворота и масштабирования.
2 ответа
Матрица шкалы S
выглядит так:
sx 0 0 0
0 sy 0 0
0 0 sz 0
0 0 0 1
Матрица перевода T
выглядит так:
1 0 0 0
0 1 0 0
0 0 1 0
tx ty tz 1
Матрица вращения оси Z R
выглядит так:
cos(a) sin(a) 0 0
-sin(a) cos(a) 0 0
0 0 1 0
0 0 0 1
Если у вас есть матрица преобразования M
, это является результатом ряда умножений R
, T
а также S
матрицы. Смотря на M
порядок и количество этих умножений неизвестны. Однако, если мы предположим, что M=S*R*T
мы можем разложить его на отдельные матрицы. Во-первых, давайте посчитаем S*R*T
:
( sx*cos(a) sx*sin(a) 0 0) (m11 m12 m13 m14)
S*R*T = (-sy*sin(a) sy*cos(a) 0 0) = M = (m21 m22 m23 m24)
( 0 0 sz 0) (m31 m32 m33 m34)
( tx ty tz 1) (m41 m42 m43 m44)
Поскольку мы знаем, что это двумерное преобразование, получить перевод очень просто:
translation = vector2D(tx, ty) = vector2D(m41, m42)
Чтобы вычислить вращение и масштаб, мы можем использовать sin(a)^2+cos(a)^2=1
:
(m11 / sx)^2 + (m12 / sx)^2 = 1
(m21 / sy)^2 + (m22 / sy)^2 = 1
m11^2 + m12^2 = sx^2
m21^2 + m22^2 = sy^2
sx = sqrt(m11^2 + m12^2)
sy = sqrt(m21^2 + m22^2)
scale = vector2D(sx, sy)
rotation_angle = atan2(sx*m22, sy*m12)
В этой библиотеке есть процедуры для преобразования матрицы 4х4 в 5 компонентов: вращение, перемещение, масштабирование, сдвиг и перспектива. Вы должны быть в состоянии взять формулы и просто отбросить 3-й компонент 3-х векторов.