Добавление локального вращения к глобальному вращению

Я пробовал много формул и преобразований, но ничего не дало ожидаемого результата.

Сценарий очень простой:

Как 3DS Max и другие 3D-программы выполняют «преобразование» приращения локального вращения в глобальное абсолютное вращение?

Пример может помочь вам понять: 3DS Max - Maya - Modo (все три дали мне один и тот же результат, поэтому я склонен полагать, что этот результат правильный.) Предполагая абсолютный порядок вращения как XYZ.

1. World Rotation Y = 35.0;
2. Local Rotation X = 35.0;

После этих преобразований, в таком порядке, я смотрю на Мировое Абсолютное вращение и вижу X:40.524 Y:-28.024 Z:-21.881

Как они достигают такого результата? Что за формула? Используя матрицу, углы Эйлера или кватернионы, что угодно, как я могу получить тот же результат?

Спасибо.

PS: Простым решением может быть использование кватерниона или матрицы, добавление локального поворота к глобальному, а затем получение абсолютного результата. Но это не работает, потому что таким образом мы не можем контролировать порядок вращения, результат всегда получается с использованием порядка формулы для извлечения значений.


person user464230    schedule 06.06.2011    source источник
comment
Ваш постскриптум не имеет особого смысла. Из углов Эйлера вы можете построить (И деконструировать) матрицу вращения, используя любой порядок вращения, который вам нравится. Вашим пользователям будет намного понятнее, если вы будете придерживаться единого порядка ротации.   -  person Paul-Jan    schedule 07.06.2011


Ответы (2)


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

WorldMat * LocalMat [* column vector]

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

Точно так же, если вы работаете с кватернионами, вы должны умножать свои кватернионы (а не добавлять их).

person James    schedule 06.06.2011

Матрицы вращения выглядят следующим образом (при условии представления вектора-столбца):

[   1      0       0   ]
[   0    cos(a)  sin(a)] = Rx(a)
[   0   -sin(a)  cos(a)] 

[ cos(a)   0    -sin(a)]
[   0      1       0   ] = Ry(a)
[ sin(a)   0     cos(a)]

[ cos(a) sin(a)   0    ]
[-sin(a) cos(a)   0    ] = Rz(a)
[   0      0      1    ]

Умножение «местного» означает, что матрица идет справа. Умножение «глобального» означает, что матрица идет слева. Итак, ваше вращение равно Ry(35°)*Rx(35°). Или примерно:

[ .819  .329 -.469 ]
[  0    .019  .574 ]
[ .574 -.470  .671 ]

Порядок вращения Эйлера XYZ означает Rx(ax)*Ry(ay)*Rz(az). Итак, если вы подставите числа Rx(40,524°)*Ry(-28,024°)*Rz(-21,881), вы получите примерно (с точностью до ошибки округления) ту же матрицу (я сделал попробуйте, просто для уверенности).

person JCooper    schedule 17.06.2011