我正在传播一个四元数,从用户鼠标输入中创建一个四元数,其中创建一个四元数,用于X轴中的附加旋转,一个用于Y轴,并将这些旋转组合成一个四元数。我一直在相机四元数中添加(附加)这些变化,因此创建了一个无微光锁的相机(它仍然像疯了一样滚动)。
当我开始旋转相机的时候,旋转矩阵就开始缩放,失去控制。当我将相机四元数的每一帧标准化时,一切都很正常,但是不应该需要对每一帧进行规范化,对吧?如果这是数字漂移,那么它就不能这么快就被看到,对吗?
在这个问题中:Quaternion and normalization
大卫·哈曼( David Hammen )发表了以下评论:
归一化是将四元数拖回单位3球体的一个传说.四元数偏离流形的原因是欧拉步长在数学上是无效的:单位四元数是一个群,而不是代数。不使用单位四元数也是无效的;现在您没有关于so(3)的图表。如果做得好(例如,Lie组集成技术),那么四元数几乎就会停留在流形上。你可能还需要偶尔正常化。
是不是因为我从欧拉旋转中产生了两个四元数,这就是我旋转错误的原因?
欧拉旋转产生的四元数在使用前是否应该标准化?
发布于 2014-03-17 11:40:50
首先,找出你的四元数是否变成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
}https://stackoverflow.com/questions/17134228
复制相似问题