- 개요

원근 투영 행렬을 활용하여 3차원의 물체를 원근감 있게 표현할 수 있다
이때 물체에 텍스처를 입힌다면 추가 고려 사항이 발생한다
사용자가 보는 화면은 결국 2차원 평면이므로 나중에 그린 물체가 앞에 보이게 된다
가장 마지막에 그린 바닥이 모든 큐브를 덮어씌우게 된다
위와 같은 문제를 해결하는 방법은 물체가 카메라로부터 얼마나 떨어져 있는지를 기록하여
앞에 있는 물체를 나중에 그리도록 설정하는 것이다
이를 위해 카메라로부터 물체가 얼마나 떨어져있는지 파악하기 위한 깊이 값이 필요하다
- 깊이 값의 계산
1) NDC의 범위를 3차원으로 확장

2차원 평면이었던 NDC 영역에 깊이 값을 추가하게 되면 3차원으로 영역이 확장된다
이때 깊이 값의 범위를 동일하게 [-1, 1]로 가정한다

카메라에 부여된 시야각은 깊이와 무관하므로 카메라에 추가 속성을 부여해야 한다
이때 부여하는 속성을 각각 근평면과 원평면이라고 표현한다
카메라 시야를 구성하는 사영 공간을 근평면과 원평면으로 잘라주면
위와 같이 사각뿔에서 뾰족한 부분이 잘린 형태가 되는데, 이를 절두체라고 표현한다

절두체로 생성되는 3차원 NDC 영역의 범위는 위와 같이 구성된다
NDC의 깊이 값은 멀어질수록 증가하므로 3차원 NDC 공간은 왼손 좌표계를 형성한다
2) 원근 투영 행렬에 깊이 값을 적용

이전에 원근 투영 행렬을 모델링 행렬과 뷰 행렬과 곱하기 위해
인위적으로 네 번째 행과 열을 단위 벡터로 채워 4 X 4 크기의 원근 투영 행렬을 생성하였다
이제 깊이 값을 추가하였으므로 모든 행렬을 활용할 수 있다
기존 원근 투영 행렬의 3행을 4행으로 옮기고 3행은 깊이 값을 구하는 용도로 변경한다
뷰 공간의 점을 나타내는 v의 값을 (v1, v2, v3, 1)로 지정하면 원근 투영 행렬 P는 위와 같다

깊이 값을 계산하기 위해 사용하는 세 번째 행은 4개의 미지수를 사용하였다
이때 깊이 값은 뷰 좌표계의 X축과 Y축에 직교하므로 X축과 Y축에 대응하는 값은 0으로 설정한다
이제 남은 2개의 미지수의 값을 구하기 위해서는 2개의 샘플 데이터가 필요하다
3) 2개의 샘플 데이터의 계산

카메라에 설정된 근평면과 원평면의 값을 사용하여 2개의 미지수의 값을 계산할 수 있다
카메라~근평면까지의 거리를 n으로 가정하고, 카메라~원평면까지의 거리를 f로 가정한다
그리고 카메라의 중심으로부터 시선 방향으로 n만큼 이동한 근평면 상에 위치한 점이 있다고 가정한다
뷰 공간에서 카메라의 시선 방향은 -Z축이므로 뷰 공간에서의 이 점의 좌표는 (0, 0, -n, 1)이 된다
이 값은 깊이 값의 시작 지점이므로 NDC의 (0, 0, -1) 좌표에 대응한다
동일하게 뷰 공간의 원 평면상의 좌표는 (0, 0, -f, 1)이 되는데,
이 좌표는 깊이 값의 끝 지점이기 때문에 NDC의 (0, 0, 1) 좌표에 대응한다
원근 투영 행렬에 뷰 공간의 점을 곱한 결과는 클립 좌표이므로
최종적으로 근평면의 점 P1과 원평면의 점 P2는 위와 같이 계산된다

아직 원근 투영 행렬의 2개의 미지수의 값을 모르므로 클립 좌표의 세 번째 요소를 계산할 수 없다
하지만 클립 좌표의 네 번째 요소로 모든 요소를 나눈 값은 NDC 좌표를 가리키고,
NDC 좌표의 Z값은 각각 -1과 1이다
따라서 근평면의 클립 좌표는 (0, 0, -n, n)이고 원평면의 클립 좌표는 (0, 0, f, f)가 된다
최종적으로 위와 같이 근평면과 원평면의 위치를 세 가지 좌표로 표현할 수 있다
4) 깊이 값이 포함된 최종 원근 투영 행렬의 계산

최종적으로 근평면의 점 P1과 원평면의 점 P2의 값을 위와 같이 계산할 수 있다

두 행렬의 3행과 뷰 공간의 점을 내적하면 위의 2개의 식을 얻을 수 있다

n과 f는 카메라에 설정된 상수이므로 두 식을 서로 빼고, l을 소거하면 위와 같이 k의 값을 계산할 수 있다

위에서 계산한 k의 값을 대입하면 l의 값은 위와 같다

깊이 값까지 포함된 최종 원근 투영 행렬 P는 위와 같다
위의 원근 투영 행렬은 모든 구성 요소가 카메라의 설정 값만을 사용하므로
모든 점에 사용되는 렌더링 파이프라인의 행렬로 사용할 수 있다
'수학 > 이득우의 게임 수학' 카테고리의 다른 글
| 원근 투영 (5) - 깊이 버퍼와 깊이 테스팅 (0) | 2026.06.17 |
|---|---|
| 원근 투영 (4) - 원근 보정 매핑 (0) | 2026.06.10 |
| 원근 투영 (2) - 동차 좌표계 (0) | 2026.05.27 |
| 원근 투영 (1) - 원근 투영 변환의 원리 (0) | 2026.05.20 |
| 삼중곱 (0) | 2026.05.13 |