2013-01-13 8 views
2

관심 지점을 중심으로 내 "카메라"를 회전하고 싶습니다. 현재 카메라는 원점을 중심으로 만 회전합니다.OpenGL에서 관심 장소를 중심으로 카메라 회전

자습서의 많은 계획 다음 사용하는 것이 좋습니다 :

translate(-P) 
rotate 
translate(P) 

불행하게도,이 작동하지 않습니다. 내 응용 프로그램은 번역 벡터 (QVector3D) 및 쿼터니언 (QQuaternion)을 사용하여 카메라의 번역 및 회전을 저장합니다.

현재, 그것은 항상 원점을 중심으로 회전하는이 같이 수행된다 :이 mulMatrix glMultMatrixf로 전달되는 4 × 4 행렬()을 구축 쿼터니언을 사용

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glTranslatef(translation.x(),translation.y(), translation.z()); 
multMatrix(accumulatedQuaternionRotation); 

; 이 같은

사용 무언가 : 나는 더 설명 드릴 수 없습니다 매우 이상한 컨트롤에

glTranslatef(-translation.x(),-translation.y(), -translation.z()); 
multMatrix(accumulatedQuaternionRotation); 
glTranslatef(translation.x(),translation.y(), translation.z()); 

결과. 내 응용 프로그램 translation.z() 의미 : 카메라를 앞으로 이동하십시오. x() 및 y()를 변경하면 팬과 같은 작업이 실행됩니다.

내가 번역 벡터를 잘못 사용하고있는 것으로 의심되어 위의 일련의 작업이 실패하게됩니다.

내가 확인할 수있는 것이 있습니까?

편집 : 이것은 사원 수 회전 작동 방법은 다음과 같습니다

 // calculate rotation axis 
     QVector3D rotationAxis = QVector3D(diff.y(), diff.x(), 0.0).normalized(); 

     // update rotation see http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation 
     accumulatedQuaternionRotation = QQuaternion::fromAxisAndAngle(rotationAxis, diff.length()/4.0f) * accumulatedQuaternionRotation; 

DIFF는 단순히 두 개의 마우스 이동 이벤트 포인트의 차이입니다.

+0

쿼터니언은 잘못된 매트릭스를 생성해야합니다. –

+0

쿼터니온 순환을위한 코드를 추가했습니다. 회전은 문제없이 첫 번째 경우에서 작동하므로 이상합니다. – anopheles

답변

5

당신이하려는 것은 기본적으로 gluLookAt를 구현하는 것입니다. 맞습니까?

여기 당신은 당신이 그것에서 필요로 복사 할 수 있어야하는 gluLookAt가하는 작업은 다음과 같습니다

http://www.opengl.org/wiki/GluLookAt_code

난 당신이 정말 벡터와 사원 수와 함께 일을하려고하는지 확실하지 않다, gluLookat에 익숙하지 않은 사람을 위해 다소 진보 된 것으로 보이기 때문에 당신이 거기에서 뭘하는지 알고 있다고 가정합니다.