이전 챕터에서 다뤘던, 특정 좌표계에서의 물체를 다른 좌표계로 옮기는 과정은 Vertex Processor가 처리한다.

 

3D object를 디자인할 때는 일반적으로 Origin을 기준으로 물체를 만들게 된다. 그 물체를 우리가 정의한 공간에 놓고, 회전하고 스케일을 키우는 작업을 하는 것이 Model Matrix라고 이해할 수 있다. 이때 Model Matrix를 적용한 공간이 World Space라고 볼 수 있다.

 

Camera도 World Space안에서 특정 좌표를 가지고, 회전을 가지고 있다. Camera의 회전과 위치를 표현한 Matrix가 View Matrix이고, 물체에 View Matrix를 적용하기 위해서는 $V^{-1}$를 적용한다는 것까지 다뤘다. 이렇게 만들어진, $V^{-1}M(x)$ 를 Model View Matrix라고 부른다.

 

Projection Matrix

여기서 더 필요한 것은, 카메라가 물체를 보았을 때 어떻게 보이느냐는 것이다. 3D 공간을 정의하긴 했지만 이를 결국에 우리는 2D로 관찰하기 때문에 이를 위한 선행 과정이 필요하다.

 

[-1, 1]사이로 정의되어 있는 큐브로 대응시키는 과정을 거친다. 여기서 처음에 궁금했던 것은, Orthographic의 경우 문제가 안 생길 것 같지만 Perspective일 경우에는 비율이 망가지는 게 아닌가 하는 생각이 들었었다.

근데 이건 우리의 눈이 Pespective로 작동하기 때문에 이런 착각이 생기는 것이고, Perspective는 멀리 있는 물체가 작게 보이는 것인데, 카메라 뷰를 저렇게 clip space로, 큐브로 만들면 우리가 원하는 결과가 나올 것이다.

 

이제 Orthographic 부터 Perspective까지 Matrix를 정의해보겠다. 우리의 목표는 특정 오브젝트의 좌표를 저 clip space안에 정의하는 것이다.

 

Orthographic Projection Matrix

 

먼저 Orthographic부터 살펴보면, left, right, bottom, top, near, far가 있을때, 특정 점의 x좌표를 r, l의 중심을 기준으로 정의할 수 있다.

$x - \frac{r+l}{2}$

직접 그림을 그려가면서 하면 바로 직관적으로 이해할 수 있다. 이제, left, right의 중심이라면 0이고, left에 가깝다면 음수, right에 가깝다면 양수로 정의되어 있다. 이제 이걸 [-1, 1] 사이로 매핑하면 되는데 지금 우리가 보고 싶은 좌표계는 left, right안에 있는 것이므로 길이는 right-left. clip space의 한변의 길이는 2이므로 x를 $\frac{2}{r-l}$ 만큼 나눠주면 된다.

 

그래서 점의 x좌표는

$x_{changed} = (x-\frac{r+l}{2}) \times \frac{2}{r-l}$

를 적용하면 clip space로 정의할 수 있다. 당연히도 만약 점이 카메라에 들어오지 않았다면 clip space에도 [-1, 1]사이에 들어오지 않을 것이다.

 

같은 방법으로 y좌표, z좌표도 다음과 같이 정의할 수 있다. 다만 주의할 점은 z축은 -를 붙여줘야 한다는 것이다. 그래서 정리하면,

1. $x_{changed} = (x-\frac{r+l}{2}) \times \frac{2}{r-l}$

2. $y\_{changed} = (y-\frac{t+b}{2}) \times \frac{2}{t-b}$

3. $z_{changed} = (z-\frac{f+n}{2}) \times -\frac{2}{f-n}$

 

이걸 Matrix로 나타내기 위해 전개한 후 계산하면, Orthographic의 Matrix는,

 

다음과 같이 정의할 수 있다. 이 계산법은 내가 직접 계산한 방식이고, 더 쉬운 방법이 있다면 그걸로 하면 된다.

 

Perspective Projection Matrix

아까 Orthographic을 계산한것과 매우 유사하지만 Perspective에서는 멀리 있는 것이 작아지게 보여야 한다는 것이다. 멀어질 때는 비례해서 멀어진다. 이는 고대 수학자가 밝혀낸 것으로 알고 있고, 예술 작품에서도 널리 사용되고 있는 것이다.

 

