是否存在可精确表示90度旋转且保留双重覆盖性的四元数计算机表示方法?
单位四元数精确表示轴对齐90度旋转的方案探讨
用单位四元数在计算机中表示3D旋转,相比3×3正交矩阵有不少优势,但它存在一个明显缺憾:无法精确表示轴对齐的90度旋转。比如绕z轴将+x轴转到+y轴的90度旋转,对应的四元数表示为[w=√(1/2), x=0, y=0, z=√(1/2)],这种浮点表示会带来一系列问题:
- 用该四元数对向量v做旋转,无法实现精确的90度旋转
- 连续四次应用该旋转后,无法精确还原到原向量v
- 将该四元数平方,得不到对应轴180度旋转的精确表示;八次方也无法得到单位四元数
因此在需要轴对齐90度旋转及其组合精确无浮点误差的场景中,有时不得不改用3×3矩阵,但矩阵表示也并非理想选择:它会丢失四元数特有的双重覆盖特性(即四元数可区分单位元和360度旋转,而3×3旋转矩阵做不到),同时也不具备四元数无需重新正交化的优良数值特性。
核心问题:是否存在一种单位四元数的计算机表示方法,既能避免上述不精确问题,又能保留双重覆盖特性?
以下是几种尝试的方案:
方案一:扩展浮点数表示四元数元素
将四元数的四个元素各表示为一对机器可表示的浮点数[a, b],即元素值为a + b√2,这样一个四元数需要用8个浮点数存储。
该方案能解决精确性问题,但开销极大:计算长序列四元数乘积时,原四元数乘法中的每个运算都会转化为更多浮点运算;对于非这类“理想”旋转的场景,额外的计算和存储完全是冗余的。
方案二:存储元素的符号与平方值
将四元数q = w + xi + yj + zk表示为四元组[sign(w)*w², sign(x)*x², sign(y)*y², sign(z)*z²]。
这种表示简洁,且对目标子群(轴对齐90度旋转及其组合)具备无损耗特性,但无法在该表示下直接实现四元数乘法。
方案三:存储q²而非q
起初看似可行,但同样无法在该表示下实现无损耗乘法,而且会直接丢失双重覆盖特性。
内容的提问来源于stack exchange,提问作者Don Hatch
相关产品推荐
相关产品推荐

