Можно ли превратить трехмерную матрицу вращения (4x4) в составные части (вращение, масштаб и т. Д.)?

11

Чтобы быть более конкретным, я работаю над приложением для iOS, и у меня есть CATransform3Dструктура (в основном массив преобразования 4x4).

Можно ли вывести все различные «операции», которые подразумевает эта матрица? Такие вещи, как вращение, масштаб и т.д.

elsurudo
источник

Ответы:

10

Вы можете разложить матрицу на базовые преобразования: перемещение, масштабирование и вращение. Учитывая эту матрицу:M=TRS

M=[a00a01a02a03a10a11a12a13a20a21a22a230001]

t=(a03,a13,a23)

s=(s0,s1,s2)

s0=(a00,a10,a20)s1=(a01,a11,a21)s2=(a02,a12,a22)

Теперь у вас есть шкала, вы можете избавиться от нее, используя подматрицу , соответствующую , умножив матрицу на обратную шкалу чтобы get3×3RSS1R

(RS)S1=[a00a01a02a10a11a12a20a21a22][s0000s1000s2]1=[a00a01a02a10a11a12a20a21a22][1/s00001/s10001/s2]

Таким образом ( ):(RS)S1=RI=R

R=[a00/s0a01/s1a02/s2a10/s0a11/s1a12/s2a20/s0a21/s1a22/s2]

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


Этот метод дает только эквивалентные значения в виде перевода, масштабирования и поворота (исходная матрица может быть результатом других типов преобразований). Могут возникнуть проблемы с точностью с плавающей точкой с углами поворота, если вы в дальнейшем будете использовать разложенные углы, ошибки округления могут накапливаться в вычислениях. Вам не следует использовать его, если вы сами не создали матрицу.

Если вы - тот, кто построил матрицу и хотел разложения, чтобы иметь возможность редактировать и отображать перевод, масштабирование и вращение по отдельности и независимо , вероятно, самое чистое, почему хранить компоненты , и в классе преобразования индивидуально как векторы (может быть кватернионом для вращения). Только когда вам нужна матрица преобразования, создайте матрицу из этих компонентов (матрицу можно кэшировать до тех пор, пока какой-либо компонент не будет изменен).tsrTRS

user5488
источник
2
Не могли бы вы уточнить, в чем проблемы с точностью с плавающей точкой? В этом методе я не вижу ничего такого, что могло бы вызвать проблемы с точностью, если масштаб действительно не экстремальный. Также стоит отметить, что этот метод может потерпеть неудачу, если матрица была составлена ​​из последовательности матриц, которая включает в себя как неоднородные шкалы, так и повороты. В этом случае матрица не будет вращением, но будет включать некоторый сдвиг. R
Натан Рид
2
Все числа с плавающей запятой имеют внутреннюю (ограниченную) ошибку. Каждый раз, когда вы выполняете операции, в частности сложение или вычитание, вы составляете ошибку, увеличивая величину границ. В алгоритме декомпозиции скрыты многие операции сложения (как при умножении матрицы, так и при вычислении величины масштаба) и квадратный корень (в масштабе). Дальнейшее разложение внесет дополнительную ошибку.
Тимбо
1
@ Тимбо Здесь нет полного умножения матрицы, просто умножение столбцов матрицы на обратные шкалы. А величина вектора включает в себя добавление всех положительных величин, поэтому там нет катастрофической отмены; это не дает много относительной ошибки, AFAICT. Во всяком случае, автор пояснил, что речь идет о дальнейшем разложении матрицы вращения на углы Эйлера или тому подобное, что имеет больше смысла.
Натан Рид
Спасибо - отличный ответ. Продолжение: чтобы вернуть исходную матрицу, я предполагаю, что нам нужно следовать определенному порядку операций, начиная с единичной матрицы. Будет ли этот заказ TRS?
elsurudo