티스토리 뷰
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.0, 1.0, 5.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0); glLoadIdentity(); glutWireSphere(1.0 , slices, stacks); | cs |
이 코드는 다음과 같이 카메라를 배치해서 물체를 바라보겠다는 의미입니다. (sphere를 조금 작게 그렸다)
미완성
그림을 그려서 설명 보완할 예정
데드라인 2019년 1월 31일
'Programming > OpenGL' 카테고리의 다른 글
[OpenGL] attribute, uniform, varing 정리 (0) | 2019.03.08 |
---|---|
[OpenGL] 오픈지엘 데이터 관련 개념 정리(2. Uniform) (0) | 2019.03.07 |
[OpenGL] 오픈지엘 데이터 관련 개념 정리(1. VAO, VBO) (0) | 2019.03.06 |