c++ - 四元数减法/加法和四元数逆运算有什么区别?
问题描述
我正在阅读有关 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 的逆,使用加法而不是乘法,因为这很直观。
你能解释一下区别吗?
解决方案
假设你有两个不同的四元数 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
四元数加法有用吗?答案是肯定的!!当你想插入四元数时,你实际上是对它们进行加权求和。实际上,您可以通过将四元数相加然后归一化来平均,您将获得一个有效的四元数。
推荐阅读
- javascript - React 路由更改 URL 但不加载组件
- angular - Angular 9 - 解析给定网址的每个参数
- elasticsearch - 尝试过滤该字段可能不存在的一些 Elasticsearch 结果
- python - 如何修复 langdetect 不稳定的结果
- javascript - 节点:使用 promise.all() 来并行调用 API?
- ios - 如何使用 Rx 在 tableView 中使用多个单元格?
- python - 蟒蛇 | 使用套接字连接到远程服务器
- regex - 在查询中使用通配符重写条件
- javascript - 如何开玩笑地模拟回调?
- postgresql - Postgres - 仅选择列值更改的行