2011-10-29 3 views
10

키를 통해 회전시키고 싶은 객체가 있습니다. 피사체는 흔들 리고 피치를 잡고 굴려 야합니다. 많은 노력을 한 후에, 나는 glRotate에 한계가 있으며, 그 기능을 통해 그런 것을 구현할 수 없다는 것을 알아 냈습니다.쿼터니언에서부터 OpenGL 로의 회전

저는 약간 연구를했으며 쿼터니언 기반 회전에 대해 알아 냈습니다. 회전 행렬을 통해 회전하는 것도 가능하지만 거의 모든 사람들이 쿼터니언을 최고의 것으로 묘사합니다.

quaternions에 대해 읽었으며 상당히 잘 이해하고 있지만, OpenGL 프로그램에서이를 구현하는 방법은 여전히 ​​수수께끼입니다. 누구든지 작은 예를 알고 있습니까? 쿼터니언 클래스를 구현하는 방법이 아니라 그것을 사용하는 방법. 나는 물건을 함께 모으는 방법을 얻지 못한다.

+0

한 번에 두 가지 이상의 질문을하지 않는 것이 가장 좋습니다. 나는 당신의 [새로운 질문] (http://stackoverflow.com/questions/7939770/rotation-with-quaternion-not-quite-right)에서 다시 링크했다. – Kev

답변

4

가장 중요한 것은 쿼터니언 (quaternion)으로부터 회전 행렬을 만드는 방법을 구현하는 것입니다. 그런 다음 일반 회전 행렬에서와 마찬가지로 모델 뷰 행렬을 곱하면됩니다.

이것은 마우스 움직임으로 큐브를 회전하는 데 사용 된 간단한 예입니다. 보시다시피, 나는 toMatrix, quaternionFromAxis, multiplyWith의 세 가지 메소드를 구현해야했습니다. 당신이 쿼터니언을 이해한다고 가정하면, 그들이하는 일이 명확해야합니다.

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

카메라 쿼터니언의 초기 값은 무엇이되어야합니까? –

9

당신은 쉽게 build rotation matrices out of unit quaternions 수 있습니다.

는 단위 사원 수 을 감안할 + 양방향 +의 CJ + DK 다음과 같은 3 × 3 행렬을 구축 할 수 있습니다 :

The matrix

는 신원 4 × 4 매트릭스, glMultMatrix에서 가져온 마지막 행과 열을 추가하고 당신은 끝났습니다 :)