2011-10-29 59 views
10

Tengo un objeto que quiero rotar con las teclas. El objeto debe guiñar, lanzar y rodar. Después de probar mucho, me di cuenta de que glRotate tiene sus limitaciones y que no será posible implementar algo así con esa función.De cuaterniones a rotaciones OpenGL

Investigué un poco y descubrí la rotación basada en cuaterniones. También sería posible rotar a través de una matriz de rotación, pero casi todos describen los cuaterniones como los mejores de todos.

He leído sobre los cuaterniones y los he entendido bastante bien, pero la forma de implementarlos en mi programa OpenGL sigue siendo un misterio. ¿Alguien sabe un pequeño ejemplo? No cómo implementar la clase cuaternión sino cómo usarla. No entiendo cómo juntar las cosas.

+0

Mejor no hacer más de una pregunta a la vez. He vinculado aquí su [nueva pregunta] (http://stackoverflow.com/questions/7939770/rotation-with-quaternion-not-quite-right). – Kev

Respuesta

4

Lo más importante es implementar el método que construirá matrices de rotación a partir del cuaternión. Entonces, como harás con la matriz de rotación normal, simplemente multiplícala con tu matriz de vista modelo.

Este es un ejemplo simple que se utilizó para rotar el cubo con el movimiento del mouse. Como ve, he necesitado implementar tres métodos: toMatrix, quaternionFromAxis, multiplyWith. Suponiendo que entiendes los cuaterniones, debería quedar claro lo que hacen.

void display() { 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glPushMatrix(); 

    // Multiply quaternion with current modelview matrix  
    glMultMatrixf(cameraQuaternion.toMatrix()); 

    // Some other transformations 
    glTranslatef(-0.5f, -0.5f, -0.5f); 

    // Draw something, i.e. cube 
    glDrawArrays(GL_TRIANGLES, 0, 36); 
    glDrawArrays(GL_TRIANGLES, 0, 36); 

    glPopMatrix(); 
} 

void mouseMoved(float dx, float dy) { 
    float axisY[] = { 0, 1, 0 }, 
      axisX[] = { 1, 0, 0 }; 

    float sensitivity = 0.005f; 
    Quaternion *q1 = Quaternion.quaternionFromAxis(axisY, dx * sensitivity]; 
    Quaternion *q2 = Quaternion.quaternionFromAxis(axisX, dy * sensitivity]; 

    // Multiply two quaternions with camera 
    cameraQuaternion = (q1.multiplyWith(q2)).multiplyWith(cameraQuaternion); 
} 
+0

¿Cuáles deberían ser los valores iniciales de la cámara Quaternion? –

9

Puede fácilmente build rotation matrices out of unit quaternions.

dado un cuaternión unidad a + bi + cj + dk, se puede construir la siguiente matriz 3x3:

The matrix

Añadir la última línea y la columna tomado de la matriz 4x4 identidad, glMultMatrix y has terminado :)

Cuestiones relacionadas