랜더링 파이프라인

2. 수학 기초


2.1 행렬과 벡터


행렬은 이름 그대로 행(row)과 열(colomn)으로 구성되는데, m개의 행과 n개의 열을 가진 행렬은 다음과 같이 표현된다.

\[\begin{pmatrix}a_{11} &a{12}&...& a_{1n}\\a{21}&a{22}&...&a_{2n}\\...&...&...&...\\a_{m1}&a_{m2}&...&a_{mn} \end{pmatrix}\]


이 행렬의 크기는 \(m \times n \)으로 표기되는데, \(m\)과 \(n\)이 같다면 정사각행렬이라 한다. 행렬 각 원소의 아래첨자는 그 원소의 위치를 말한다. 두 개의 행렬이 \(A\)와 \(B\)를 생각해보자. \(A\)의 열과 \(B\)의 행이 같은 개수라면, \(A\)와 \(B\)는 아래처럼 곱해질 수 있다.

\[AB = \begin{pmatrix}a_{11} &a{12}\\a{21}&a{22}\\a_{31}&a_{32} \end{pmatrix}\begin{pmatrix}b_{11}&b_{12}&b_{13}\\b_{21}&b_{22}&b_{23} \end{pmatrix}= \begin{pmatrix} a_{11}b_{11}+a_{12}b_{21}& a_{11}b_{12}+a_{12}b_{22}&a_{11}b_{13}+a_{12}b_{23} \\ a_{21}b_{11}+a_{22}b_{21}&a_{21}b_{12}+a_{22}b_{22} & a_{21}b_{13}+a_{22}b_{23} \\ a_{31}b_{11}+a_{32}b_{21}&a_{31}b_{12}+a_{32}b_{22} &a_{31}b_{13}+a_{32}b_{23} \end{pmatrix}\]


\(A\)의 크기가 \(l \times m\)이고 \(B\)의 크기가 \(m \times n\)이라면, \(AB\)의 크기는 \(l \times n\)이 된다.

2차원 벡터는 \((x,y)\)로, 3차원 벡터는 \((x,y,z)\)로 표기된다. 이렇게 표기된 벡터를 행벡터라고 부른다. 이와 달리 열벡터 표기법을 쓸 수도 있다. 예를 들면, 2차원 열벡터는 다음과 같이 쓴다.

\[\begin{pmatrix}x\\y\end{pmatrix}\]


벡터는 특수한 행렬이다. 위의 식의 벡터는 한 개의 열을 가진 행렬이고, 그 크기는 \(2 \times 1\)이다. 따라서 행렬 - 행렬 곱셈 방법은 행렬 - 벡터 곱셈에 그대로 적용된다. 예를 들어, \( 3 \times 2\) 행렬 \(M\)과 2차원 열벡터 \(v\)의 곱은 다음과 같다.

\[Mv = \begin{pmatrix}a&b\\c&d\\e&f\end{pmatrix}\begin{pmatrix}x\\y\end{pmatrix}=\begin{pmatrix}ax + by\\cx + dy\\ex+fy\end{pmatrix}\]


어떤 행렬 \(M\)이 주어졌을 때, 그것의 행과 열을 바꿔 놓는 것을 전치행렬이라고 하며 \(M^T\)로 표기한다. 예를 들어, 위의 식의 \(M\)의 전치행렬은 다음과 같다.

\[\begin{pmatrix}a&c&e\\b&d&f\end{pmatrix}\]


이는 벡터에도 그대로 적용된다. 열벡터 \(v\)의 원소를 행벡터로 표현하면 \(v^T\)가 된다.

행렬-벡터 곱셈은 다른 방식으로 표현될 수 있다. 즉, 열벡터 \(v\) 대신 행벡터 \(v^T\)를 사용하되, 이를 \(M^T\)의 왼쪽에 배치한다.

\[v^T M^T = \begin{pmatrix}x&y\end{pmatrix}\begin{pmatrix}a&c&e\\b&d&f\end{pmatrix}=\begin{pmatrix}ax + by&cx + dy&ex+fy\end{pmatrix}\]


