四元数即时数值漂移

时间:2013-06-16 14:18:29

标签: rotation quaternions rounding-error

我正在传播四元数,用户鼠标输入创建的变化很小,我在X轴上创建一个四元数,在Y轴上创建一个四元数,并将这些旋转组合成一个四元数。我不断将这些更改添加(附加)到相机四元数,因此创建了一个无闪烁锁相机(仍然像疯了一样滚动:S)

当我开始旋转相机时,旋转矩阵开始缩放并且歪斜失控。当我每帧标准化相机四元数时,一切正常,但是不应该对每一帧进行标准化吗?如果这是数字漂移,那么它很快就不可见了吗?

在这个问题中:Quaternion and normalization

David Hammen发表了这条评论:

  

标准化是将四元数拖回单元的一种方法   3球。四元数从歧管上漂移的原因是因为   欧拉步骤在某种意义上是无效的数学:单位   四元数是一个群体,而不是代数。不使用单位四元数是   也无效;现在你没有图表(3)。做得对(例如,   李群集成技术)和四元数将非常相似   留在歧管上。您可能仍需要偶尔标准化

可能是因为我正在从欧拉旋转中创建两个四元数,这是导致旋转错误的原因吗?

从欧拉旋转生成的四元数是否应在使用前进行标准化?

1 个答案:

答案 0 :(得分:0)

首先,查看您的四元数是否变为NON单元?和问题的来源。

我建议在伪代码中使用鲁棒转换为非单位四元数矩阵

inline void to_matrix( matrix33& m  )const  {
        float wx, wy, wz, xx, yy, yz, xy, xz, zz, x2, y2, z2;
        float s  = 2.0f/norm_2_sqr(); 
        x2 = x * s;    y2 = y * s;    z2 = z * s;
        xx = x * x2;   xy = x * y2;   xz = x * z2;
        yy = y * y2;   yz = y * z2;   zz = z * z2;
        wx = w * x2;   wy = w * y2;   wz = w * z2;

        m.m[0][0] = 1.0f - (yy + zz);
        m.m[0][1] = xy - wz;
        m.m[0][2] = xz + wy;

        m.m[1][0] = xy + wz;
        m.m[1][1] = 1.0f - (xx + zz);
        m.m[1][2] = yz - wx;

        m.m[2][0] = xz - wy;
        m.m[2][1] = yz + wx;
        m.m[2][2] = 1.0f - (xx + yy);

        //1 division    16 multiplications    15 addidtions    12 variables
    }