Чи можна перетворити 3d-матрицю обертання (4х4) на її складові частини (обертання, масштаб тощо)?


11

Щоб бути більш конкретним, я працюю над додатком для iOS і маю CATransform3Dструктуру (в основному масив трансформації 4x4).

Чи можна вивести всі різні "операції", з яких випливає ця матриця? Такі речі, як обертання, масштаб і т. Д. Це означає?

Відповіді:


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


2
Чи можете ви уточнити, які проблеми з точністю з плаваючою комою? Я не бачу в цьому способі нічого, що могло б викликати проблеми з точністю, якщо тільки шкала не є надзвичайно екстремальною. Також варто зауважити, що цей метод може виявитися невдалим, якщо матриця була складена з послідовності матриць, яка включає як неоднорідні шкали, так і обертання. матриця вийде не бути обертання в цьому випадку, але буде включати в себе деяке зрушення. R
Натан Рід

2
Усі номери з плаваючою комою мають внутрішню (обмежену) помилку. Кожен раз, коли ви виконуєте операції, зокрема складання чи віднімання, ви ускладнюєте помилку, збільшуючи величину меж. В алгоритмі декомпозиції приховано багато операцій додавання (як у множенні матриці, так і в обчисленні величини масштабу) та квадратного кореня (у шкалі). Подальше розкладання введе подальшу помилку.
Тімбо

1
@Timbo Тут немає жодного повного множення матриць, хоча просто множення стовпців матриці на обернені шкали. А векторна величина передбачає додавання всіх позитивних величин, тому катастрофічного скасування там немає; це не створює великої відносної помилки, AFAICT. У будь-якому випадку автор уточнив, що вони говорять про подальше розкладання матриці обертання на кути Ейлера чи подібні, що має більше сенсу.
Натан Рід

Спасибі - чудова відповідь. Наступні дії: щоб повернути оригінальну матрицю назад, я припускаю, що нам потрібно дотримуватися певного порядку операцій, починаючи з матриці ідентичності. Чи буде це замовлення TRS?
ельсурудо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.