Вчера я спросил: Как могло просто вызов "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, чтобы предотвратить этот эффект, но после прочтения страницы википедии на них я их просто не гляжу.
Как я могу создать Quaternions в моем приложении OpenGL / Glut, чтобы я мог правильно заставить мою «камеру» смотреть вокруг без нежелательного поворота?