본문으로 바로가기

뷰 변환 ( View Transformation, Camera Transformation )

category Graphics/이론 2022. 11. 8. 14:27

뷰 공간

월드 공간은 굉장히 넓은 영역이다. 이 영역을 다 보여줄 순 없고, 플레이어가 특정 원하는 지점을 보여줘야 하는데

이러한 화면을 보여주기 위해 하나의 '가상 카메라' 가 있다고 생각하는 것이다.

화면에 대응하는 카메라를 만들고 이 카메라를 중심으로 화면이 보이도록 해야한다.

 

이를 위해서는 카메라를 중심으로 물체의 정보를 재조정하는 작업이 필요하는데, 카메라를 중심으로 변환한 공간을 뷰 공간 (View Space) 라고 한다.

 

 

사실 뷰 변환이라는건 별거 없다.

모든 정점을 '카메라 위치로 재변환' 하는것인데 이를 다르게 생각해보면

1. 카메라를 원점으로 보낸다

2. 원점으로 보낸 변환을 모든 오브젝트에 적용한다

-> 카메라는 원점에 있으며 모든 오브젝트는 카메라의 변환만큼 카메라와 동일하게 이동했다.

 

가 되는것이다.

 

즉 카메라에 적용된 월드변환의 역행렬을 모든 오브젝트에 적용시키면

카메라는 원점에 있으면서, 모든 오브젝트가 카메라의 공간에 온 것처럼 되는 것이다.

 

예) 카메라가 (-10, -10)에 있고, 오브젝트가 (10, 10) 에 있다고 생각해보자
카메라가 원점으로 돌아가려면 (x, y) 에 10씩 더해주면 된다.
그럼 카메라가 (0, 0) 일때 오브젝트는 (20, 20) 에 있게 되고, 거리는 카메라가 원점으로 돌아가기 전과 동일하다.

 

이 개념을 가지고 뷰 공간으로 변환해주는 뷰 행렬을 설계해보자.

카메라는 크기의 개념이 없기때문에, 카메라는 회전과 이동만으로 구성된다.

 

카메라의 이동행렬의 역행렬은 다음과 같다

 

$$\begin{bmatrix}
1 & 0 & 0 & 0\\
0 & 1 & 0 & 0\\
0 & 0 & 1 & 0\\
-Tx & -Ty & -Tz & 1
\end{bmatrix}$$

 

덧셈의 역원인 반대수를 생각해보면 이동행렬의 역행렬은 당연하다.

 

다음은 카메라의 회전행렬의 역행렬이다.

일단 카메라의 회전행렬이 다음과 같다고 생각해보자

 

$$ \begin{bmatrix}
Xx & Xy & Xz & 0\\
Yx & Yy & Yz & 0\\
Zx & Zy & Zz & 0\\
0 & 0 & 0 & 1
\end{bmatrix}$$

 

회전행렬의 역행렬은 전치행렬이라는것을 알아야 한다.

( -theta 만큼 회전했다고 생각했을 때, 삼각함수의 성질을 생각하면 sin(-theta) 부분들은 다 -sin(theta)가 된다. 이를 2차원 회전 변환에 대해서 생각해보면, 전치행렬이다. )

 

즉 회전행렬의 역행렬은 다음과 같다.

 

$$\begin{bmatrix}
Xx & Yx & Zx & 0\\
Xy & Yy & Zy & 0\\
Xz & Yz & Zz & 0\\
0 & 0 & 0 & 1
\end{bmatrix}$$

 

우리가 기존에 아핀 변환 행렬은 SRT 로 만들었다.

역행렬은 순서가 반대가 되어야 하므로 

 

$$V_{view} = T^{-1}R^{-1} $$ 

 

$$V_{view} = 
\begin{bmatrix}
1 & 0 & 0 & 0\\
0 & 1 & 0 & 0\\
0 & 0 & 1 & 0\\
-Tx & -Ty & -Tz & 1
\end{bmatrix}
\begin{bmatrix}
Xx & Yx & Zx & 0\\
Xy & Yy & Zy & 0\\
Xz & Yz & Zz & 0\\
0 & 0 & 0 & 1
\end{bmatrix}
=
 \begin{bmatrix}
Xx & Yx & Zx & 0\\
Xy & Yy & Zy & 0\\
Xz & Yz & Zz & 0\\
-dot(T, X) & -dot(T, Y) & -dot(T, Z) & 1
\end{bmatrix}$$

 

라는 결과가 나온다.

(여기서 dot은 T와 각 X, Y, Z요소가 곱해지면 내적과 동일함을 의미한다.)