오브젝트는 로컬스페이스에 정의되어 진다.
로컬 스페이스에 정의되어진 오브젝트 월드변환에 의해 월드스페이스로 이동한다.
월드스페이스에는 렌더링할 대상의 물체들과 카메라, 광원등이 배치되고,
뷰행렬에 의해 뷰스페이스로 버텍스들이 변환되어 이동한다.
뷰스페이스로의 변환을 다시 한 번 보자면, 카메라가 원점으로 이동하고
이동을 한 만큼 모든 물체도 같은 방향과 크기만큼 이동하게 된다.
그 다음, 카메라를 원점으로 이동시키는 이동변환,
카메라의 각 방향벡터를 새로운 축으로 하도록 회전변환이 이루어 진다.

카메라변환 다음으로, 투영변환이 이루어 진다.

위의 그림에서 왼쪽은 카메라좌표계의 xz 평면이고, 이 상태에서 투영변환된 것이 오른쪽의 xz 평면이다.
왼족그림에서 원점에 카메라가 있고, 카메라가 비출 수 있는 만큼의 공간의 공간이 빨간선이 둘러진 부분이고,
그림에서는 near 에서 far 까지의 공간이 카메라에 비춰진다.
또한 near는 좁고, far 부분은 넓은데, 그 이유는 원근을 나타내기 위함이다.
왼쪽 그림에서 빨간선으로 둘러진 부분을 절두체 공간이라고 한다.
투영변환은 이 절두체 공간을 오른쪽 그림과 같은 공간으로 변환하는 것을 말한다.
Direct3D에서는 변환과정을 하나의 4*4 행렬로 나타내는데, 투영변환 행렬은 아래와 같다.

n : 카메라에서 가장 가까운 절두체 면까지의 거리
f : 카메라에서 가장 먼 절두체 면까지의 거리
Width : 카메라에서 가장 가까운 절두체 면의 너비
Height : 카메라에서 가장 가까운 절두체 면의 높이
이제 구체적으로 위와같은 투영변환행렬의 유도과정을 살펴보겠다.
투영변환행렬에 의해 뷰스페이스의 점 P(x, y, z)를 (-1, -1, 0) ~ (1, 1, 1)로 표현되는
공간상의 점 Q(x, y, z)로 변환한다고 하고,

점 P의 x가 점Q의 X로 변환되는 과정을 살펴보겠다.

절두체공간의 xz 평면위에 정점P가 위의 그림처럼 위치한다고 할 때,
점 P를 near 상에 사영시키면, 사영된 점 T의 x좌표가 투영변환된 점 Q의 X이다.
사영된 점 T의 X 좌표는 닮음비를 이용해서 구해보겠다. 계산과정은 아래와 같다.

투영변환에 의해 정점이 이동되는 공간은 ( -1, -1, 0 ) ~ ( 1, 1, 1 )의 공간이므로,
[-1, 1]로 범위를 조정하는 계산을 추가로 해주겠다. 과정은 아래와 같다.

정리하자면, X는 아래와 같다.

위의 수식중, 중간의 식이 최종변환된 X의 수식이고,
마지막의 식이 나중에 행렬을 구할 때 계산편의상 X에 z를 곱해놓은 식이다.
마찬가지로 y에서 Y로의 변환은 아래와 같다.

마지막으로 z에서 Z로의 변환을 살펴보겠다.
z의 변환의 경우 x, y의 변환과는 계산과정이 다르지만 어렵지 않다.

위와 같은 형식으로 Z를 표기할 때

z가 n 일 경우 변환된 Z는 0 이고,
z가 f 일 경우 변환된 Z는 1이 된다.
따라서, A와 B를 구하여 대입하면

위와 같은 결과를 얻을 수 있다.
정리하자면

이제, (x, y, z, 1) 이 (zX, zY, zZ, z) 로 변환되도록 행렬을 구성하면 된다.
(X, Y, Z, 1) 를 (zX, zY, zZ, z) 로 편의상 바꿔놨다고 생각하면 될 것 같다.

이 때, right = - left 이고, top = - bottom 이므로, 행렬의 (3, 1)성분과 (3, 2)성분이 0 이 된다.
또, right-left = Width, top - bottom = Height 로 정의하면, 최종 투영변환행렬이 아래와 같이 얻어지게 된다.

'Programming > Soft Renderer_2019' 카테고리의 다른 글
#14 정수만 사용해 선 빠르게 그리기 (0) | 2019.12.16 |
---|---|
#12 NDC(Clip Space)란 무엇인가? (0) | 2019.12.16 |
#10 삼각형 내부 외부 판별 (0) | 2019.12.16 |
#9 백페이스 컬링 (0) | 2019.12.16 |
#8 벡터 내적과 외적을 응용한 왼쪽과 오른쪽의 판별 (0) | 2019.12.16 |