В чем разница между вычитанием/сложением кватернионов и обратной операцией кватернионов?

#c #animation #math #quaternions

Вопрос:

Я читал документ об аддитивной анимации , который добавляет одну анимацию к другой;

Приведенный ниже код демонстрирует алгоритм:

 glm::quat rotDiff = rotQuat2 * glm::inverse(sourceRot);
glm::vec3 posDiff = posVec2 - sourceVec;
auto rotQuat = rotQuat1* rotDiff;
auto posVec = posVec1   posDiff;
 

rotDiff-это поворот, который следует добавить в исходную анимацию;
rotDiff рассчитывается с rotQuat2 * glm::inverse(sourceRot) помощью , это одна строка, которую я не совсем понимаю,
Третья строка rotQuat = rotQuat1 * rotDiff -это еще одна, которую я не совсем понимаю.

Если бы я написал этот алгоритм, я бы хотел rotDiff = rotQuat2 - sourceRot
rotQuat = rotQuat1 rotDiff , то есть, использовать вычитание вместо умножения, обратное исходному, использовать сложение вместо умножения, потому что это интуитивно понятно.

Не могли бы вы, пожалуйста, объяснить разницу ?

Класс кватернионов выглядит следующим образом https://cs.stanford.edu/~acoates/кватернион.h

Комментарии:

1. Если вы намерены объединить 3d-преобразования, вы можете сделать это, умножив соответствующие матрицы 4×4. (Пожалуйста, обратите внимание: умножение , а не сложение ) Почему? Потому что умножение матриц приводит к предполагаемому эффекту «цепных преобразований», в то время как добавление просто привело бы к отбросу чисел относительно этого. Вот как работает математика… (Я использовал матрицы 4×4 в качестве аналогии, так как кватернионы еще труднее понять в IMHO.)

2. @Scheff’Scat, Но почему класс кватернионов предоставляет оператор и оператор- ? для чего они используются?

3. Должен признаться, я понятия не имел, но я нашел аналогичный вопрос в gamedev: является ли добавление кватернионов полезной операцией? 😉 Насколько я понял, это похоже на карты суши: на самом деле мы идем по сфере, но на коротких расстояниях вы можете притвориться, что это плоскость, и использовать евклидову геометрию, которая на самом деле не подходит для поверхности сферы.

Ответ №1:

Предположим, у вас есть два разных кватерниона Q1 и Q2. Вы можете умножить Q1 на другой кватернион, скажем, Qx, чтобы получить кватернион Q2. Это может быть записано в уравнении типа:

Q2 = Qx Q1

Как вы можете найти Qx? Ответ заключается в умножении обеих сторон на обратную величину Q1, так что

Q2 Q1^-1 = Qx Q1 Q1^-1

Q2 Q1^-1 = Qx

В некотором смысле Qx-это «мультипликативная» разница между Q1 и Q2.

Почему умножение вместо вычитания? Причина в том, что вращение (в общем случае) применяется к векторам с использованием умножения, а не сложения, как R v. Когда вы применяете последовательные вращения к вектору, вы умножаете его на вращения несколько раз, например R2 (R1 v). Поскольку умножение матриц (и умножение кватернионов) ассоциативно, вы можете комбинировать последовательные вращения, такие как (R2 R1) v

Полезно ли вообще добавление кватернионов? Ответ-ДА!! Когда вы хотите интерполировать кватернионы, вы, по сути, выполняете их взвешенную сумму. На самом деле вы можете усреднить кватернионы, просто добавив их, а затем нормализовав, вы получите действительный кватернион.