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