본문 바로가기

Graphics Note

glRotatef+glTranslatef VS gluLookAt for View transformation

OpenGL 에서 View transformation을 하는 방법은 크게 두가지로 소개된다. 하나는 glRotatef와 glTranslatef를 섞어 사용하는것이고 다른 하나는 gluLookAt을 사용하는것이다.

 

처음 OpenGL을 시작할땐 이 두가지 방법의 차이점에 대해 굉장히 의문을 가졌었다. 답부터 말하자면 View transformation 결과에는 두 방법 모두 차이가 없다. 단지 차이라면 퍼포먼스에 있을뿐이다.

 

View transform 관점에서 두 방법을 살펴보자.

* glRotatef + glTranslatef

나는 세상의 중심에 위치하고, 원하는 시점을 만들기 위해 세상을 움직여버리는 비범한 방법이다. 예를들어 45도 위를 바라보고 싶으면 세상을 -45만큼 내려버리면 되는것과 같다.

 

* gluLookAt

세상은 변함이 없다. 카메라맨이 원하는 장면을 만들기 위해 동분서주 움직이듯, 카메라의 위치(eye)와 바라보는 사물(lookat), 카메라의 위(up) 방향에 대한 정보를 바탕으로 view matrix를 만든다. 그 후 매트릭스연산을 통해 world coordinate => camera coordinate로의 변환을 해주는 방식이다.

 

즉, 세상을 상대적인 공간으로 보느냐, 절대적인 공간으로 보느냐의 차이이며, gluLookAt의 마지막 매트릭스 연산을 고려한다면 결국 세상을 움직여 시점에 변화를 준다는데는 차이가 없는것이다.

 

 

그렇다면 어째서 두 가지 방법이 공존하는것이냐! 일반적으로 두 방법중 gluLookAt이 더 나은 선호도를 보인다. 이유로는,

1. 편하다 - 함수의 prefix에서 알 수 있든 gluLookAt은 GLU계열의 보조함수이다. 이 함수를 써보면 glRotatef+glTranslatef의 조합으로 시점을 조작할때보다 더 적은 코드로 원하는 결과를 만들 수 있다.

2. 빠르다 - 논란의 소지가 있지만, 개인적인 평가로는 gluLookAt은 glRotatef+glTranslatef의 조합보다 빠르다. 짐작가는 이유로는 gluLookAt의 경우 회전이 어찌되든 연산되는 방법은 세 가지 벡터로부터 이루어진다. 반면 변환함수의 조합으로 회전을 위해선 x-axis, y-axis, z-axis로의 세 번 회전이 필요하다. 아무래도 산술연산이 api콜보단 빠르다는게 내 의견이다.

 

즉, gl계열의 함수로 번거로운 작업을 gluLookAt이란 보조함수를 두어 해결했다는 결론이 나며 심각하게 고민할 거리가 되지 못한다는 얘기가 된다. 이 문제를 가지고 포럼을 뒤지던 때 답변자 중 한 분의 '나는 왜 이 주제가 그래픽스 초보자들에게 의문을 주는지가 의문이다' 라는 말이 이해가된다. View transformation에 대한 확실한 이해가 있다면 헷갈릴 이유가 없다.

'Graphics Note' 카테고리의 다른 글

glHint  (0) 2013.12.14
Vector/Matrix class  (0) 2013.12.02
Delaunay triangulation in 2D  (1) 2013.10.06
외곽선 검출  (0) 2013.08.27
perspective projection  (3) 2013.07.19