2009-12-30 7 views
3

OpenGL에서 간단한 카메라 시스템을 구현하고 있습니다. 투영 행렬 아래에 gluPerspective를 설정하고 ModelView 행렬에 gluLookAt를 사용합니다. 이 후에 키보드 이벤트를 확인하고 회전 화살표 키가 있으면 각도 및 전진 속도를 수정하는 기본 렌더링 루프가 생깁니다 (y 축만 회전하고 z (전진)을 통해 이동). 그럼 다음 코드를 사용하여 뷰를 이동 (최종 프레임은 프레임 속도로 이동을 분리하기 위해 초 단위로 렌더링 된 이후 deltaTime 시간의 양이다) 세계 원점 주변의 OpenGL 회전 로컬 원점

//place our camera 
newTime = RunTime(); //get the time since app start 
deltaTime = newTime - time; //get the time since the last frame was rendered 
time = newTime; 
glRotatef(view.angularSpeed*deltaTime,0,1,0); //rotate 
glTranslatef(0,0,view.forwardSpeed*deltaTime); //move forwards 
//draw our vertices 
draw(); 
//swap buffers 
Swap_Buffers(); 

그런 다음 코드를 다시 주위 루프. 내 무승부 알고리즘은 glPushMatrix()으로 시작하여 glPopMatrix()으로 끝납니다.

glRotatef() 및 glTranslatef()를 호출 할 때마다보기가 전달 방향으로보기 방향으로 앞으로 이동합니다.

그러나 코드를 실행하면 올바른 위치에 객체가 그려 지지만 움직일 때 세계 기원 (0,0,0 - Z 축을 따라 직면)의 방향으로 이동이 이루어집니다 (내가 가리키고있는) 로컬 오리엔테이션으로 이동하고, 회전 할 때, 회전은 카메라의 위치가 아니라 (0,0,0) 정도 수행됩니다.

나는 그 자리에서 회전하는 것과는 반대로 (0,0,0) 궤도를 도는 나의 카메라의 이상한 효과로 끝납니다.

루프 안의 모든 곳에서 glLoadIdentity()을 전혀 호출하지 않으며 매트릭스 모드가 전체 루프에 대해 GL_MODELVIEW으로 설정되어 있다고 확신합니다. 나는 PushMatrix 및 PopMatrix 호출 사이에, 화면이 검게 간다 나는 내가 그릴 개체를 찾을 수없는 모양에 상관없이.

합니다 ( draw() 함수 내부 glLoadIdentity() 통화를 보류하는 경우

또 다른 이상한 효과는

는 누구? 대신에 그 자리에서 회전 나는이 궤도 (0, 0, 0)를 만들기 위해 엉망이 한 일을 알고

+0

에 넣어주세요 코드라고 생각합니다! – DaMacc

답변

5

glRotate()은 세계 원점을 중심으로 ModelView Matrix를 회전시키기 때문에 임의의 점을 중심으로 회전하려면 해당 점을 원점에두고 회전시킨 다음 시작한 곳으로 다시 변환해야합니다.

나는 당신이 필요로하는 코드를 태그로이

float x, y, z;//point you want to rotate around 

glTranslatef(0,0,view.forwardSpeed*deltaTime); //move forwards 

glTranslatef(x,y,z); //translate to origin 
glRotatef(view.angularSpeed*deltaTime,0,1,0); //rotate 
glTranslatef(-x,-y,-z); //translate back 
//draw our vertices 
draw(); 
//swap buffers 
Swap_Buffers(); 
+0

두 번째 및 세 번째 glTranslatef() 호출에 대한 주석이 올바르지 않습니다. 그들은 "원산지 번역"과 "원산지 번역"이어야합니다. – LarsH

+0

좋은 캐치! 감사 – goatlinks

1

스왑 당신의 회전과 주위에 전화를 번역 :

을들은 이후 하는가 post-multiply the matrix stack 마지막으로 호출 될 'first'는 개념적으로 적용된다. if 너는 그런 종류의 일에 관심이있다.

+0

나는 그것을 시도했지만, 단지 같은 효과를 준다. rotate 및 translate 호출에는 모두 미세한 값이 있으므로 while 루프가 반복 될 때 서로 겹쳐 쌓기 때문에 응용 프로그램 순서에 약간의 차이가 있습니다. –

+0

오, 모든 변환은 상대적입니다! 매번 카메라 위치를 재설정 (glLoadIdentity())하고 매번 절대 변환 및 회전을 수행하면 문제가 해결됩니다. – James

0

먼저 카메라를 (0,0,0)을 가리킨 다음 회전시켜 다시 번역해야한다고 생각합니다.

관련 문제