2013-04-11 4 views
1

OpenGL 응용 프로그램에는 키보드 (움직임)와 마우스 (주변을 둘러보기)를 사용하여 제어되는 카메라가 있습니다.OpenGL 회전 문제

Everythings는 지금까지 완벽하게 잘 작동했습니다. Y 축에서 카메라를 300 이상으로 움직이면 마우스를 움직일 때 엉망이되기 시작합니다. 예를 들어, Y = 310으로 이동하여 마우스를 위로 움직이면 위로 올라 가기 시작할 때 왼쪽으로도 회전하기 시작합니다.

이유가 무엇인지 잘 모르겠습니다. 누구든지 도와 줄 수 있습니까?

가 Heres는 코드가 앞으로하는 gluLookAt()에 대한 위치까지 해결하기

더블 cosR, cosP, 아늑한; // sin/cos의 temp 값은 에서 double sinR, sinP, sinY; // 입력 된 롤/피치/요잉

if(Yaw > 359) Yaw = 0; 
if(Pitch > 359) Pitch = 0; 
if(Yaw < 0) Yaw = 359; 
if(Pitch < 0) Pitch = 359; 


cosY = cosf(Yaw*3.1415/180); 
cosP = cosf(Pitch*3.1415/180); 
cosR = cosf(Roll*3.1415/180); 
sinY = sinf(Yaw*3.1415/180); 
sinP = sinf(Pitch*3.1415/180); 
sinR = sinf(Roll*3.1415/180); 

//forward position 
forwardPos.x = sinY * cosP*360; 
forwardPos.y = sinP * 360; 
forwardPos.z = cosP * -cosY*360; 

//up position 
upPos.x = -cosY * sinR - sinY * sinP * cosR; 
upPos.y = cosP * cosR; 
upPos.z = -sinY * sinR - sinP * cosR * -cosY; 

답변

7

Gimble Lock. It is explained here.

쿼터니언은이 문제의 표준 솔루션입니다.

간략히 말하자면 위의 계산에서 두 축 각도가 서로 접근하면 사용 가능한 움직임이 손실됩니다. 이것을 막기 위해서는 4 자유도가 필요합니다. 이것은 쿼터니언 수학이 허용하는 것입니다.

+0

ty @Basic - 철자 오류가 발생했습니다. –

+1

그리고 추가 읽기를위한 유용한 링크 ... http://www.cprogramming.com/tutorial/3d/quaternions.html @Michael np;) – Basic