2011-10-29 18 views
10

Ho un oggetto che voglio ruotare tramite i tasti. L'oggetto dovrebbe imbardare, beccare e rotolare. Dopo aver provato molto, ho capito che glRotate ha i suoi limiti e non sarà possibile implementare qualcosa del genere con quella funzione.Da rotazioni quaternioni a OpenGL

Ho studiato un po 'e ho scoperto la rotazione basata su quaternioni. Sarebbe anche possibile ruotare tramite una matrice di rotazione, ma quasi tutti descrivono i quaternioni come i migliori di sempre.

Ho letto dei quaternioni e li ho capiti abbastanza bene, ma come implementarli nel mio programma OpenGL è ancora un mistero. Qualcuno conosce un piccolo esempio? Non come implementare la classe quaternion ma come usarla. Non capisco come mettere insieme le cose.

+0

Meglio non chiedere più di una domanda alla volta. Ho linkato qui dalla tua [nuova domanda] (http://stackoverflow.com/questions/7939770/rotation-with-quaternion-not-quite-right). – Kev

risposta

4

Il più importante è implementare il metodo che costruirà le matrici di rotazione da quaternion. Quindi, come farai con la normale matrice di rotazione, basta moltiplicarla con la tua matrice modelview.

Questo è un semplice esempio che è stato utilizzato per ruotare il cubo con il movimento del mouse. Come vedi, ho dovuto implementare tre metodi: toMatrix, quaternionFromAxis, multiplyWith. Supponendo che tu capisca i quaternioni, questo dovrebbe essere chiaro cosa fanno.

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

Quali dovrebbero essere i valori iniziali di Camera Quaternion? –

9

Si può facilmente build rotation matrices out of unit quaternions.

Dato un'unità quaternione a + bi + cj + dk, è possibile costruire la seguente matrice 3x3:

The matrix

Aggiungere l'ultima riga e colonna del matrice identità 4x4, glMultMatrix e hai finito :)

Problemi correlati