在OpenGL中旋转到0

Rotating across 0 in OpenGL

本文关键字:旋转 OpenGL      更新时间:2023-10-16

我使用四元数在OpenGL中旋转对象,但我遇到了一个问题,当我从5度旋转到-5度(穿过单位平面)时,我看到我的模型旋转"很长一段路"。也就是说,它从5到-5旋转了整整350度,而不是在平面上旋转10度。这种情况发生在每个轴的旋转中,每当我通过旋转0度来"传递go"时,我不确定如何修复它。

我的代码看起来像这样,其中滚动,俯仰和偏航代表我的对象旋转的欧拉角:

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]);

有什么建议吗?

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

可能你正在使用某种标准化,其中像-5这样的负角度被"纠正"到0范围内的值。359,所以它将变成355,然后你的旋转从5到355。