2014-12-24 3 views
0

사용자가 gluLookAt 함수의 매개 변수를 변경하여 주변을 둘러 볼 수있는 간단한 응용 프로그램을 구현하려고합니다.OpenGL 응용 프로그램 회전 카메라

float cx1; 
float cz1; 

float d1 = cx - eyex; 
float d2 = cz - eyez; 

cx1 = d2*sin(alfa*PI/180) + d1*cos(alfa*PI/180); 
cz1 = d2*cos(alfa*PI/180) - d1*sin(alfa*PI/180); 
yRotationAngle = yRotationAngle +alfa; 

cx = cx1 + eyex; 
cz = cz1 + eyez; 

이 잘 작동하지만 x 축 중심으로 회전려고 할 때 내가 원하는 동작을하지 않는다 : 나는 다음과 같은 방법으로 Y 축을 중심으로 회전을 구현했습니다. 나는 카메라를 "위"와 "아래"로 회전시키고 싶었지만 그 순간 나는 그 특정한 방향으로 카메라를 회전시키고 싶었다. x 축을 중심으로 회전하는 코드는 다음과 같이 구현됩니다. float d1 = cy - eyey; float d2 = cz-eyez;

//rotate around x 
cy1 = cos(angleToRotate) * d1 - sin(angleToRotate) * d2; 
cz1 = sin(angleToRotate) * d1 + cos(angleToRotate) * d2; 

cy = cy1 + eyey; 
cz = cz1 + eyez; 

x를 중심으로 회전하기 전에 반드시 y 축을 중심으로 역 회전이 필요합니까? 그렇다면, 회전에 필요한 각도의 값은 무엇입니까?

답변

0

두 번째 회전의 계산은 현재 위치를 기준으로 적용하기 때문에 약간 더 복잡합니다. 그러나 현재 각도를 추적하고 카메라를 회전시킬 때이 각도를 더하거나 빼면이 모든 것을 훨씬 간단하게 만들 수 있다고 생각합니다. 기본적으로 구 좌표 공간에서 주로 작업하고 회전을 적용 할 때만 데카르트 좌표를 계산합니다.

이렇게하려면 두 개의 각도가 필요합니다. 다음과 같은 명명법을 사용합니다 :

  • yawAng : z 축을 기준으로 측정 한 현재 회전 각도입니다.
  • pitchAng : xz 평면에 대한 각도. 업 (양의 y 방향, 아래 방향의 음) 방향에 대해 양수입니다.

이렇게하면 기본 카메라 회전이이 각도로 증가/감소합니다.

  • 왼쪽 : yawAng += angInc
  • 오른쪽 : yawAng -= angInc
  • 까지 : pitchAng += angInc
  • 다운 : angInc의 증가에 대한 pitchAng -= angInc 그런

, 그것은 gluLookAt() 변환을 적용 할 때입니다 때, 표준 공식을 사용하여 구 좌표를 데카르트 좌표로 변환합니다. 카메라와 센터 사이에 거리가 d 인 경우 :

cx = eyex + d * sin(yawAng) * cos(pitchAng); 
cy = eyey + d * sin(pitchAng) 
cz = eyez + d * cos(yawAng) * cos(pitchAng);