OpenGL

[OpenGL-6] Model View Matrix

zamezzz 2016. 11. 13. 19:52

안녕하세요.


여섯번째 포스팅입니다 ^^


지난번 cube는 모두 잘 만들어보셨나요?


오늘은 Model View Matrix라는 개념에 대해서 정리해볼까 합니다.



* 요구사항 *

6.1. Model View Matrix

6.2. Local to World Coordinate Transform

6.3. Camera Positioning

6.4. World Frame to Camera Frame




  6.1 Model View Matrix


Model View Matrix란 개념에 대해 알기 전 OpenGL에서 어떻게 객체를 표현하는지 다시 볼게요.


실제 객체가 Output되기까지 (우리 눈에 보일 때 까지) 많은 과정을 거치는데요.


그 중 하나의 과정이 바로 Model View 과정입니다. 전체 과정은 다음과 같습니다.



이 과정 중 Model Coordinates, World Coordinates, Camera Coordinates를 다루는 과정을


Model View라고 하며, 이를 수행하는 Matrix를 Model Veiw Matrix라고 합니다.


즉 Model View Matrix는 각 모델 별 좌표계를 world 좌표계로 변환하여 물체를 모아줍니다.


이후 카메라 좌표계를 이용하여 카메라를 원하는 위치로 이동시키고, 원하는 곳을 보게합니다.


마지막으로 이러한 모든 변환을 마치고 Projection Matrix로 넘겨주게되는 것입니다.


위와 같은 과정을 바탕으로 Model View Matrix는 크게 2가지로 나눌 수 있습니다.


* 개별 객체를 하나의 좌표계로 모아주는 과정

Local To World Coordinate Transform


* 카메라 관점에서 표현하는 과정

Camera Positioning


  6.2 Local to World Coordinate Transform


먼저, 개별 객체를 하나의 World 좌표계로 모아주는 과정을 보겠습니다.


각 Local 좌표계에서 World 좌표계로 모아주는 것은 크게 대단한 것은 아닙니다.


기준이 되는 하나의 좌표계로 모아주면 되는 것이죠. 


이렇게 되면, 이후에는 World 좌표계의 변형을 통해 모든 객체를 제어할 수 있습니다.


각 객체들이 공간과 시간을 공유할 수 있도록 해준다고 생각하면 됩니다.


이를 위한 변환 순서는 보통 아래와 같은 순서 우선으로 사용됩니다.

Scaling -> Rotation -> Translation


또한 Hierarchical Modeling 개념을 통해 객체간의 상하를 지정할 수 있습니다.


위 사진에서 처럼 Tractor객체 아래에 Front-Wheel객체를 위치시켰다면, Tractor 객체의 변환은


모두 Front-Wheel객체에게도 적용됩니다.




  6.3 Camera Positioning


다음으로는 카메라 위치에 대해 알아보겠습니다.

카메라는 위의 그림과 같이 설명하겠습니다.


최초 카메라의 위치는 (0,0,0)의 위치에 있으며, 카메라가 바라보는 방향은 -z축입니다.


카메라가 객체를 바라보게 하기 위해선 Look-At 함수를 사용하는데요.


여기서는 Look-At함수를 직접 구현하는 방법에 대해서 살펴보겠습니다.

- 기존의 사용하던 gluLookAt 함수는 다음과 같이 사용되었습니다.

gluLookAt(ex, ey, ez, fx, fy, fz, ux, uy, uz);

e = eye point

f = focus point

u = up vector


객체가 이동함에 따라, 카메라도 함께 이동하여 객체를 바라봐야 합니다.


단순 이동의 경우는 객체가 이동한 경로만큼 이동해주면 되기 때문에 어렵지 않습니다.


하지만 회전의 경우 객체가 어떻게 회전함에 따라 카메라도 그와 같은 시점을 유지한 채로


회전을 해주어야 하기에, 계산하기가 매우 까다롭습니다. 그래서 이때 사용하는 방법은


World 좌표계를 회전하여 카메라의 방향과 맞춰주는 방법을 사용합니다.


1. World 좌표계를 카메라 방향으로 변환합니다.

 (Tw = world 좌표계 이동, Rw = World 좌표계 회전)

2. Viewing 변환 V를 얻기 위해서 W를 역변환 합니다.


이를 통해 얻은 V를 통해 카메라의 변환을 실시하면 원하는 값을 얻을 수 있습니다.


  6.4 World Frame to Camera Frame


이제 위에서 정리한 식을 직접 구현해 볼까요


위 그림과 함께 카메라의 각 x,y,z 방향 벡터를 구해보도록 하겠습니다.


먼저 위 그림에서

e = 카메라의 위치

f = 카메라가 바라보는 위치

n = 카메라가 바라보는 방향 n벡터

u = up벡터


먼저 z를 가장 쉽게 구할 수 있어요. 카메라가 바라보는 방향은 -z이기 때문이죠


n 단위 벡터를 구하면 z값은 구하는 것입니다.

위와 같은 식으로 n벡터를 구할 수 있습니다.


다음으로는 y를 구하는 방법을 보겠습니다.

벡터를 쪼개어 y를 구할 수 있습니다.


up 벡터인 u를 쪼개면 서로 수직인 두 성분으로 쪼개질 수 있습니다.


그 하나가 위에서 구한 n이고, 다른 하나가 이번에 필요한 v 벡터입니다. 식은 아래와 같아요


마지막으로 구할 x 방향 벡터는 위에서 구한 n과 v의 크로스 프로덕트를 계산하여 찾습니다

이제 3가지 방향의 벡터를 모두 찾았습니다.


우리가 찾은 벡터는 (w, v -n) 이렇게 입니다. 이는 전역 좌표계 상의 카메라 방향입니다.


마지막으로 이를 행렬에 적용하면 아래와 같은 모습을 가집니다.

이번에는 간단하게 이동 변환 식을 보겠습니다.


이동은 어렵지 않습니다. 단순히 카메라의 위치 e를 더하거나 빼면서 이동하면 되기 때문이에요


다음 행렬식을 보시면 쉽게 이해가 되실 것입니다.


이와 같은 방법을 통해 원하는 계산 식을 얻고, 이를 대입하여 원하는 결과를 얻을 수 있습니다.


결과적으로 카메라의 위치, 바라보는 위치, up벡터가 주어졌을 때 변환을 할 수 있는 것이죠.



오늘은 Model View Matrix의 개념과 계산에 대해서 포스팅 해보았습니다.


다음 포스팅은 아마 Projection Matrix에 대해 포스팅 하고자 합니다.


긴 글 봐주셔서 감사합니다.

반응형

'OpenGL' 카테고리의 다른 글

[OpenGL-8] Lighting  (0) 2017.03.16
[OpenGL-7] Projection Matix  (0) 2016.12.31
[OpenGL-5] Cube Control Program  (1) 2016.11.02
[OpenGL-4] Callback and Transformation  (0) 2016.10.30
[OpenGL-3] GLSL이란  (0) 2016.10.24