<--! 수학 기호 --> [게임 수학] #16 | 뷰 공간(View Space)

새소식

반응형
Dev Knowledge/게임 수학

[게임 수학] #16 | 뷰 공간(View Space)

  • -

 *인프런 <게임 엔진을 지탱하는 게임수학, 이득우 교수님> 강의를 듣고 공부한 글입니다.

 

 

 

1. 카메라(Camera)

 

게임이란 콘텐츠는 사용자가 스테이지를 만드는 것이 아니라, 게임을 플레이하는 사람을 대변하는 아바타가 게임 공간(월드 공간)을 탐험하는 형태로 구성되는 것이 일반적입니다. 아바타를 중심으로 시야 영역 내의 모습들이 모니터 화면에 표시하는 형태로 구현되며, 이는 월드 공간의 일부분을 화면에 표현하는 방식으로 구현됩니다.

 

이러한 내용을 구현하기 위해 아바타가 보는 시야를 우리가 볼 수 있게 어떤 가상의 카메라가 필요하고, 카메라에 보이는 모든 물체들이 카메라 시야를 기준으로 재해석되어 렌더링 되어야 합니다.

 

즉, 카메라에 보이는 물체들은 카메라를 기준으로 월드 공간에 재배치되어야 하고, 이러한 공간을 뷰 공간(View Space)라고 합니다.

 

(1) 월드 공간만 있는 경우
(2) 뷰 공간을 추가한 경우

 

카메라를 시점으로 재해석하지 않으면, (1)사진처럼 월드 공간 내에서 원점을 기준으로밖에 표현될 수 없습니다. 하지만 월드 공간이 방대하게 크다면, 이를 화면에 다 담는 것은 불가능하죠.

 

그렇기에 카메라를 사용하여 (2)사진처럼 월드 공간의 일부분을 화면에 표시하는 방식을 사용하게 되는 것입니다. 이를 위해선 월드 공간에서 뷰 공간으로 변환을 해줘야 하죠.

 

 


2. 뷰 공간(View Space)

 

카메라를 원점으로 하여, 월드 공간을 재배치한 공간을 의미합니다. 카메라 또한 월드 공간 내에 배치된 물체이고, 이 카메라를 원점으로 하여 기존에 배치된 물체들을 다시 배치한 것이죠.

 

예를 들어, 다음과 같이 카메라가 \((-10, \ -10)\) 위치에 있을 때, 기존 월드 공간에서 \((10, \ 10)\) 에 위치하던 물체는

 

 

카메라를 기준으로 해당 물체를 재배치하면, 다음과 같이 \((20, \ 20)\) 에 위치하게 됩니다.

 

 

이것은 기존 월드 공간을 기준으로 하는 카메라의 위치를 역으로 계산한 값에 물체의 위치를 더함으로써 구현할 수 있습니다. 즉, "View 좌표 = -카메라 좌표 + 오브젝트의 월드 좌표" 인 것이죠.

 

$$ (20, \ 20) = -(-10, -10) + (10, \ 10) $$

 

카메라 위치를 역으로 계산하면, 카메라와 월드 공간의 원점과의 상대적인 거리를 구할 수 있습니다. 기존 카메라 좌표가 \((-10, -10)\) 이었기 때문에, 카메라를 기준으로 보면 월드의 원점이 \((10, \ 10)\) 이라는 소리가 되는 것이죠.

 

그리고 나머지 물체들의 좌표는 월드 원점을 기준으로 계산되어 있기 때문에, 여기에 위에서 구한 카메라와 원점의 상대적인 거리 \((10, \ 10)\) 을 더해주기만 하면 카메라를 기준으로 물체들이 재배치 된 셈이 되는 것입니다.

 

 

이것을 행렬 관점에서 한 번 봅시다.

  1. 카메라 위치 값을 역으로 계산한 것은 카메라 트랜스폼이 가지고 있었던 이동 값에 역행렬을 취했다고 해석 가능.
  2. 물체의 좌표를 더하는 것은 해당 물체가 이동했다는 뜻이니까, 이동 행렬을 행렬곱으로 곱한다라고 해석 가능.

 

따라서, "View 좌표(\(V\) ) = -카메라 좌표(\(T_c\)) + 오브젝트의 월드 좌표(\(T_o\))" 는 행렬을 통해 다음과 같이 표현할 수 있습니다.

 

