Puede alguien explicarme cómo puedo usar Quanternions para usar el mouse para mirar a mi alrededor como un FPS?

Ayer pregunté: ¿Cómo podría simplemente llamar a Pitch and Yaw y hacer que la cámara ruede?

Básicamente, descubrí debido a "Gimbal Lock" que si lanzas + guiñadas inevitablemente producirás un efecto de balanceo. Para obtener más información, puede leer esa pregunta.

Estoy tratando de evitar que esto suceda. ¡Cuando miras a tu alrededor en un juego de disparos FPS normal, no tienes tu cámara rodando por todas partes!

Aquí está mi función actual de mouse pasivo:

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

}

Lo que hace que la cámara se incline / guiñe según el movimiento del mouse (manteniendo el cursor en el centro). También publiqué mi clase de cámara originalaqu.

Alguien en ese hilo sugirió que use Quaternions para evitar que ocurra este efecto, pero después de leer elwikipedia página sobre ellos simplemente no los asimilo.

¿Cómo podría crear un Quaternions en mi aplicación OpenGL / Glut para que pueda hacer que mi "Cámara" mire a su alrededor sin un rollo no deseado?

Respuestas a la pregunta(4)

Su respuesta a la pregunta