四元数正态化期间保持旋转

我一直在研究四元数的即将到来的项目,并且遇到了一个概念性问题,我无法将我的头围绕。

正常化四元数的方法如下:

q_mag = sqrt(q0^2+q1^2+q2^2+q3^2)
q0 = q0/q_mag  
q1 = q1/q_mag   
q2 = q2/q_mag  
q3 = q3/q_mag

直线前进,就像标准化任何其他矢量一样。 但我的问题是,这种规范化方法如何保留相同的旋转信息。 使用表示如下所示的轴角表示的四元数的定义,

angle = 2 * acos(q0)
x = qx / sqrt(1-q0*q0)
y = qy / sqrt(1-q0*q0)
z = qz / sqrt(1-q0*q0)

由于规范化操作将x,y,z值均等地缩放,所以旋转的轴永远不会改变。 但是,角度本身的价值随着规范化操作剧烈变化。

那么使用保留q0值的方法并仅调整其他点以达到标准化的方法会更有意义吗?


数学答案:单位四元数表示3D空间中的旋转。 任何其他(即:非单位)四元数不代表旋转,因此公式角度= 2 * acos(q0)不适用于这些四元数。 所以标准化时角度没有变化,因为你要归一化的四元数并不代表旋转。

编程答案:浮点运算有准确性问题。 这些问题会导致很小的错误,如果累积起来可能会造成很大的错误。 当乘以两个单位四元数时,数学结果是另一个单位四元数。 然而,单位四元数乘法的浮点实现可能导致四元数的范数接近1但不等于1.在这种情况下,我们将归一化四元数来纠正错误。 当我们归一化时,我们将q0除以非常接近1的范数,所以q0的值没有大的变化。 因为我们早期规范化,所以规范总是非常接近1,我们不需要担心精度。

迟到的答案,但我希望它有帮助。

链接地址: http://www.djcxy.com/p/81763.html

上一篇: Maintaining rotation during Quaternion normalization

下一篇: OpenGL, GLM Quaternion Rotations