$$ V = T_c^{\ -1} \cdot T_o $$ 

 

여기서, \(T_c^{\ -1}\) 에 해당하는 행렬을 뷰 행렬(View Matrix)이라고 부릅니다.

 

 


3. 뷰 행렬(View Matrix)의 계산

 

카메라의 이동 기능

 

이 때까지 알아봤던 변환 과정을 다시 한 번 보도록 합시다.

어떤 물체를 실제로 렌더링하기 위해서, 메쉬의 정점들을 로컬 좌표계를 기준으로 배치합니다. 그리고, 배치된 이 로컬 좌표에 모델링 행렬(\(TRS\))을 곱해줌으로써, 월드 공간의 좌표를 얻을 수 있었습니다.

 

$$ v_{world} = M \cdot v_{local} = TRS \cdot v_{local} $$

 

여기에 카메라 오브젝트가 주어진다면, 카메라 오브젝트의 트랜스폼을 기반으로 월드의 점은 다음과 같이 변환할 수 있습니다.

 

$$ v_{view} = T_c^{\ -1} \cdot v_{world} = T_c^{\ -1} \cdot TRS \cdot v_{local} $$

 

이때, \(T_c^{\ -1}\) 에 해당하는 행렬을 뷰 행렬(View Matrix)이라고 하며, 카메라의 트랜스폼 정보가 있으면 생성이 가능합니다.

 

 

카메라의 회전 기능

 

카메라가 회전을 하게 된다면, 월드의 입장에서는 반대로 돌아가는 것처럼 보여질 겁니다. 즉, 카메라를 돌린다면 화면은 반대로 돌아가는 개념으로 해석할 수 있고, 이것 역시 역행렬를 취한 결과와 동일합니다.

 

그렇다면 이동에도 역행렬이 적용되고, 회전에도 역행렬이 적용되므로 사실상 \((T_cR_c)^{-1}\)월드 공간에 적용하는 것과 같다고 볼 수 있습니다.

*카메라의 크기가 커지거나 작아진다해서, 물체가 더 크게 보이거나 작게 보이진 않으므로 크기(S) 행렬은 의미가 없습니다.

 

$$ v_{view} = V \cdot M \cdot v_{local} = (T_cR_c)^{-1} \cdot M \cdot v_{local} = R_c^{-1}T_c^{-1} \cdot TRS \cdot v_{local} $$

$$ \therefore V = R_c^{-1}T_c^{-1} $$

 

회전의 역행렬은 전치 행렬이라고 했었습니다. 

 

$$ R^{-1} = R^T = \begin{bmatrix} cos\theta & sin\theta & 0 \\ -sin\theta & cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix}$$

 

이동의 역행렬은 이동 값에다가 마이너스를 취한 값이라고 볼 수 있습니다. 그래야 원래 행렬과 더했을 때, 항등 행렬이 나올테니까요.

 

$$ T^{-1} = \begin{bmatrix} 1 & 0 & -t_x \\ 0 & 1 & -t_y \\ 0 & 0 & 1 \end{bmatrix}$$

 

따라서, 위의 두 가지 행렬을 곱한 결과는 다음과 같습니다.

 

$$ V = R^{-1}T^{-1} = \begin{bmatrix} cos\theta & sin\theta & -(t_x cos\theta + t_y sin\theta) \\ -sin\theta & cos\theta & -(-t_x sin\theta + t_y cos\theta) \\ 0 & 0 & 1 \end{bmatrix}$$

 

 


정리

 

어떤 물체들을 배치하고, 실제로 게임 상에서 플레이어를 대변하는 아바타가 게임 월드를 탐험하기 위해서는 다음과 같은 추가적인 과정이 필요하다고 볼 수 있습니다.

  1. 카메라로부터 뷰 행렬(\(V\))을 구해 계산한다.
  2. 씬에 속한 모든 게임 오브젝트를 순차적으로 순회한다.
    • 게임 오브젝트의 모델링 행렬(\(M\))을 계산한다.
    • 뷰 행렬과 모델링 행렬을 곱한 결과를 최종 행렬로 저장한다. 👉🏻 \(T_{final} = V \cdot M\)
    • 최종 행렬메시의 정점을 모두 곱한다. 👉🏻 \(v_{view} = T_{final} \cdot v_{local} \)
    • 변환된 정점으로부터 삼각형을 생성하고, 이들을 각각 칠한다.

 

 

728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.