티스토리 뷰

Model Coordinate System(MCS)에 중심이 (0,0,0) 반지름이 1인 sphere가 있다고 하자.

이 sphere를 World Coordinate System(WCS)의 원점에 위치시키기 위해서 다음과 같은 코드를 짤 수 있다.


1
2
3
glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); 
glutWireSphere(1.0 , slices, stacks);
cs


다음으로 이 sphere를 보는 관찰자, 혹은 카메라가 나올 차례이다. 

카메라가 중심이 되는 시스템을 View Coordinate System(VCS)라고 한다면, VCS상에 WCS를 어떻게 배치하느냐에 따라서 카메라에게 WCS상의 물체가 다르게 보일 것이다.


gluLookAt 함수는 VCS-WCS의 relationship를 정해서 카메라가 관찰대상을 어떻게 바라볼 지 결정할 수 있게 해준다.


우선 gluLookAt 함수의 구조부터 살펴보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
void gluLookAt (
 
    GLdouble eyex, 
    GLdouble eyey, 
    GLdouble eyez, 
 
    GLdouble atx, 
    GLdouble aty, 
    GLdouble atz, 
 
    GLdouble upx, 
    GLdouble upy, 
    GLdouble upz);
cs


여기서 9개의 parameters가 있는데 다음과 같이 3요소로 묶을 수 있다.

- eye는 카메라의 위치

- at은 초점(즉 바라볼 곳)

- up은 카메라의 상향 벡터, 즉 PHIGS의 VUV(View Up Vector)에 해당한다. 


(수학적으로 엄밀하지는 않지만 VUV에 대한 감을 잡기에 좋은 비유 : 우리 눈이 카메라라면 대충 정수리가 향하는 방향을 VUV라고 할 수 있다. 우리가 고개를 갸우뚱거리면 눈 앞에 보이는 게 달라지는데, 이때 VUV도 갸우뚱거림에 따라 그 방향에 달라진다. 즉 gluLookAt 함수에서 VUV를 설정해줌에 따라 어떻게 바라볼지를 결정하는 것이다.)


일단 궁금증 1번.

-> (eyex, eyey, eyez)와 (atx, aty, atz)는 어느 좌표계를 기준으로 한 좌표인가?


궁금증 1번에 대해 자문자답하자면 

WCS 좌표계상에 eye와 at을 두는 것이다.

그 상태에서 eye에서 at으로 향하는 벡터를 VCS의 -z축(minus 방향)으로 정하는 것이다.


이렇게 VCS의-z축이 정해지면 이 -z축에 수직인 투상면을 생각할 수 있다. 

이 투상면에 VUV인 <upx, upy, upz>를 투상시키면 projected-VUV(pVUV)를 그려볼 수 있다. 

pVUV는 VCS의 -z축과 수직한다는 것을 알 수 있다. (고등학교 수준의 기하-벡터를 공부했다거나, 혹은 직관적으로)

이 pVUV를 VCS의 y축으로 설정한다. 그렇게 하면 자연스럽게 x축을 정할 수 있다. (이 함수에서는 오른손법칙을 기준으로 한다)


이와 같은 방식으르 VCS가 구축되고 VCS-WCS의 relationship이 갖춰진다.


다음의 코드로 예를 들어봅니다.


1
2
3
4
5
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.01.05.0,    0.00.01.0,    0.01.00.0);
glLoadIdentity();
glutWireSphere(1.0 , slices, stacks);
cs


이 코드는 다음과 같이 카메라를 배치해서 물체를 바라보겠다는 의미입니다. (sphere를 조금 작게 그렸다)




미완성

그림을 그려서 설명 보완할 예정

데드라인 2019년 1월 31일

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함