수학/이득우의 게임 수학

원근 투영 (3) - 깊이 값

monstro 2026. 6. 3. 19:14
728x90
반응형

- 개요

나중에 그린 물체가 앞에 그려지는 현상 - 이미지 출처 : https://learnopengl.com/Advanced-OpenGL/Depth-testing

 

원근 투영 행렬을 활용하여 3차원의 물체를 원근감 있게 표현할 수 있다

이때 물체에 텍스처를 입힌다면 추가 고려 사항이 발생한다

사용자가 보는 화면은 결국 2차원 평면이므로 나중에 그린 물체가 앞에 보이게 된다

가장 마지막에 그린 바닥이 모든 큐브를 덮어씌우게 된다

위와 같은 문제를 해결하는 방법은 물체가 카메라로부터 얼마나 떨어져 있는지를 기록하여

앞에 있는 물체 나중에 그리도록 설정하는 것이다

이를 위해 카메라로부터 물체가 얼마나 떨어져있는지 파악하기 위한 깊이 값이 필요하다

 

- 깊이 값의 계산

1)  NDC의 범위를 3차원으로 확장 

3차원으로 확장된 NDC 영역

 

2차원 평면이었던 NDC 영역에 깊이 값을 추가하게 되면 3차원으로 영역이 확장된다

이때 깊이 값의 범위를 동일하게 [-1, 1]로 가정한다

 

카메라에 설정한 절두체

 

카메라에 부여된 시야각깊이와 무관하므로 카메라에 추가 속성을 부여해야 한다

이때 부여하는 속성을 각각 근평면원평면이라고 표현한다

카메라 시야를 구성하는 사영 공간을 근평면과 원평면으로 잘라주면

위와 같이 사각뿔에서 뾰족한 부분이 잘린 형태가 되는데, 이를 절두체라고 표현한다

 

3차원으로 확장한 NDC의 범위

 

절두체로 생성되는 3차원 NDC 영역의 범위는 위와 같이 구성된다

NDC의 깊이 값은 멀어질수록 증가하므로 3차원 NDC 공간은 왼손 좌표계를 형성한다

 

2) 원근 투영 행렬에 깊이 값을 적용

원근 투영 행렬 수정 (1)

 

이전에 원근 투영 행렬을 모델링 행렬뷰 행렬과 곱하기 위해 

인위적으로 네 번째 행과 열을 단위 벡터로 채워 4 X 4 크기의 원근 투영 행렬을 생성하였다

이제 깊이 값을 추가하였으므로 모든 행렬을 활용할 수 있다

기존 원근 투영 행렬의 3행 4행으로 옮기고 3행깊이 값을 구하는 용도로 변경한다

뷰 공간의 점을 나타내는 v의 값을 (v1, v2, v3, 1)로 지정하면 원근 투영 행렬 P는 위와 같다

 

원근 투영 행렬 수정 (2)

 

깊이 값을 계산하기 위해 사용하는 세 번째 행은 4개의 미지수를 사용하였다

이때 깊이 값은 뷰 좌표계의 X축Y축에 직교하므로 X축과 Y축에 대응하는 값은 0으로 설정한다

이제 남은 2개의 미지수의 값을 구하기 위해서는 2개의 샘플 데이터가 필요하다

 

3) 2개의 샘플 데이터의 계산

근평면의 점 P1과 원평면의 점 P2

 

카메라에 설정된 근평면원평면의 값을 사용하여 2개의 미지수의 값을 계산할 수 있다

카메라~근평면까지의 거리를 n으로 가정하고, 카메라~원평면까지의 거리를 f로 가정한다

그리고 카메라의 중심으로부터 시선 방향으로 n만큼 이동한 근평면 상에 위치한 점이 있다고 가정한다

뷰 공간에서 카메라의 시선 방향은 -Z이므로 뷰 공간에서의 이 점의 좌표는 (0, 0, -n, 1)이 된다

이 값은 깊이 값의 시작 지점이므로 NDC의 (0, 0, -1) 좌표에 대응한다

동일하게 뷰 공간의 원 평면상의 좌표는 (0, 0, -f, 1)이 되는데,

이 좌표는 깊이 값의 끝 지점이기 때문에 NDC의 (0, 0, 1) 좌표에 대응한다

원근 투영 행렬뷰 공간의 점을 곱한 결과는 클립 좌표이므로

최종적으로 근평면의 점 P1과 원평면의 점 P2는 위와 같이 계산된다

 

뷰 공간의 NDC 좌표와 NDC 값의 비교

 

아직 원근 투영 행렬의 2개의 미지수의 값을 모르므로 클립 좌표의 세 번째 요소를 계산할 수 없다

하지만 클립 좌표의 네 번째 요소로 모든 요소를 나눈 값은 NDC 좌표를 가리키고,

NDC 좌표의 Z값은 각각 -11이다

따라서 근평면의 클립 좌표는 (0, 0, -n, n)이고 원평면의 클립 좌표는 (0, 0, f, f)가 된다

최종적으로 위와 같이 근평면원평면의 위치를 세 가지 좌표로 표현할 수 있다

 

4) 깊이 값이 포함된 최종 원근 투영 행렬의 계산

계산된 근평면의 점 P1과 원평면의 점 P2

 

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

 

 

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

 

 

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

 

 

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

 

최종 완성된 원근 투영 행렬

 

깊이 값까지 포함된 최종 원근 투영 행렬 P는 위와 같다

위의 원근 투영 행렬은 모든 구성 요소가 카메라의 설정 값만을 사용하므로

모든 점에 사용되는 렌더링 파이프라인의 행렬로 사용할 수 있다

728x90
반응형