我在 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]);
有什么建议吗?
最佳答案
问题不是您的四元数或 glRotate(),而是您计算旋转步距的地方。
可能您正在使用某种归一化,其中像 -5
这样的负角被“校正”为 0..359 范围内的值,因此它将变为 355 并且您的旋转然后从 5 执行到 355。
关于c++ - 在 OpenGL 中旋转 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8430426/