2011-10-29 31 views
10

Tôi có một đối tượng mà tôi muốn xoay qua các phím. Các đối tượng nên yaw, pitch và roll. Sau khi thử rất nhiều, tôi đã tìm ra rằng glRotate có những hạn chế của nó và sẽ không thể thực hiện một cái gì đó như thế với hàm đó.Từ quaternions sang OpenGL rotation

Tôi đã nghiên cứu một chút và tìm hiểu về xoay vòng dựa trên quaternion. Nó cũng sẽ có thể xoay qua một ma trận xoay, nhưng hầu như tất cả mọi người mô tả quaternions là tốt nhất bao giờ hết.

Tôi đã đọc về quaternions và hiểu chúng khá tốt, nhưng làm thế nào để thực hiện chúng trong chương trình OpenGL của tôi vẫn còn là một bí ẩn. Có ai biết một ví dụ nhỏ? Không phải làm thế nào để thực hiện các lớp quaternion nhưng làm thế nào để sử dụng nó. Tôi không hiểu cách kết hợp mọi thứ lại với nhau.

+0

Tốt nhất không nên hỏi nhiều câu hỏi cùng một lúc. Tôi đã liên kết lại ở đây từ [câu hỏi mới] của bạn (http://stackoverflow.com/questions/7939770/rotation-with-quaternion-not-quite-right). – Kev

Trả lời

4

Điều quan trọng nhất là triển khai phương pháp xây dựng ma trận xoay từ quaternion. Sau đó, như bạn sẽ làm với ma trận xoay bình thường, chỉ cần nhân nó với ma trận modelview của bạn.

Đây là ví dụ đơn giản được sử dụng để xoay hình khối có chuyển động của chuột. Như bạn thấy tôi cần thực hiện ba phương pháp: toMatrix, quaternionFromAxis, multiplyWith. Giả sử rằng bạn hiểu quaternions, điều này nên được rõ ràng những gì họ làm.

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

Giá trị ban đầu của Quaternion Camera là gì? –

9

Bạn có thể dễ dàng build rotation matrices out of unit quaternions.

Cho một đơn vị quaternion a + bi + cj + dk, bạn có thể xây dựng ma trận 3x3 như sau:

The matrix

Thêm dòng cuối cùng và cột lấy từ nhận dạng ma trận 4x4, glMultMatrix và bạn đã hoàn thành :)

Các vấn đề liên quan