- 개요
3차원으로 가상의 게임 공간을 구성하더라도 모니터 화면에 보이는 최종 결과물은 2차원 평면이다
따라서 2차원의 평면에서 3차원의 공간감을 느낄 수 있게 해야 한다
해답은 인간의 눈이 세상을 보는 방식으로 공간을 변환하는 것이다
인간의 눈이 세상을 보는 방식으로 변환하는 작업을 원근 투영 변환이라고 한다
- 원근 투영 변환의 절차
1) 투시 원근법이란?

르네상스 시대의 화가들은 눈에 비치는 상을 화폭에 그대로 담기 위해
시선을 한 점에 고정시키고, 고정된 점으로부터 화폭까지 곧게 뻗은 실을 활용하여 그림을 그렸다
이러한 기법을 투시 원근법이라고 표현한다

3차원 공간에 투시 원근법의 원리를 적용하기 위해서는
3차원 공간의 모든 점이 한 점을 향해 모이는 형태로 변환해야 하는데 이를 원근 투영 변환이라고 표현한다
가상 공간에서 눈에 대응하는 물체는 카메라로, 원근 투영 변환을 위해 카메라에도 눈에 보이는 범위를 설정해야 한다
이때 카메라에 적용된 눈에 보이는 범위를 화각이라고 표현한다
카메라에 화각을 설정하면 위의 그림과 같이 좌우와 상하가 균등한 사각뿔 영역이 생성된다

3차원 공간에서의 원근 투영 변환은 X / Y / Z 축이 모두 직교하는 정육면체 형태를 가진 뷰 공간을
카메라의 한 점으로 모이는 사각뿔 형태를 가진 공간으로 변환하는 작업이다
3차원 공간을 변환한 후에는 공간의 물체를 투영하여 2차원의 모니터 평면에 담아야 한다
이를 위해 모든 물체의 상이 맺히는 가상의 평면인 투영 평면을 생성한다
투영 평면은 카메라로부터 멀어질수록 커지며,
투영 평면과 카메라까지의 거리를 초점 거리(Focal Length)라고 표현한다
2) 3차원 공간에서의 투시 원근법 구현
2 - 1) 가정

투영 공간을 오른쪽에서 바라본 2차원 단면도로 정리하고 화각을 θ로, 초점 거리를 d로 표시하였다
2 - 2) NDC(Normalized Device Coordinate)

원근 투영을 구현하기 위해서는 우선 투영 평면의 위치를 지정해야 한다
투영 평면의 위치는 계산의 편의를 위해 위-아래의 크기가 각각 1이 되는 지점으로 결정한다
좌우와 상하의 화각이 동일하므로 투영 평면은 상하좌우의 범위가 [-1, 1]인 정사각형의 모습을 띈다
투영 평면에 대응하는 정사각형 영역은 2차원 평면의 좌표시스템을 가지는데, 이를 NDC라고 표현한다
NDC는 가운데 중점을 원점으로 설정한다



투영 평면에 대응하는 NDC가 언제나 일정한 값을 갖고 있다면,
카메라에 설정된 화각이 변할 때마다 초점 거리는 달라지게 된다
화각이 증가할수록 초점 거리는 감소하고, 화각이 감소할수록 초점 거리는 증가한다
따라서 화각과 초점 거리 사이의 관계식은 위와 같이 정리할 수 있다
2 - 3) 원근 투영 행렬의 설계 (1)
이전까지 다룬 공간은 X / Y / Z 축이 모두 직교하는 유클리드 공간이었다
그러나 원근 투영 변환에 의해 사각뿔 형태와 같은 사영 공간으로 변환되었다
사영 공간의 X축과 Y축은 여전이 직교하지만, Z축은 독립적이지 않고 X축과 Y축 모두에게 영향을 준다
이는 초점 거리에 따라 투영 평면의 면적이 달라지는 이유이기도 하다
따라서 이를 감안하여 뷰 공간의 점을 투영 평면 위의 점으로 변환하는 행렬을 설계해야 한다
2 - 4) 원근 투영 행렬의 설계 (2)

문제를 단순화하기 위해 X축을 배제한 Y축과 Z축으로만 공간을 설정하고 투영 평면에 상이 맺힌다고 가정한다
이때 뷰 공간의 점을 P(view)로 표현하고 투영 평면의 투영된 점을 P(ndc)라고 표현한다