결과는 위와 같다. OpenGL에서는 열벡터를 사용하고, Direct3D는 행벡터를 사용한다.

단위 행렬은 다른 행렬과 곱하였을 때 자기 자신이 나오는 경우이다. 오른쪽 위에서 왼쪽 아래를 잇는 대각선에 놓인 원소는 모두 1이고 나머지는 0이다. \(I\)로 표기한다.

\[\begin{pmatrix}1&0&0\\0&1&0\\0&0&1\end{pmatrix}\]

두 개의 정사각행렬 \(A\)와 \(B\)가 곱해져서 그 결과가 \(I\)가 된다면, 즉 \(AB=I\)라면, \(B\)는 \(A\)의 역행렬이라고 부르고 \(A^{-1}\)로 표기한다. 마찬가지로 \(A\)는 \(B\)의 역행렬이다.

2차원 벡터 \(v\)의 좌표를 \((v_x,v_y)\)로 표현할 때, \(v\)의 길이는 \( \sqrt{(v_x)^2+(v_y)^2} \)으로 정의되고, \(\Vert v \Vert \)로 표기된다. 3차원 벡터 \((v_x,v_y,v_z)\)의 길이는 \( \sqrt{(v_x)^2+(v_y)^2+(v_z)^2} \)이 된다. 벡터 \(v\)를 그 길이 \(\Vert v \Vert \)로 나누는 과정을 정규화라고 부르는데, \(v/\Vert v \Vert \)는 \(v\)와 같은 방향을 가지며 길이가 1인 벡터이다. 이를 단위 벡터라고 부른다.


2.2 좌표계와 기저




그림 2.1-(A)의 2차원 좌표계에서 \(x\)측과 나란한 벡터 \(e_1\)은 \((1,0)\)이고, \(y\)축에 나란한 벡터는 \(e_2\)는 \((0,1)\)이다. 2차원 공간의 모든 벡터는 \(e_1\)과 \(e_2\)의 선형조합으로 표현 가능하가. 예를 들어, \((3,5)\)는 \(3e_1 + 5e_2\)로 표현된다. 이런 점에서 \({e_1,e_2}\)를 기저(basis)라고 부르는데, \(e_1\)과 \(e_2\)가 주축에 나란하므로 \({e_1,e_2}\)를 특별히 표준 기저라고 한다. 한편, \(e_1\)과 \(e_2\)는 서로 직교하는 단위 벡터이므로 직교정규(orthonormal) 성질을 가진다고 말한다.

우리는 표준 기저 말고도 다양한 기저를 사용할 수 있다. 그림 2.1-(b)의 \({(1,1),(0,2)}\)가 하나의 예이다. 표준 기저 \({e_1,e_2}\)를 사용하면 \((3,5)\)가 \(3e_1 +5e_2\)로 표현되지만, \({(1,1),(0,2)}\)를 사용하면 \(3(1,1)+1(0,2)\)로 표현된다. 이처럼 \((1,1)\)과 \)(0,2)\)를 선형조합하여 2차원 공간의 모든 벡터를 표현할 수 있다. 다만, \({(1,1),(0,2)}\)는 직교정규 기저가 아니다. 반면, 그림 2.1-(c)는 표준 기저는 아니지만 직교정규 성질을 가진 기저 \({u,v}\)를 보여준다. 이를 이용하면 \((3,5)\)는 \(4\sqrt{2}u+\sqrt{2}v\)로 표현된다.




그림 2.2는 3차원 공간에서의 표준 기저 \({e_1,e_2,e_3}\)을 보여준다. 세 개의 주축에 나란한 \(e_1,e_2,e_3\)는 각각 \((1,0,0),(0,1,0),(0,0,1)\)이다. 물론 \({e_1,e_2,e_3}\)는 직교정규 성질을 가진다.


2.3 내적


두 개의 \(n\)차원 벡터 \(a\)와 \(b\)를 각각 \((a_1,a_2,…,a_n)\)과 \((b_1,b_2,…,b_n)\)으로 표현한다면, \(a\)와 \(b\)의 내적(inner product or dot product)은 \(a\cdot b\)로 표기되고 다음과 같이 정의 된다.

