Как получить кватернион противоположного угла

Я вычисляю вращение кватерниона между двумя кватернионами.

Я знаю, что Q1 = r x Q2, поэтому я подумал, что r = Q1 x Q2* (звездочка означает сопряжение)

Это, однако, кажется, дает мне противоположный угол, который мне нужен.

бывший. Если Q1 и Q2 равны Pi/2, я получу кватернион -Pi/2. Как я могу получить правильный угол, который мне нужен?

Пример: я смотрю вперед на 45 градусов влево. Я двигаю мир вперед. Относительно взгляда, я еду на 45 градусов вправо. Мне нужно, чтобы r был поворотом на 45 градусов прямо в этой ситуации.

заранее спасибо


person ngong0    schedule 25.05.2014    source источник
comment
Ваша формула верна. Возможно, вы применяете кватернионы в неправильном порядке.   -  person Sneftel    schedule 26.05.2014
comment
@Sneftel Порядок умножения кватернионов, похоже, не имеет значения. Я попытался изменить, какой из них был сопряжен, но это вообще не сработало.   -  person ngong0    schedule 26.05.2014
comment
Можете ли вы привести пример Q1 и Q2, которые не дают ожидаемых результатов?   -  person Sneftel    schedule 26.05.2014
comment
Кватернионы — это мировое пространство и пространство просмотра в игре XNA. Я использую q1 как (0,0,0,1) и q2 как (-.3761814, .2987422, .05993626, .8750133) и получаю результат (.3761814, -.2987422, -.05993626, .8750133) ) Я спрягаю q2. Извините за правки   -  person ngong0    schedule 26.05.2014
comment
Эти результаты верны. Если применить этот результат, а затем Q2, получится Q1.   -  person Sneftel    schedule 26.05.2014
comment
Однако это не правильно для моего приложения. Мне нужна противоположность угла, который я получаю.   -  person ngong0    schedule 26.05.2014


Ответы (1)


Описание проблемы мне было не совсем понятно. Я думаю, что, вероятно, лучше всего вывести формулу, которую вы нашли. Надеюсь, это должно позволить вам понять (и визуализировать), почему вы можете получить именно тот результат, который у вас есть.

Для двух кватернионов, Q1 и Q2, относительный поворот кватерниона от Q1 до Q2 равен:

Quaternion = relativeRotation = Q1^(-1) * Q2

Где Q1^(-1) обозначает инверсию Q1. Вы можете думать об этом как о применении противоположного вращения Q1 к Q2. Результатом будет относительное вращение между ними. Инверсию кватерниона можно вычислить следующим образом:

Q^(-1) = (Q*) / ||Q||^2

Где Q* обозначает конъюгат Q. Я предполагаю, что вы уже знаете, как найти сопряжение кватерниона. Теперь, если Q является единичным кватернионом, то и норма, и квадрат нормы Q равны 1,0. Следовательно, мы имеем:

Q^(-1) = Q*

Это упрощает нашу формулу:

Quaternion relativeRotation = (Q1*) * Q2

Обратите внимание, что только единичные кватернионы представляют повороты. Однако, поскольку произведение Гамильтона двух единичных кватернионов само по себе является единичным кватернионом, нам не нужно нормализовать результат.

Теперь из этого относительного кватерниона можно определить угол (в радианах):

float angle = 2.0f * acos(relativeRotation.w)

Здесь w — скалярная составляющая кватерниона, а acos — тригонометрическая функция арккосинуса. Этот угол равен оси:

Vector3 axis = (relativeRotation.x, relativeRotation.y, relativeRotation.z)

Теперь, найдя и угол, и ось, вы сможете визуализировать вращение.

Наконец, в качестве примечания, произведение Гамильтона (*) не коммутативно. Это означает, что (Q1*) * Q2 не обязательно равно Q2 * (Q1*). Следуя тому же выводу, что и выше, относительное единичное вращение кватерниона от Q2 до Q1 можно рассчитать по формуле:

relativeRotation = (Q2*) * Q1
person Homar    schedule 31.05.2014
comment
Qr = (Q1*) * Q2, кажется, подразумевает, что уравнение вращения Q2 = Q1 * Qr, но, как упоминалось в OP, они работают с (более распространенным?) уравнением вращения: Q2 = Qr * Q1. В этом случае, разве уравнение относительного вращения не должно быть Qr = Q2 * (Q1*)? Разве не поэтому ОП получает обратные результаты? - person davidA; 26.06.2019