본문 바로가기
DirectX 12/Vector & Matrix

[DirectX12 - Vector & Matrix] Chapter 06. Projection, Screen 변환 행렬

by song.ift 2023. 6. 30.

PROJECTION SPACE (HOMEGENEOUS CLIP SPACE) 투영행렬

3D화면 좌표계를 2D화면 좌표계로 만드는 변환 행렬

 


 

원근투영
near(n) 와 far(f) 가 있다.
그 안에 들어가는 것들만 보여준다.

투영 좌표게는 정사각형
비율은 1로 들어간다.
x와 y는 최소 -1,-1 좌표에서 최대 1,1, 좌표다
그래서 뷰에서 투영 좌표계로 들어가려면 어떤 값이던 간에 적절히 비율을 따져서
연산하게 돼서 -1 ~ 1 사이의 점으로 표현이 돼서
나중에 화면의 비율을 이용해서 화면에 물체를  그려준다고 생각하면 된다.

투영좌표계에서 x와 y는 -1에서 1 사이의 범위를 표현한다했는데,
깊이(z)는 0 ~ 1까지를 표현한다

또 이 과정에선 최종적으로 물체를 그릴지말지 체크하는 DSV(뎁스 스텐실 뷰)를 연산하는 걸 같이 한다.
 
fov는 카메라가 찍을수있는 각도

투영 좌표게로 넘어가는 핵심은 모든것을 비율로 생각한다.
이 변환의 핵심.
그래서, 얼마나 카메라로부터 떨어져있는지, 깊이값이 얼마나 되느냐, z가 핵심

비례식 비율에 의해
X = x / z;
Y = y / z;

 



-1,-1 ~ 1,1 에서 나중에 스크린 화면 대충 800x600 으로 가는 것임
스크린의 비율대로 늘려준다고 하면 1의 정사각형에 있다가 800x600의 직사각형으로 가는것이기 때문에 
결과적으로 비율이 이상하게 간다는 점이 생긴다.

우리가 원하는 것은 화면에 보이기는 하지만, 화면이 늘어나는만큼 억지로 늘리는 것이 아니기 때문에 따로 처리해야한다.
쉽게 말해서, 화면의 비율을 미리 생각해서 x좌표에 조작을 해주게 된다.

일반적으로 r(ratio) = w / h
r = 800 / 600 = 1.3

그래서 x를 구할 때, X = x / (r * z) 

 



z로 나눌려면 깊이값을 어딘가 저장해야 하는데 그걸 (x, y, z, w)에 안쓰는 w 자리로 z를 보존함

투영행렬 과정은 너무 어려워서 구글링 해볼것


 

screen space (window space)

그렇게 투영된 물체의 좌표들은 -1 ~ 1 까지 위치해있다.
그다음에 해야될 것은 화면에 좌표를 띄워야한다.

뷰포트 상에서 물체는 왼쪽 위를 Left, TOp 이라 한다.

그럼 투영 좌표계에서도 비례식을 이용해서
-1, 1 을 기준으로 (왼쪽 상단은 -1, -1이 아니라 -1, 1 이다)
X = Left + ((x+1) / 2) * w
Y = Top + ((1-y) / 2) * h

2를 나누는건 -1 ~ 1 까지 거리가 2이기 때문.

 

댓글