\[a \cdot b=\displaystyle\sum_{i=1}^{\infty}{(a_ib_i)} = a_1b_1+a_2b_2+...+a_nb_n\]




한편, 두 벡터 \(a\)와 \(b\)의 사이의 각도를 \(\theta\)로 표기하면, \(a\cdot b\)는 기하학적으로는 다음과 같이 정의된다.


\[a\cdot b = ||a||||b||cos\theta\]


만약 \(a\)와 \(b\)가 서로 수직이라면, \(\theta\)가 \(90\deg\)가 되어 \(a \cdot b\)는 \(0\)이다. 만약 \(\theta\)가 예각이라면 \(a \cdot b\)는 양수이고, \(\theta\)가 둔각이라면 \(a \cdot b\)는 음수이다. 이는 \(a\)와 \(b\)가 3차원 벡터일 경우에도 동일하게 발견되는 특성이다.

위의 식으로부터 추론할 수 있는 것은, 하나의 단위 벡터를 자기 자신과 내적하면 \(1\)이 된다는 것이다. 즉, \(a\)가 단위 벡터라면, \(a \cdot a\)는 1이다. 이를 이용하여 직교정규 기저의 중요한 성질 한 가지를 살펴보자. 2차원 표준 기저 \({e_1,e_2}\)의 경우, \(e_1 \cdot e_1 = 1\)이고 \(e_2 \cdot e_2 = 1\)이다. 한편, 서로 수직인 두 벡터의 내적은 0이므로, \(e_1 \cdot e_2 = e_2 \cdot e_1 = 0\)이 된다. 즉, 하나의 직교정규 기저가 있을 때, 동일한 기적 벡터 간 내적은 1이고, 다른 기저 벡터 간 내적은 0이다.

3차원 표준 기저 \({e_1,e_2,e_3}\)에서도 마찬가지이다. 벡터 \(e_i\)와 \(e_j\)가 주어졌을 때, \(i\)와 \)j\)가 같다면 \(e_i \cdot e_j =1\)이고, \(i\)와 \(j\)가 다르다면 \(e_i \cdot e_j = 0\)이다. 이는 모든 직교정규 기저가 가지고 있는 성질이다.

2.4 벡터곱


두 개의 3차원 벡터 \(a\)와 \(b\)의 벡터곱(cross product)은 \(a \times b\)로 표기되는데, 이는 그림 2.4-(a)에 보인 바와 같이 \(a\)와 \(b\)에 모두 수직인 또 다른 3차원 벡터이다. 벡터곱 \(a \times b\)의 방향은 오른손 법칙으로 결정된다. 즉, 오른손 네 손가락이 첫 번째 벡터 \(a\)에서 두 번째 벡터 \(b\)쪽으로 감싸며 움직일 때 엄지손가락이 \(a \times b\)의 방향을 가르키게 된다. 한편, \(a \times b\)의 길이는 \(a\)와 \(b\)에 의해 만들어지는 평행사변형의 넓이와 같다.


\[||a \times b|| = ||a||||b||sin \theta\]


오른손 법칙에 따르면 \(b \times a\)와 \(a \times b \)는 서로 반대 방향을 가진다. 즉, 그림 2.4-(b)처럼 \(b \times a = -(a \times b)\)가 된다. 이런 점에서, 벡터곱을 반가환적이라 부른다. 물론, \(a \times b\)와 \(b \times a\)의 길이는 같다. 두 벡터 \(a\)와 \(b\)를 각각 \((a_x,a_y,a_z)\)와 \((b_x, b_y,b_z)\)로 표현하면, \(a \times b\)는 \((a_yb_z-a_zb_y,a_zb_x-a_xb_z,a_xb_y-a_yb_x)\)가 된다.

































이 포스팅은 OpenGL ES를 입문한 3차원 컴퓨터 그래픽스 입문 책을 기반으로 작성되었습니다.

한정현(고려대학교) 지음, 홍릉과학출판사