Вчера я спросил: Как простой вызов Pitch and 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();
}
Что заставляет камеру отклоняться / рыскать в зависимости от движения мыши (удерживая курсор в центре). Я также разместил свой оригинальный класс камеры здесь .
Кто-то из этой ветки предложил мне использовать кватернионы, чтобы не допустить возникновения этого эффекта, но после прочтения на них страницы Википедии я просто не стал их грести.
Как я мог создать Quaternions в своем приложении OpenGL / Glut, чтобы я мог правильно смотреть вокруг своей «Камеры» без нежелательного поворота?