2

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

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

在这个问题中:四元数和归一化

大卫哈门发表了这条评论:

归一化是将四元数拖回单位 3 球体的杂项。四元数偏离流形的原因是因为欧拉步在某种意义上在数学上是无效的:单位四元数是一个群,而不是代数。不使用单位四元数也是无效的;现在您没有关于 so(3) 的图表。做对了(例如,李群积分技术),四元数几乎会留在流形上。您可能仍需要偶尔进行标准化

可能是因为我从欧拉旋转中创建了两个四元数,这就是我剧烈旋转错误的原因吗?

欧拉旋转产生的四元数是否应该在使用前进行归一化?

4

1 回答 1

0

首先,看看你的四元数是否变成了NONunit?和问题的根源。

我建议在伪代码中使用对非单位四元数矩阵的稳健转换

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
    }
于 2014-03-17T11:40:50.227 回答