昨天我问:简单地调用 Pitch 和 Yaw 怎么会导致相机滚动?
基本上,我发现是因为“Gimbal Lock”,如果你俯仰+偏航,你将不可避免地产生滚动效果。有关更多信息,您可以阅读该问题。
我正试图阻止这种情况发生。当您在普通的 FPS 射击游戏中环顾四周时,您的相机不会到处滚动!
这是我当前的被动鼠标功能:
int windowWidth = 640;
int windowHeight = 480;
int oldMouseX = -1;
int oldMouseY = -1;
void mousePassiveHandler(int x, int y)
{
int snapThreshold = 50;
if (oldMouseX != -1 && oldMouseY != -1)
{
cam.yaw((x - oldMouseX)/10.0);
cam.pitch((y - oldMouseY)/10.0);
oldMouseX = x;
oldMouseY = y;
if ((fabs(x - (windowWidth / 2)) > snapThreshold) || (fabs(y - (windowHeight / 2)) > snapThreshold))
{
oldMouseX = windowWidth / 2;
oldMouseY = windowHeight / 2;
glutWarpPointer(windowWidth / 2, windowHeight / 2);
}
}
else
{
oldMouseX = windowWidth / 2;
oldMouseY = windowHeight / 2;
glutWarpPointer(windowWidth / 2, windowHeight / 2);
}
glutPostRedisplay();
}
这会导致相机根据鼠标移动进行俯仰/偏航(同时将光标保持在中心)。我还在这里发布了我原来的相机课程。
该线程中的某个人建议我使用四元数来防止这种效果发生,但在阅读了关于它们的维基百科页面后,我根本不了解它们。
如何在我的 OpenGL/Glut 应用程序中创建四元数,这样我就可以正确地让我的“相机”环顾四周而不会出现不必要的滚动?