在OpenGL中旋转0

时间:2011-12-08 11:36:47

标签: c++ opengl quaternions

我正在使用四元数来旋转OpenGL中的对象,但我遇到一个问题,当我从5度旋转到-5度(穿过单位平面)时,我看到我的模型旋转“很长的路要走”。也就是说,它从5到-5旋转了整整350度,而不是飞机上的10度。这种情况发生在每个轴的旋转,任何时候我通过旋转0度“通过”,我不知道如何解决它。

我的代码看起来像这样,其中roll,pitch和yaw代表我对象旋转的欧拉角度:

quaternion[0] = cos(pitch/2)*cos(yaw/2)*cos(roll/2) + sin(pitch/2)*sin(yaw/2)*sin(roll/2);
quaternion[1] = sin(pitch/2)*cos(yaw/2)*cos(roll/2) - cos(pitch/2)*sin(yaw/2)*sin(roll/2);
quaternion[2] = cos(pitch/2)*sin(yaw/2)*cos(roll/2) + sin(pitch/2)*cos(yaw/2)*sin(roll/2);
quaternion[3] = cos(pitch/2)*cos(yaw/2)*sin(roll/2) - sin(pitch/2)*sin(yaw/2)*cos(roll/2);
glLoadIdentity();   
glPushMatrix();
glRotatef((float) (2.0f * acos(quaternion[0]) * 180.0f / PI), quaternion[1], quaternion[2], quaternion[3]);

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

问题不在于四元数或glRotate(),而在于计算旋转的步距。

可能你正在使用某种类型的归一化,其中像-5这样的负角被“纠正”到0..359范围内的值,所以它将变为355,然后你的旋转从5至355。