게임이란 콘텐츠는 사용자가 스테이지를 만드는 것이 아니라, 게임을 플레이하는 사람을 대변하는 아바타가 게임 공간(월드 공간)을 탐험하는 형태로 구성되는 것이 일반적입니다. 아바타를 중심으로 시야 영역 내의 모습들이 모니터 화면에 표시하는 형태로 구현되며, 이는 월드 공간의 일부분을 화면에 표현하는 방식으로 구현됩니다.
이러한 내용을 구현하기 위해 아바타가 보는 시야를 우리가 볼 수 있게 어떤 가상의 카메라가 필요하고, 카메라에 보이는 모든 물체들이 카메라 시야를 기준으로 재해석되어 렌더링 되어야 합니다.
즉, 카메라에 보이는 물체들은 카메라를 기준으로 월드 공간에 재배치되어야 하고, 이러한 공간을 뷰 공간(View Space)라고 합니다.
카메라를 시점으로 재해석하지 않으면, (1)사진처럼 월드 공간 내에서 원점을 기준으로밖에 표현될 수 없습니다. 하지만 월드 공간이 방대하게 크다면, 이를 화면에 다 담는 것은 불가능하죠.
그렇기에 카메라를 사용하여 (2)사진처럼 월드 공간의 일부분을 화면에 표시하는 방식을 사용하게 되는 것입니다. 이를 위해선 월드 공간에서 뷰 공간으로 변환을 해줘야 하죠.
2. 뷰 공간(View Space)
카메라를 원점으로 하여, 월드 공간을 재배치한 공간을 의미합니다. 카메라 또한 월드 공간 내에 배치된 물체이고, 이 카메라를 원점으로 하여 기존에 배치된 물체들을 다시 배치한 것이죠.
예를 들어, 다음과 같이 카메라가 \((-10, \ -10)\) 위치에 있을 때, 기존 월드 공간에서 \((10, \ 10)\) 에 위치하던 물체는
카메라를 기준으로 해당 물체를 재배치하면, 다음과 같이 \((20, \ 20)\) 에 위치하게 됩니다.
이것은 기존 월드 공간을 기준으로 하는 카메라의 위치를 역으로 계산한 값에 물체의 위치를 더함으로써 구현할 수 있습니다. 즉, "View 좌표 = -카메라 좌표 + 오브젝트의 월드 좌표" 인 것이죠.
$$ (20, \ 20) = -(-10, -10) + (10, \ 10) $$
카메라 위치를 역으로 계산하면, 카메라와 월드 공간의 원점과의 상대적인 거리를 구할 수 있습니다. 기존 카메라 좌표가 \((-10, -10)\) 이었기 때문에, 카메라를 기준으로 보면 월드의 원점이 \((10, \ 10)\) 이라는 소리가 되는 것이죠.
그리고 나머지 물체들의 좌표는 월드 원점을 기준으로 계산되어 있기 때문에, 여기에 위에서 구한 카메라와 원점의 상대적인 거리 \((10, \ 10)\) 을 더해주기만 하면 카메라를 기준으로 물체들이 재배치 된 셈이 되는 것입니다.
이것을 행렬 관점에서 한 번 봅시다.
카메라 위치 값을 역으로 계산한 것은 카메라 트랜스폼이 가지고 있었던 이동 값에 역행렬을 취했다고 해석 가능.
물체의 좌표를 더하는 것은 해당 물체가 이동했다는 뜻이니까, 이동 행렬을 행렬곱으로 곱한다라고 해석 가능.
따라서, "View 좌표(\(V\) ) = -카메라 좌표(\(T_c\)) + 오브젝트의 월드 좌표(\(T_o\))" 는 행렬을 통해 다음과 같이 표현할 수 있습니다.
$$ V = T_c^{\ -1} \cdot T_o $$
여기서, \(T_c^{\ -1}\) 에 해당하는 행렬을 뷰 행렬(View Matrix)이라고 부릅니다.
3. 뷰 행렬(View Matrix)의 계산
카메라의 이동 기능
이 때까지 알아봤던 변환 과정을 다시 한 번 보도록 합시다.
어떤 물체를 실제로 렌더링하기 위해서, 메쉬의 정점들을 로컬 좌표계를 기준으로 배치합니다. 그리고, 배치된 이 로컬 좌표에 모델링 행렬(\(TRS\))을 곱해줌으로써, 월드 공간의 좌표를 얻을 수 있었습니다.