컴퓨터그래픽스 9. View Transform
View Transform은 어떻게?
물체를 본다는 것이 무엇인가? 카메라 위치가 존재하고, 얼마나 볼건지 설정하고 (Viewing Volume 설정)
투영 후 클리핑, 백페이스 컬링을 하는 것. View Transform은 모든 Vertex를 카메라 기준 좌표계로 옮기는 과정이다.
카메라 기준 공간으로 변환하기 위해선, 카메라의 위치와 Up, Eye (Forward) 벡터를 알고 있어야 한다.
\(T\) 행렬은 간단하다. World 좌표에서 카메라가 이동한 변환 행렬과 같다.
\[T \equiv \begin{pmatrix} 1 & 0 & 0 & C_{x} \\ 0 & 1 & 0 & C_{y} \\ 0 & 0 & 1 & C_{z} \\ 0 & 0 & 0 & 1 \end{pmatrix}\]\(R\) 행렬은 카메라 기준 좌표계의 기저를 얻는데서 시작한다. 주어진 Up 벡터와 Eye 벡터가 수직이라는 보장이 없다. 따라서, Up 벡터와 Eye 벡터를 외적해서 일단 왼쪽 벡터를 구한다. 이후 Eye 벡터와 왼쪽 벡터를 외적해서 진짜 Up벡터를 구한다. 이 세 벡터를 기저로 갖는 공간으로 변환하는 행렬은, 그저 기저를 열벡터로 갖는 행렬로 정의하면 된다. 카메라가 바라보는 방향이 \(z\) 방향과 나란하고, 업벡터 방향은 \(y\) 방향과 나란하다.
\[R \equiv \begin{pmatrix} L_{x} & U_{x} & E_{x} & 0 \\ L_{y} & U_{y} & E_{y} & 0 \\ L_{z} & U_{z} & E_{z} & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}\]카메라 기준 좌표계는 COP = \((0,0,0)\), DOP = \((0,0,1)\)인 카메라는 가만히 있고 세상이 상대적으로 움직이는 공간이다. 상상해보라. 카메라가 오른쪽으로 90도 돌면, 상대적으로 세상이 90도 왼쪽으로 돈 것과 같다. 카메라가 \((0,0,10)\) 방향으로 움직이면, 상대적으로 세상이 \((0,0,-10)\) 방향으로 움직인 것과 같다. 즉 카메라 공간에선 카메라의 변환과 반대 변환을 모든 Vertex에 적용하면 된다. View Matrix를 다음과 같이 정의한다. 카메라를 먼저 원점으로 끌고 와서 회전해야 하므로 \(T^{-1}\)부터 적용한다.
\[V \equiv R^{-1}T^{-1}\]직교행렬의 역행렬은 Transpose와 같다. Rotation은 직교행렬이므로, 역행렬은 Transpose해서 구할 수 있다. \(T\) 행렬의 역행렬은, 카메라 위치만큼 반대로 이동한 것과 같다. 따라서 다음과 같다.
\[V = \begin{pmatrix} L_{x} & L_{y} & L_{z} & 0 \\ U_{x} & U_{y} & U_{z} & 0 \\ E_{x} & E_{y} & E_{z} & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} 1 & 0 & 0 & -C_{x} \\ 0 & 1 & 0 & -C_{y} \\ 0 & 0 & 1 & -C_{z} \\ 0 & 0 & 0 & 1 \end{pmatrix}= \begin{pmatrix} L_{x} & L_{y} & L_{z} & - (\vec{L} \cdot \vec{C}) \\ U_{x} & U_{y} & U_{z} & - (\vec{U} \cdot \vec{C}) \\ E_{x} & E_{y} & E_{z} & - (\vec{E} \cdot \vec{C}) \\ 0 & 0 & 0 & 1 \end{pmatrix}\]