我正在传播四元数,用户鼠标输入创建的变化很小,我在X轴上创建一个四元数,在Y轴上创建一个四元数,并将这些旋转组合成一个四元数。我不断将这些更改添加(附加)到相机四元数,因此创建了一个无闪烁锁相机(仍然像疯了一样滚动:S)
当我开始旋转相机时,旋转矩阵开始缩放并且歪斜失控。当我每帧标准化相机四元数时,一切正常,但是不应该对每一帧进行标准化吗?如果这是数字漂移,那么它很快就不可见了吗?
在这个问题中:Quaternion and normalization
David Hammen发表了这条评论:
标准化是将四元数拖回单元的一种方法 3球。四元数从歧管上漂移的原因是因为 欧拉步骤在某种意义上是无效的数学:单位 四元数是一个群体,而不是代数。不使用单位四元数是 也无效;现在你没有图表(3)。做得对(例如, 李群集成技术)和四元数将非常相似 留在歧管上。您可能仍需要偶尔标准化
可能是因为我正在从欧拉旋转中创建两个四元数,这是导致旋转错误的原因吗?
从欧拉旋转生成的四元数是否应在使用前进行标准化?
答案 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
}