WinCNT

Transform(변환) 3 본문

게임 프로그래밍(학습 내용 정리)/3D Game Programming

Transform(변환) 3

WinCNT_SSS 2022. 3. 23. 11:22

Projection Transform Matrix


World TM

자주 사용할 게 될 Transform Matrix

 

View TM

사실 한 번 만들면 잘 안 씀

(만들고 나면 팩터로 카메라를 컨트롤할 뿐임)

카메라 기술이 대단한 게 나오지 않았음

 

Projection TM

뷰 좌표계(카메라)의 내용을 NDC로 투영(Projection)

NDC - 클립 스페이스라고 부르는 경우도 있으며, 물체의 상이 맺히는 공간을 말함

 

 

Projection TM의 구현


(용책 p.188에 식에 대한 유도는 있음)

 

 

눈과 카메라에 상이 맺히는 원리

눈에 상이 맺히는 원리
카메라에 상이 맺히는 원리

카메라는 눈에 상이 맺히는 원리를 흉내 내서 만들었다

3D 그래픽스에서는 뷰 프러스텀의 공간을 직육면체로 바꿔서 깊이를 눌러 표시한다(??)

 

 

시야 절두체(뷰 프러스텀 - View Frustum)

Near Plane과 Far Plane

 

x,y,z의 스케일 변환

dz 값

 

원근 투영에서

a34가 1인 것은 z의 값을 벡터의 w에 저장하기 위해서이다

(참고로 a34로 w에 z값을 저장하기 위해서 a44는 0이다)

왜 이런 짓을 하느냐?

나중에 직육면체로 만들기 위해 z값으로 나눠주는 작업이 필요하다

 

참고로 z로 나누는 것이 행렬 연산에 없고 따로 분리하는 것은 비선형적이기 때문

 

 

Z축의 길이로 나누지 않기 때문에 3행4열은 1이 아닌 0이다
1행 1열, 2행 2열은 NDC의 [-1, 1]에 비례시키기 위한 값
원근 투영의 경우, 그 값을 보통 종횡비와 절두체의 각도로 구한다
(또한 종횡비에서 높이h를 2로 두는 경우가 많다)
3행 3열은 NDC의 [0, 1]에 비례시키기 위한 값
4행 3열은 Near 평면을 투영 창으로 끌어오(이동시키)기 위한 값

중요한 것은 원근 투영에서는 Z축에 대한 보간이 필요하다
각 버텍스의 Z값으로 나누는 처리로 Z축에 대한 보간을 할 수 있다
예를 들어, 같은 크기의 오브젝트가 z값이 0.1, 10인 곳에 위치한다고 했을 때
각각의 오브젝트를 z값으로 나눠주면 0.1에 있는 오브젝트는 10배 크게 될 것이고
10에 있는 오브젝트는 1/10배로 작게 될 것이다

 

 

 

직교 투영

반면 직교 투영은 그냥 종횡비를 맞춰주기만 하면 된다

 

직교 투영에서는 Z축을 반영하지 않는다
즉, Z축의 길이로 나누지 않기 때문에 3행4열은 1이 아닌 0이다
1행 1열, 2행 2열은 NDC의 [-1, 1]에 비례시키기 위한 값
스크린의 실제 값으로도 구할 수 있으며,
종횡비를 알 경우, 가로나 세로를 임의의 숫자로 두고 구할 수도 있다
(보통 높이h를 2로 두는 경우가 많다)
3행 3열은 NDC의 [0, 1]에 비례시키기 위해 (Far - Near)으로 나누는 값
4행 3열은 Near 평면을 투영 창으로 끌어오(이동시키)기 위한 값
Z축에 대한 보간이 없기 때문에 행렬의 곱을 하고 Z축의 값만큼 나누지 않는다

 

isometric game에 주로 사용

2D를 3D로 만들 수 있다

Y축의 높이에 따라 Z축도 바뀌게 됨

 

SSS