게임 개발 자료/DirectX 스터디

행렬(Matrix) 스터디 - 좌표계 변환, World 변환, View 변환, Projection 변환 행렬

원소랑 2023. 9. 13. 18:39

좌표계 변환 행렬

A좌표계에서 B좌표계로 변환하는 행렬.

좌표계 A에서 좌표계 B로의 변환 행렬은 일반적으로 각 축의 방향 벡터와 원점의 이동을 나타냄.

 

v = [x, y, z, 1]

 

| u_x  u_y  u_z  0 |
| v_x  v_y  v_z  0 |
| w_x  w_y  w_z  0 |
| Qx   Qy   Qz   1 |

 

역기서 u, v, w 는 A좌표계의 방향 단위 백터를 B좌표계 기준으로 표현한 것.

Q요소는 대상 좌표계 B 의 원점에서 A좌표계 원점의 좌표.

 

로컬 좌표계의 좌표들을 월드 좌표계로 변환해야할 때, 계층 순서대로 부모의 좌표계 SRT 행렬들을 곱해주는 방식으로 활용 됨.

World 변환 행렬

로컬(모델)좌표계의 SRT 를 부모의 SRT 변환 행렬을 World(Root)가 나올 때까지 순서대로 행렬 곱연산을 해주면 World 변환 행렬이 됨.

 

View 변환 행렬

카메라의 위치가 0,0,0 이고 회전이 전혀 없다면 View 변환이 불필요하겠지만, 보통의 경우 Camera 는 움직이고 있기 때문에 Camera 의 위치와 회전에 맞게 모든 물체들을 변환 해줘야 함. 이 때 생성해야 할 View Matrix(뷰 행렬).

 

모든 물체들이 카메라의 로컬 좌표계 기준으로 반대로 이동하고, 반대로 회전.

먼저 View 행렬의 회전부

| RightX  UpX  -ForwardX  0 |
| RightY  UpY  -ForwardY  0 |
| RightZ  UpZ  -ForwardZ  0 |
| 0       0       0          1 |

View 행렬의 이동부

| 1  0  0  0 |
| 0  1  0  0 |
| 0  0  1  0 |
| -EyeX  -EyeY  -EyeZ  1 |

위 두 행렬을 곱한다.

아래 행렬에서 dot 는 내적 함수. Eye 는 카메라의 위치.

|  RightX  UpX  -ForwardX  0  |
|  RightY  UpY  -ForwardY  0  |
|  RightZ  UpZ  -ForwardZ  0  |
| -dot(Right, Eye) -dot(Up, Eye) dot(Forward, Eye)  1 |

World 행렬에서 View 행렬 을 곱하면 카메라 뷰가 되고, 여기서 View행렬(-1)(역행렬)을 곱하면 다시 World 행렬이 됨.

Projection 변환 행렬

View 행렬까지 변환된 물체를 투영(Projection)시켜서 깊이가 1인 가상의 평면에 -1 ~ 1 사이의 영역으로 납작하게 변환하는 것.

 

벡터 v = (x,y,z) 가 있을 때, 각 요소들을 평면으로 투영시켜 z 비율만큼 값이 비례해서 -1 ~ 1 사이가 되도록 해야 함.

X = x / z

Y = y / z

 

여기서 모니터/화면 비율이 필요. 화면비가 800 x 600 이라고 할 때

r = w/h = 800/600 = 1.3

X = x / rz

Y = y / z

 

카메라의 절두체 FOV 각도가 45도가 아닐 수 있기 때문에 이를 적용.

tan(a/2) 를 분모에 곱해준다.

X = x / (rz * tan(a/2))

 

투영 행렬

fov 는 카메라의 시야각.

aspect 는 화면비율. (위에서 1.3)

f: Far plane의 거리
n: Near plane의 거리

| 1/(tan(fov/2)*aspect)   0           0               0 |
| 0                      1/tan(fov/2)  0              0 |
| 0                      0           -f/(f-n)         1 |
| 0                      0           -fn/(f-n)        0 |

 

Screen 변환 행렬

마지막. 프로젝션 결과물은 뷰포트 -1 ~ 1 사이로 프로젝션 되었기 때문에 Screen 크기에 맞게 변환해줄 필요가 있음.

w는 화면의 가로 너비.
h는 화면의 세로 높이.
(x, y)는 정규화된 장치 좌표(NDC).

| w/2    0     0     0 |
| 0    -h/2    0     0 |
| 0     0     1     0 |
| (x + w/2) (y + h/2) 0  1 |

<리얼-타임 렌더링(REAL-TIME RENDERING) 4/e> 구입 링크
https://link.coupang.com/a/8VWas

 

리얼-타임 렌더링 4/e

COUPANG

www.coupang.com

<이득우의 게임 수학:39가지 예제로 배운다! 메타버스를 구성하는 게임 수학의 모든 것> 구입 링크

https://link.coupang.com/a/9BqLd

 

이득우의 게임 수학:39가지 예제로 배운다! 메타버스를 구성하는 게임 수학의 모든 것

COUPANG

www.coupang.com

유니티 에셋 스토어 링크

https://assetstore.unity.com?aid=1011lvz7h 

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

(링크를 통해 도서/에셋 구입시 일정액의 수수료를 지급받습니다.)


728x90
반응형