Я пытаюсь написать несколько юнит-тестов и понимаю, что не знаю, как сравнивать кватернионы. Мне нужно знать, представляют ли два кватерниона одинаковую ориентацию (объект будет смотреть одинаково). С векторной позицией я бы просто сравнил детали и проверил, что они достаточно близки, но для кватернионов значения могут сильно отличаться.
Как я могу сравнить два кватерниона?
mathematics
эд-ка морт-ора-й
источник
источник
q
и-q
). Наивным (в вычислительном отношении) способом было бы применить оба кватерниона к одному и тому же вектору и посмотреть, отличаются ли их векторные результаты ..Ответы:
Если ваши два кватерниона равны
q1
иq2
, они представляют один и тот же поворот, если выполняется любое из этих двух условий:q1
компонентный примерно равенq2
ИЛИq1
компонентный примерно равен-q2
Зная это, вы можете написать довольно упрощенный тестер равенства, который соответствует вашей цели.
источник
q
и-q
представляет ту же ориентацию (о которой просили), но не одно и то же вращение. Это очень важно при интерполяции.q
и-q
когда представлен как оператор вращения угловой оси. Так что, действительно, технически эффект этих вращений одинаков, хотя операторы - нет. И, да, при СЛЕРПИНГЕ необходимо убедиться, что он лежит на одномq1
иq2
том же полушарии гиперсферы S3, чтобы спеллер выбрал кратчайший путь.2pi-angle
, поэтому он поворачивает длинный путь вокруг отрицательных осей. Иногда это то, что вы хотите, хотя; это просто что-то, о чем нужно знать,q1 dot q2 > 0
результаты в короткий поворот,q1 dot q2 < 0
долгий поворот.Просто потому, что это не было упомянуто. Поскольку кватернионы, используемые для пространственной ориентации, всегда имеют единичную длину (или должны быть), будет также работать следующее.
где EPS - некоторый коэффициент выдумки, чтобы учесть небольшие ошибки из-за ограниченной точности с плавающей запятой. Если (и только если) оба кватерниона представляют одну и ту же ориентацию, то
q1 = +- q2
и такq1.dot(q2) = +- 1
. Если вы хотите убедиться, что они имеют одинаковое вращение (а не просто ориентацию), то удалитеabs
.источник
Кватернионы хранятся как 4 числа с плавающей точкой или двойные, часто называемые x, y, z и w, где первые три представляют ось, а w - степень вращения вокруг этой оси.
Наивным подходом было бы просто сравнить эти числа двух кватернионов на равенство. Однако, поскольку вычисления с плавающей запятой связаны с ошибкой, вы должны по крайней мере использовать ошибку, часто называемую eps (для epsilon), и сравнивать каждый компонент следующим образом.
Лучшим тестом было бы рассчитать скалярное произведение двух кватернионов и проверить, близко ли оно к 1,0. Вы должны посмотреть на уравнение кватернионов с sin и cos и просто поставить два кватерниона, тогда вы должны легко понять, почему это работает.
источник
Основываясь на всех предложениях использовать Dot и EPS, я обнаружил, что используя (в единстве):
работал хорошо без меня, чтобы принять решение о размере EPS.
источник