2011-10-29 14 views
10

Mam obiekt, który chcę obrócić za pomocą klawiszy. Obiekt powinien się odchylać, przechylać i przechylać. Po wielu próbach zorientowałem się, że glRotate ma swoje ograniczenia i nie będzie możliwe zaimplementowanie czegoś podobnego za pomocą tej funkcji.Od kwaterowań do rotacji OpenGL

Zbadałem trochę i dowiedziałem się o rotacji opartej na kwaternionach. Możliwa byłaby również rotacja za pośrednictwem macierzy obrotu, ale prawie wszyscy opisują kwaternionów jako najlepsze w historii.

Czytałem o kwaterach i rozumiałem je dość dobrze, ale jak je wdrożyć w moim programie OpenGL, wciąż pozostaje tajemnicą. Czy ktoś zna mały przykład? Nie, jak zaimplementować klasę kwaternionową, ale jak z niej korzystać. Nie rozumiem, jak połączyć te rzeczy.

+0

Najlepiej nie zadawać więcej niż jedno pytanie na raz. Mam link tutaj z twojego [nowego pytania] (http://stackoverflow.com/questions/7939770/rotation-w-quaternion-not-quite-right). – Kev

Odpowiedz

4

Najważniejsze jest wdrożenie metody, która zbuduje matryce obrotowe z kwaternionu. Następnie, tak jak w przypadku normalnej macierzy obrotu, wystarczy pomnożyć ją z macierzą widoku modelu.

Jest to prosty przykład, który został użyty do obracania kostki za pomocą ruchów myszy. Jak widzisz, potrzebowałem zastosować trzy metody: toMatrix, quaternionFromAxis, multiplyWith. Zakładając, że rozumiesz quaterniony, powinno to być jasne, co robią.

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

Jakie powinny być początkowe wartości Czwartości Kamer? –

9

Możesz łatwo build rotation matrices out of unit quaternions.

Biorąc pod uwagę kwaternion jednostkową a + bi + cj + dk, można zbudować następującą macierz 3x3:

The matrix

dodać ostatni wiersz i kolumnę podjętą z matrycy tożsamości 4x4, glMultMatrix i gotowe :)

Powiązane problemy