행렬(Matrix) 스터디 - 좌표계 변환, World 변환, View 변환, Projection 변환 행렬
좌표계 변환 행렬
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
<이득우의 게임 수학:39가지 예제로 배운다! 메타버스를 구성하는 게임 수학의 모든 것> 구입 링크
https://link.coupang.com/a/9BqLd
유니티 에셋 스토어 링크
https://assetstore.unity.com?aid=1011lvz7h
(링크를 통해 도서/에셋 구입시 일정액의 수수료를 지급받습니다.)