이 원근 계산법을 적용한다고 하면, z축은 지금 반대로 되어 있기 때문에, z가 더 작으면 작을수록 멀리 있다고 볼 수 있다. 비례해서 멀어지는 것을 감안하면 좌표에 -z를 나눠주게 되면 -z가 큰것이 더 멀리 있으므로 아귀가 맞게 된다.

또한 -z로 나눠줬기 때문에 [-1, 1] 공간이 아니라 [z, -z] 공간으로 변하게 된다. 지금 이 Projection Matrix를 적용해서 나온 값이, [x, y, z, w] 라면 여기 w가 -z가 되고, 이 Projection Matrix를 적용한 결과로는 [-w, w]공간의 정육면체로 대응된다고 생각할 수 있다.

 

그래서 Perspective Projection Matrix는, 다음과 같이 표현할 수 있다.

 

직접 계산하고 전개하는 과정을 거친다면 저 Matrix가 어떻게 만들어졌는지 이해할 수 있을 것이다.

 

 

Field of view (FOV)

게임을 할 때 많이 들어봤을 단어다. 보통 한국어로는 '시야각'이라고 부르는데, 이는 Perspective mode에서만 사용되는 개념이다. 

 

 

다음과 같은 그림에서, 시야각이 넓어지면, 볼 수 있는 공간이 확장된다고 보면 된다. 저 카메라의 박스가 커진다고 이해하면, 아까 했던 clip space를 적용했을 때 물체는 더 작아지는 대신 볼 수 있는 것들이 많아지겠구나 하고 이해하면 된다.

 

Viewport

- A rectangular area of the display window: x, y, w, h

 

 

View port는 최종적으로 보여지는 화면이다. 3D게임을 할 때도 창 모드로 전환 후 화면 어디에든 놓을 수 있는 것처럼 카메라가 보여주는 것이 화면 어디에 어느 크기로 보여질 지도 정해줄 수 있다.

 

 

이것도 Matrix가 필요하다. 아까 Projection Matrix를 적용하면 clip space안에서 정의되는데 이제는 화면 안에서 정의되어야 한다.

이 Matrix는 Viewport Matrix, W라고 부른다.

 

이건 화면마다 다르므로 결과만 보자면, 아까 [-1, 1]로 clipping 한 것을, x, y좌표들은 $win_{x}, win_{y}$로 window안에서의 x, y 좌표로 변환되고, z좌표는 depth로 변환된다. depth는 0.0부터 1.0까지 있다. near는 0으로, far는 1로 매핑된다.

 

Aspect Ratio

이건 한 번쯤 들어봤을 것이다. 우리가 주로 사용하는 16:9나 옛날 4:3 까지.

Aspect Ratio의 정확한 정의는 width/height다. 그래서 우리가 주로 사용하는 TV나 모니터는 16:9 비율이므로 aspect ratio는 16/9가 되는 것이다.

 

Projection Matrix부터, Viewport까지, Aspect Ratio가 맞지 않다면 화면이 늘어져보이거나 짤리거나 축소되어서 왜곡될 것이다.

aspect ratio를 맞춰주는 것이 중요한데, 아까 전에 했던, right-left가 Width, top-bottom이 Height라고 보면, 이 (right-left)/(top-bottom)이 Aspect ratio고, 만일 16:9 화면으로 보여지고 싶다면 이때부터 aspect ratio를 16/9로 맞춰놓아야 하는것이다. 그래야 clip space로 찌부되더라도 다시 screen space로 넘어오면서 정상적으로 보여질 것이다.

 

 

 

 

이해를 돕기 위해 [-1, 1] clipping space라는 개념을 사용했지만, 사실 아까 Perspective Projection Matrix에서도 보듯이 아직은 [-1, 1]로 clipping된 것이 아니고, [-w, w]로 clipping된 것이다. orthographic의 경우 w=1이지만, GPU는 그런건 신경쓰지 않고 무조건 w의 값을 읽고 그를 기준으로 Clipping 등 여러 작업을 거친 후 비로소 NDC(Normalized Device Coordinates). x, y, z ∈ [-1, 1] 공간으로 바꾼다.

다음 챕터에서 더 자세히 다룰 것이다.

 

'개인 공부 > 컴퓨터그래픽스' 카테고리의 다른 글

06 Clipping, Rasterization  (1) 2025.07.19
04. Transformations  (1) 2025.07.17
03. Objects  (0) 2025.06.09
02. Camera  (1) 2025.06.07
01. Rendering Pipeline  (0) 2025.06.07

+ Recent posts