X값을 고정한 상태이므로, P(view)와 P(ndc)의 좌표값은 위와 같다

두 점의 관계를 파악하기 위해 위와 같이 닮은꼴 삼각형 2개를 생성한다
이때 뷰 공간에서 카메라 앞에 위치한 점의 Z 값은 항상 음수이므로 큰 삼각형의 밑변의 길이는 -V(z)가 된다

닮은꼴 삼각형의 비를 이용하여 투영 평면의 Y 값을 위와 같이 계산할 수 있다
또, Y 값을 0으로 고정한 후에 X축과 Z축의 평면을 사용하는 방식으로 투영 평면의 X 값을 계산할 수 있다

최종적으로 초점거리와 뷰 좌표로부터 투영 평면의 투영된 점은 위와 같이 계산할 수 있다
2 - 5) 원근 투영 행렬의 설계 (3)

2 - 4)처럼 NDC 좌표값을 계산했다면 모니터의 최종 화면을 구성하는 작업이 남았다
NDC 좌표를 화면 해상도만큼 늘려주면 최종 스크린 좌표가 완성되지만,
화면의 가로-세로 비인 종횡비를 고려하지 않고 확대하면 위와 같이 물체가 찌그러지는 문제가 발생한다

위의 문제를 해결하는 방법은 화면의 종횡비를 파악하여 NDC 영역에서 미리 찌그러뜨린 후에 확대하는 것이다
종횡비는 보통 하나의 축을 1의 크기로 지정하고 다른 축의 크기를 상대적으로 측정해 계산한다

프로젝트에서는 800 X 600의 해상도를 사용하므로 세로 기준으로 종횡비는 1.333이 된다
종횡비 기호는 a로 표시한다고 가정한다
NDC를 좌우로 찌그러뜨리면 X축의 값을 변경해야 하는데,
이는 종횡비의 역수 1/a를 곱하여 계산할 수 있다
따라서 최종적으로 NDC의 좌표 P(ndc)를 계산하는 공식은 위와 같이 수정된다

최종 NDC 값을 계산하는 원근 투영 행렬 P는 위와 같이 설계할 수 있다
뷰 공간의 점 P(view)의 X 값과 Y 값으로 만든 벡터를 v로 지정하여 위와 같이 계산하였다
2 - 6) 원근 투영 행렬의 설계 (4)
2 - 5)에서 최종적으로 생성한 원근 투영 행렬은 치명적인 문제가 남아있다
해당 P 행렬을 사용하게 되면, 변환할 점마다 항상 행렬을 새롭게 생성해야 한다
이는 미리 곱해둔 행렬을 사용한다는 이점을 살리지 못하고 연산량을 증가시키게 된다
따라서 원근 투영 행렬을 구성할 때 점의 값이 아닌 카메라의 설정만으로 행렬을 설계해야 한다

2 - 5)에서 생성한 행렬을 위와 같이 변경하고 행렬에 곱하는 벡터의 값을 v = (v(x), v(y), v(z))로 지정한다
v 벡터는 뷰 좌표계의 점과 동일한 값을 가진다

위 행렬 곱에서 생성한 벡터는 NDC 좌표와는 다르지만 원근 투영 행렬 P는 점과 무관한 카메라 설정 값으로 구성된다
따라서 모든 점에 대해 보편적으로 설계된 원근 투영 행렬 P를 사용할 수 있다
위와 같이 원근 투영 행렬 P로 변환되는 좌표계를 클립 좌표라고 부르며 클립 좌표의 점 P(clip)은 위와 같다

2차 수정에서 계산한 클립 좌표의 점 P(clip)의 각 요소를 세 번째 값인 -V(z)로 나눈다
최종적으로 위와 같이 구성된 NDC의 좌표를 계산할 수 있다
'수학 > 이득우의 게임 수학' 카테고리의 다른 글
| 원근 투영 (2) - 동차 좌표계 (0) | 2026.05.27 |
|---|---|
| 삼중곱 (0) | 2026.05.13 |
| 로드리게스 회전 (0) | 2026.05.06 |
| 외적의 활용 (5) - 백페이스 컬링 (0) | 2026.05.06 |
| 외적의 활용 (4) - 회전행렬의 생성 (0) | 2026.04.29 |