如何正确计算两个四元数间满足一致性的相对旋转差值

核心原因
你当前公式计算的是世界坐标系下的绝对旋转差,而你需要的是物体局部坐标系下的相对旋转,二者四元数乘法顺序有本质区别。
Quaternion q = B * Inverse(A)的计算逻辑是:先将A从当前姿态旋转回世界坐标系原点对齐状态,再旋转到B的姿态,整个过程的旋转参考轴为固定的世界坐标轴。你的两个测试场景中,虽然立方体B均绕自身Z轴旋转90度,但两个场景下立方体自身Z轴在世界坐标系中的朝向完全不同,计算得到的世界系旋转差自然不相等。
正确实现
要得到与A的全局姿态无关、仅反映A到B局部相对旋转的结果,调换乘法顺序即可:
Quaternion q = Inverse(A) * B
该公式的物理意义是:先将全局旋转变换到A的局部坐标系下,再计算A到B的旋转差。只要B是A绕自身局部坐标轴旋转固定角度得到的,无论A在世界空间中的初始朝向如何,计算得到的q都会完全一致。代入你示意图中的两组测试数据,输出结果都会是绕局部Z轴旋转90度对应的标准四元数,符合预期。
补充说明
- 上述乘法顺序适配绝大多数图形学领域常用的列主序四元数实现(包括Unity、Unreal、Three.js等引擎/库的内置接口);若使用少数行主序数学库,需对应调换乘法顺序,核心逻辑不变:计算局部相对旋转时,必须先将两个姿态转换到参考物体(A)的局部空间再做差,不能直接在世界空间做差。
- 示意图中标注的立方体局部朝向箭头不影响该计算逻辑,只要四元数旋向定义与所用坐标系手性匹配,计算结果就是稳定的。
内容的提问来源于stack exchange,提问作者Blubber
相关产品推荐
相关产品推荐

