Добавление локального вращения в глобальное вращение - PullRequest
0 голосов
/ 06 июня 2011

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

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

Как 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: Простое решение может быть использование кватерниона или матрицы, добавитьлокальное вращение в глобальный, а затем получить абсолютный результат.Но это не очень хорошо работает, потому что в этом случае мы не можем контролировать порядок вращения, результат всегда приходит с использованием порядка формулы для получения значений.

Ответы [ 2 ]

1 голос
/ 06 июня 2011

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

WorldMat * LocalMat [* column vector]

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

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

0 голосов
/ 17 июня 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    ]

Умножение 'local' означает, что матрица идет справа.Умножение «глобальный» означает, что матрица идет слева.Таким образом, ваше вращение составляет 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) , вы получите примерно (в пределах ошибки округления) ту же матрицу (я пыталсяэто, просто чтобы убедиться).

...