Кватернионы и вращение вокруг мировой оси

11

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

Так или иначе ....

Что сбивает меня с толку, так это следующее. Когда я хочу повернуть объект вокруг его локальной оси, я умножаю его вращение на кватернион, представляющий вращение, которое я хочу применить. Следовательно, это вращение в локальном пространстве.

Теперь, если я хочу повернуть его вокруг оси в мировом пространстве, мои рассуждения будут таковы: возьмите вращение в мировом пространстве как кватернион. Умножьте обратное вращение моего объекта на этот кватернион. Это принесет вращение моего мира в локальном пространстве. Умножьте мое вращение на этот новый кватернион. то есть: newRot = oldRot * (обратный oldRot * worldRot)

Однако, что мне нужно сделать, это newRot = oldRot * (обратный oldRot * worldRot) * oldRot.

Почему мне после умножения с обратным кватом все еще нужно умножать на свой собственный кват перед его применением? Я знаю, что должна быть совершенно веская причина, но я не могу найти выход из нее, и это чертовски неприятно для меня. Я пробовал различные часто задаваемые вопросы и еще много чего, но большинство углубляется в математику, делая это менее понятным для меня.

Кто-нибудь, кто может объяснить это мне, как будто мне 5 лет?

Кая
источник
Разве это не похоже на матричные переводы и повороты (т. Е. Вам нужно переместить ваш объект в центр, повернуть и затем переместиться назад, если вы хотите повернуть объект вокруг себя самостоятельно: Minv_transl * Mrot * Mtransl)
Valmond
I try to reason about them like I would with matrices- тогда вы на правильном пути. Если вы понимали, как вращаться вокруг осей объекта и осей мира, используя матрицы, вы можете сделать то же самое, используя кватернионы. Порядок умножения одинаков для матриц и кватернионов.
Майк Земдер

Ответы:

11

Кватернионы ассоциативны:

Вы упоминаете, что ваше решение:

newRot = oldRot * (inverse oldRot * worldRot) * oldRot

что так же, как:

newRot = oldRot * inverse oldRot * worldRot * oldRot

что так же, как:

newRot = identity * worldRot * oldRot
newRot = worldRot * oldRot

что на самом деле возвращает вас к тому, что на самом деле происходит:

localTransformed = oldRot * rot
worldTransformed = rot * oldRot

Порядок применения меняется, вот и все. Возвращаясь к матрицам, когда вы применяете объектную матрицу к матрице преобразования и сохраняете ее как новую объектную матрицу, это ваше локальное пространственное преобразование. Когда вы применяете матрицу преобразования к матрице объектов и сохраняете ее, это ваше мировое преобразование. Все дело в порядке подачи заявки и не более того.

Ричард Фабиан
источник
1
+1 за первую часть, вторая часть немного вводит в заблуждение. Если бы вы использовали только «rot» в последнем примере кода, а не «localRot» и «worldRot», пример станет более понятным. В противном случае это означает , что сам гнили , так или иначе отличаются . Но разница заключается только в том порядке умножения, как вы показали, а не в разных кватернионах ( «localRot» и «worldRot»). «localTransformed» и «worldTransformed» было бы лучше , как: «rotatedAroundLocalAxis» и «rotatedAroundWorldAxis». Это само по себе объяснит уравнения и сделает последний абзац устаревшим, что имеет некоторые недостатки.
Maik Semder
Недостатки в последнем абзаце: различие между матрицей и преобразованием (оба здесь одинаковы и взаимозаменяемы, поэтому лучше использовать только матрицу для предотвращения путаницы) и термины «преобразование локального пространства» и «преобразование мира»: было бы больше правильнее сказать, первое уравнение дает «локально-миру матрице» после поворота вокруг локальной оси объекта, второй дает «локально-миру матрице» после того , как вращаются вокруг мировой оси. В обоих случаях вы получаете просто «локальную матрицу». Тем не менее, первая часть имеет мой +1 в любом случае для анализа.
Maik Semder
+1 @Maik , возможно , вы могли бы написать отдельный ответ , чтобы сделать безразличие между поворотами и вопросом умножения порядка более ясному? Спасибо за комментарий в любом случае!
Макс Доум
Ах, теперь это имеет смысл. Я не знал (ой, это было бы в FAQ), что умножение кватернионов было ассоциативным, поэтому вращение и его обратное отменяют друг друга, давая мне понимание, в котором я нуждался, у одного есть локальное вращение справа, а у другого - слева, которые в основном говорят «применить вращение в родительском пространстве» или «применить вращение в локальном пространстве» .... ничем не отличается от матриц. Довольно элементарно, когда ты это видишь! Спасибо!
Кадж