首页 > 解决方案 > 四元数减法/加法和四元数逆运算有什么区别?

问题描述

我正在阅读有关 Additive Animation 的文档,该文档为另一个添加了一些动画;

下面的代码演示了该算法:

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,即使用减法而不是乘以 sourceRot 的逆,使用加法而不是乘法,因为这很直观。

你能解释一下区别吗?

四元数类是这样的https://cs.stanford.edu/~acoates/quaternion.h

标签: c++animationmathquaternions

解决方案


假设你有两个不同的四元数 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

四元数加法有用吗?答案是肯定的!!当你想插入四元数时,你实际上是对它们进行加权求和。实际上,您可以通过将四元数相加然后归一化来平均,您将获得一个有效的四元数。


推荐阅读