가장 중요한 것은 쿼터니언 (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);
}
한 번에 두 가지 이상의 질문을하지 않는 것이 가장 좋습니다. 나는 당신의 [새로운 질문] (http://stackoverflow.com/questions/7939770/rotation-with-quaternion-not-quite-right)에서 다시 링크했다. – Kev