깊이 값

ㅋㅋ·2022년 7월 12일
0

게임수학강의

목록 보기
20/20
  • 깊이 값의 필요성

3차원 공간에서 다수의 물체를 그릴 때, 그리는 순서를 고려하지 않으면

나중에 그려지는 물체가 먼저 그려진 물체보다 무조건 앞에 그려지게 됨

  • 절두체 (Frustum)

카메라로 만들어지는 사영 공간의 z 값에 범위를 설정하여
사각뿔에서 꼭지가 잘라진 육면체를 만들 수 있는데, 이를 절두체라고 함

카메라와 가까운 평면을 근평면(Near plane), 먼 평면을 원평면(Far plane)이라 함

  • NDC 확장

근평면의 z축 값을 -1, 원평면의 z축 값을 1이라고 하여, (directX는 0 ~ 1)

NDC 공간을 3차원으로 확장

=>
(z축 값의 -값을 곱하여)
NDC 공간은 왼손 좌표계로 변환된다

  • 최종 투영 행렬
    카메라의 z축 시작 값은 n
    카메라의 z축 끝 값은 f라고 해보자

뷰 좌표계 (0, 0, -n), (0, 0, -f)
=>
NDC 좌표계 (0, 0, -1), (0, 0, 1)

기존 투영 행렬에서 z축 값들을 구해야 한다.

P vview=[da0000d00ijkl0010][vxvyvz1]=[davxdvy?vz]P\cdot\ v_{view}=\left[\begin{matrix}\frac{d}{a}&0&0&0\\0&d&0&0\\i&j&k&l\\0&0&-1&0\\\end{matrix}\right]\left[\begin{matrix}v_x\\v_y\\v_z\\1\\\end{matrix}\right]=\left[\begin{matrix}\frac{d}{a}\cdot v_x\\d\cdot v_y\\?\\-v_z\\\end{matrix}\right]

깊이 값은 x와 y에 직교하기 때문에 i와 j는 0이다.

(0, 0, -n)일 때 (0, 0, -n, n)이 나와야 하기 때문에

P vview=[da0000d0000kl0010][00n1]=[00nn]P\cdot\ v_{view}=\left[\begin{matrix}\frac{d}{a}&0&0&0\\0&d&0&0\\0&0&k&l\\0&0&-1&0\\\end{matrix}\right]\left[\begin{matrix}0\\0\\-n\\1\\\end{matrix}\right]=\left[\begin{matrix}0\\0\\-n\\n\\\end{matrix}\right]

위와 같아야 하고 아래의 식을 구할 수 있다.

kn+l=n-kn + l = -n

(0, 0, -f)일 때 (0, 0, f, f)가 나와야 하기 때문에

P vview=[da0000d0000kl0010][00f1]=[00ff]P\cdot\ v_{view}=\left[\begin{matrix}\frac{d}{a}&0&0&0\\0&d&0&0\\0&0&k&l\\0&0&-1&0\\\end{matrix}\right]\left[\begin{matrix}0\\0\\-f\\1\\\end{matrix}\right]=\left[\begin{matrix}0\\0\\f\\f\\\end{matrix}\right]

위와 같아야 하고 아래의 식을 구할 수 있다.

kf+l=f-kf + l = f

두 식의 연립 방정식을 풀면 k와 l을 구할 수 있고 이는 최종적으로 아래와 같다.

P=[da0000d0000n+fnf2nfnf0010]P=\left[\begin{matrix}\frac{d}{a}&0&0&0\\0&d&0&0\\0&0&\frac{n+f}{n-f}&\frac{2nf}{n-f}\\0&0&-1&0\\\end{matrix}\right]

0개의 댓글