15 minutes
➕ 기초 게임 수학
1. 수
수와 집합
수학에서 가장 기본적인 연산인 사칙연산(\(+\), \(-\), \(\times\), \(\div\))에서, 특정한 공리적 수 집합(정수, 유리수, 실수 등)이 덧셈과 곱셈에 대해 다음 11개 공리를 만족하면 해당 수 집합을 체(field)라고 부름
덧셈에 대해 닫혀있음
덧셈에 대해 결합법칙 성립
덧셈에 대해 항등원 존재
덧셈에 대해 역원 존재
덧셈에 대해 교환법칙 성립
곱셈에 대해 닫혀있음
곱셈에 대해 결합법칙 성립
덧셈과 곱셈에 대해 분배법칙 성립
곱셈에 대해 항등원 존재
곱셈에 대해 역원 존재
곱셈에 대해 교환법칙 성립
예를 들어, 정수 집합은 곱셈에 대해 역원이 존재하지 않기 때문에 체가 될 수 없음
유리수, 실수는 이 공리들을 모두 만족하기 때문에 체임
그런데 뺄셈과 나눗셈은 왜 무시하냐? 뺄셈과 나눗셈은 기본적으로 교환법칙이 성립하지 않음
그렇다고 뺄셈과 나눗셈을 수의 세계에서 자유롭게 쓰지 못하는 것은 아니고, 각각 덧셈과 곱셈에 대한 역원으로 생각하여 덧셈과 곱셈의 연산 내에서 일어나도록 할 수 있음
- 뺄셈은 해당 수의 덧셈 역원을 통한 덧셈으로, 나눗셈은 해당 수의 곱셈 역원을 통한 곱셈으로!
즉, 체가 된다는 뜻은 해당 수 집합에 대해 수학의 기본적인 사칙연산을 자유롭게 해도 법칙에 위배되지 않는다는 보증!
함수
함수의 조건이랑 전단사(일대일 대응) 함수의 조건은 다른 건데 헷갈릴 수 있으니 확실히 정리할 것
함수의 조건: 정의역 내 모든 원소들에 대해 대응 관계가 존재해야 하며, 정의역의 원소는 공역에서 하나의 원소에만 대응되어야 함
- 즉, 정의역의 모든 원소가 입력될 수 있어야 하면서, 공역에서 하나의 출력만 나올 수 있어야 함!
전사 함수의 조건: 공역과 치역이 같은 함수
단사 함수의 조건: 정의역과 공역의 요소가 일대일로 대응되는 함수
- 즉, 입력이 다르면 출력이 항상 다른, 출력이 겹치지 않는 함수
합성 함수는 \(g \circ f\)(g 써클 f, g 애프터 f)와 같이 먼저 실행되는 함수가 합성함수 기호의 오른쪽에 놓임에 주의
어떤 함수가 역함수를 가지려면 해당 함수는 반드시 전단사 함수여야 하는데, 전사 함수가 아니면 역함수 입장에서 정의역에 입력으로 쓰이지 않는 원소가 생기기 때문이고, 단사 함수가 아니면 역함수 입장에서 정의역의 어떤 원소가 공역에 여러 출력을 가지게 되기 때문!
2. 벡터
벡터 공간과 벡터
벡터 공간의 공리는 스칼라 공간의 공리와 거의 유사한데, 기본적으로 벡터를 구성하는 스칼라 값들이 체의 연산 성질을 기반으로 하기 때문
벡터의 덧셈에 대해 결합법칙 성립
벡터의 덧셈에 대해 교환법칙 성립
벡터의 덧셈에 대해 항등원 존재
벡터의 덧셈에 대해 역원 존재
벡터와 스칼라 곱셈에 대한 호환성(\(a(b\vec{v}) = (ab)\vec{v}\))
벡터와 스칼라 곱셈에 대한 항등원 존재
벡터의 덧셈과 벡터와 스칼라 곱셈에 대해 분배법칙 성립
스칼라의 덧셈과 벡터와 스칼라 곱셈에 대해 분배법칙 성립
벡터의 결합과 생성
여러 벡터와 스칼라를 더해서 새로운 벡터를 만드는 것을 벡터의 결합이라고 표현함
- \(v' = a\vec{v_1} + b\vec{v_2} + c\vec{v_3} + \dots\)
결합의 결과로 영벡터가 생성되는 경우 벡터들에 곱해지는 스칼라 값이 0이 아닌 경우도 가능하면 그 벡터들이 선형 종속의 관계를 가진다고 표현함
예를 들어 \(2 \cdot (1, 1) + -1 \cdot (2, 2) = 0\)과 같은 경우가 있음
선형 종속의 관계를 가지는 벡터들은 같은 방향을 가지는 벡터들!
반대로 스칼라 값이 0인 경우만 가능하다면 이를 선형 독립의 관계를 가진다고 함
- 참고로 차원보다 더 많은 벡터를 가져오게 되면 같은 방향이 아닌 벡터들이라 하더라도 스칼라 값이 0이 아니면서 영벡터를 만들 수 있는 경우가 생기므로 이 경우는 선형 종속 관계가 생겨버림
선형 독립의 관계를 가지는 벡터들은 그 벡터들만 가지고 해당 벡터 공간을 모두 만들 수 있다는 신기한 성질(생성)이 있음!
- 이렇게 벡터 공간을 생성하는 벡터 집합을 기저(basis)라고 표현함
어떤 벡터 공간에 대해 해당 벡터 공간을 생성하는 기저의 원소 개수는 정해져있고, 해당 원소 개수를 차원(dimension)이라고 표현함
특정 벡터 공간에 대해 기저는 여러 개가 있을 수 있으며, 그 중 해당 기저를 구성하는 기저 벡터들이 한 축만 사용하는 단위 벡터(예: \((1, 0), (0, 1)\))로만 이루어진 경우 이를 표준 기저(standard basis)라고 함
3. 삼각함수
삼각함수
빗변의 길이가 1이고, 밑변과 빗변 사잇각을 \(\theta\)라 정의하면, 피타고라스 정리에 따라 다음이 성립함
$$ \cos^2{\theta} + \sin^2{\theta} = 1 $$각도법에서 기준으로 삼는 360이라는 수는 약수가 많아 원을 다양한 방법으로 쪼개어 활용할 수 있어 일상 생활에서 주로 사용하지만, 360은 계산에 표준적으로 사용하기에는 너무 큰 값임
때문에 실무 계산에서의 삼각함수를 응용할 때는 호의 길이를 기준으로 한 호도법(Radian)을 주로 활용함
호도법 정의: \(\pi(\mathrm{rad}) = 180\degree, 1(\mathrm{rad}) = (\frac{180}{\pi})\degree\)
\(30\degree = \frac{\pi}{6}, 60\degree = \frac{\pi}{3}\) 등
삼각함수를 활용한 물체의 회전
실벡터 공간 \(\mathbb{R}^2\)은 표준기저벡터 \(e_1, e_2\)로 만들어짐
\(\mathbb{R}^2\)의 모든 벡터들은 다음과 같은 형태로 나타낼 수 있음
$$ (x, y) = x \cdot e_1 + y \cdot e_2 $$벡터를 반시계 방향으로 \(\theta\)만큼 회전시키면 두 표준기저벡터는 다음과 같아짐
$$ e_1' = (\cos{\theta}, \sin{\theta}) $$$$ e_2' = (-\sin{\theta}, \cos{\theta}) $$결과적으로 특정 벡터 \((x, y)\)를 \(\theta\)만큼 회전시킨 결과는 다음과 같음
$$ x \cdot (\cos{\theta}, \sin{\theta}) + y \cdot (-\sin{\theta}, \cos{\theta}) $$$$ = (x \cos{\theta} - y \sin{\theta}, x \sin{\theta} + y \cos{\theta}) $$
삼각함수의 역함수
함수가 역함수가 존재하려면 기본적으로 전단사함수여야 하는데, 삼각함수는 기본적으로 전사함수도 아니고 단사함수도 아니기 때문에 정의역 범위를 \((-\frac{\pi}{2}, \frac{\pi}{2})\)를 줄일 필요가 있음
- 이는 \(\sin\), \(\cos\), \(\tan\) 공통
역함수는 그래프 상으로 보면 \(x\)축과 \(y\)축을 원점 기준으로 뒤집어 놓은 형태이며, \(\sin\), \(\cos\) 함수는 정의역 범위가 \([-1, 1]\), \(\tan\) 함수는 정의역 범위가 \((-\infty, \infty)\)임
- 이 때 각 함수는 \(\arcsin\), \(\arccos\), \(\arctan\)라고 부름
이 중 \(\arctan\)는 밑변과 높이를 통해 각도를 알 수 있어서 벡터를 통해 각도를 확인할 때 매우 유용한데, 문제는 치역 범위가 \((-\pi, \pi)\)라서 2, 3사분면 방향의 벡터 각도 확인에 어려움이 있음
\(\mathrm{atan2}\) 함수는 \(\arctan\) 함수를 조금 변형한 함수로, 입력으로 \(\frac{y}{x}\) 하나의 값이 아니라 \((y, x)\) 두 개의 값을 받아 두 값의 부호를 통해 사분면까지 결정해주는 함수임
- 그래프(\(x - \theta\)) 기준으로는 \(x\)에 따라 가능한 \(\theta\) 값이 여러 개 가능한 것으로 보이는데, 이는 \((x, y)\)를 정의역으로 하는 \(\mathrm{atan2}\) 함수의 이변수 함수 특성으로 인한 것으로, 하나의 \(x\)에 여러 \(\theta\)가 해당하는 것이 아니라 \(y\)에 따라 그 중 하나의 값이 해당함을 의미함
극좌표계
벡터를 이동시키거나(벡터 합) 크기를 변화시키는(벡터와 스칼라의 곱) 연산은 각 축이 별도로 연산되기 때문에 큰 어려움이 없지만 벡터를 회전시키는 연산은 각 축이 함께 영향을 받는 연산이기 때문에 이를 데카르트 좌표계 상에서 표현하는데에는 번거로움이 있음
극좌표계는 벡터의 회전을 매우 편하게 표현할 수 있는 좌표계로, 원점을 기준으로 한 길이 \(r\)과 각도 \(\theta\)를 통해 \((r, \theta)\)로 표현하는 좌표계임
극좌표는 다음과 같이 계산함
$$ r = \sqrt{x^2 + y^2} $$$$ \theta = atan2(y, x) $$극좌표로부터 데카르트 좌표를 다시 얻어내는 방법은 쉬움
$$ x = r \cdot \cos{\theta} $$$$ y = r \cdot \sin{\theta} $$
4. 행렬
선형성
어떤 함수가 선형성을 가진다는 것은 가법성과 1차 동차성을 가진다는 의미임
가법성: \(f(x_1 + x_2) = f(x_1) + f(x_2)\)
1차 동차성: \(f(k \cdot x) = k \cdot f(x)\)
1차 함수 \(f(x) = ax\)는 선형성을 가지지만, 2차 함수 \(f(x) = ax^2\)는 선형성을 가지지 못함을 정의를 통해 확인할 수 있으며, 스칼라 값을 더한 1차 함수 \(f(x) = ax + b\) 또한 선형성을 가지지 못함을 확인할 수 있음
- 즉, 선형성이란 단지 곧게 뻗은 직선의 성질을 뜻하는 것이 아니라 두 집합의 순수한 비(ratio)로 구성된 1차적 대응 관계를 의미한다는 것
벡터 공간에서의 연산(\(V \rightarrow W\))을 생각해보면, 벡터의 크기를 변형하는 벡터와 스칼라의 곱 연산, 벡터를 회전시키는 연산이 모두 선형성을 만족함을 알 수 있음
단, 벡터의 이동은 선형성을 만족하지 않음!(가법성 위반)
- 때문에 벡터의 이동은 2차원에서 직접적인 선형 변환을 수행하지 못하고, 후술할 3차원 아핀 공간에서 전단 변환을 통해 수행할 수 있음
선형성을 가지는 벡터 함수의 일반적인 형태: \(f(x, y) = (ax + by, cx + dy)\)
벡터의 회전 연산도 데카르트 좌표계로 \(f(x, y) = (x\cos{\theta} - y\sin{\theta}, x\sin{\theta} + y\cos{\theta})\)
선형성을 만족하는 변환을 선형 변환이라고 함
행렬
다음의 행렬 곱 결과는 2차원 벡터 공간의 선형 변환에 대응됨
$$ \begin{bmatrix} a & b \\\\ c & d \end{bmatrix} \begin{bmatrix} x \\\\ y \end{bmatrix} = \begin{bmatrix} ax + by \\\\ cx + dy \end{bmatrix} $$행렬 곱은 교환법칙은 성립하지 않지만, 결합법칙은 성립함
- 물체의 변환 과정에서 여러 행렬들을 곱하게 되는데, 행렬의 나열 순서만 잘 지킨다면 어느 것을 먼저 연산하는지는 상관 없음
벡터의 선형 변환을 행렬 곱으로 나타낼 때는 수학적으로 보통 열 기준 방식을 사용하지만, DirectX 등에서는 행 기준 방식을 사용함
$$ (\begin{bmatrix} a & b \\\\ c & d \end{bmatrix} \begin{bmatrix} x \\\\ y \end{bmatrix})^T = \begin{bmatrix} x \\\\ y \end{bmatrix}^T \begin{bmatrix} a & b \\\\ c & d \end{bmatrix}^T = \begin{bmatrix} x & y \end{bmatrix} \begin{bmatrix} a & c \\\\ b & d \end{bmatrix} $$벡터의 선형 변환을 행렬과 벡터의 곱으로 나타낼 때 열 기준 방식은 벡터가 가장 오른쪽에 오고 왼쪽 방향으로 행렬을 추가하지만, 행 기준 방식은 그 반대 순서임
열 기준: \(PVMv\)
행 기준: \(v^T M^T V^T P^T\)
만약 행 벡터 기준으로 선형 변환 연산을 수행한다면, 아래에 나오는 변환 행렬들(열 벡터 기준)을 전치하여 사용해야 함!
행렬의 설계
벡터의 각 선형 변환들은 다음 행렬 곱들과 대응됨
벡터의 크기 변환(\((ax, by)\)): \(S = \begin{bmatrix} a & 0 \\\\ 0 & b \end{bmatrix}\)
벡터의 회전(\((x \cos{\theta} - y \sin{\theta}, x \sin{\theta} + y \cos{\theta})\)): \(R = \begin{bmatrix} \cos{\theta} & -\sin{\theta} \\\\ \sin{\theta} & \cos{\theta} \end{bmatrix}\)
- 물체가 로컬 좌표계의 기저가 아닌 임의의 축을 기준으로 회전되었다고 해도 회전 행렬을 확인하면 각 기저를 기준으로 얼마나 회전시킨 것인지를 확인할 수 있음!
벡터 기울이기 연산(전단 변환, \((x + k, y)\)): \(S = \begin{bmatrix} 1 & a \\\\ 0 & 1 \end{bmatrix}\)
삼각함수의 덧셈 정리를 행렬 곱을 통해 증명할 수도 있음
삼각함수의 덧셈 정리
$$ \cos{(\alpha + \beta)} = \cos{\alpha}\cos{\beta} - \sin{\alpha}\sin{\beta} $$$$ \sin{(\alpha + \beta)} = \sin{\alpha}\cos{\beta} + \cos{\alpha}\sin{\beta} $$\(\alpha\)만큼 회전 후 \(\beta\)만큼 추가 회전
$$ R_\beta R_\alpha = \begin{bmatrix} \cos{\beta} & -\sin{\beta} \\\\ \sin{\beta} & \cos{\beta} \end{bmatrix} \begin{bmatrix} \cos{\alpha} & -\sin{\alpha} \\\\ \sin{\alpha} & \cos{\alpha} \end{bmatrix} $$$$ = \begin{bmatrix} \cos{\alpha}\cos{\beta} - \sin{\alpha}\sin{beta} & -(\sin{\alpha}\cos{\beta} + \cos{\alpha}\sin{\beta}) \\\\ \sin{\alpha}\cos{\beta} + \cos{\alpha}\sin{\beta} & \cos{\alpha}\cos{\beta} - \sin{\alpha}\sin{beta} \end{bmatrix} $$$$ = \begin{bmatrix} \cos{(\alpha + \beta)} & -\sin{(\alpha + \beta)} \\\\ \sin{(\alpha + \beta)} & \cos{(\alpha + \beta)} \end{bmatrix} $$
행 기준 선형 변환은 조금 다르겠지만, 일반적으로 기존 연산식에 행렬 곱을 추가할 때는 가장 왼쪽에 추가함
역행렬
행렬 곱을 통해 선형 변환이 가능하므로, 연산을 역으로 되돌릴 수 있는 역행렬 또한 선형 변환이라고 할 수 있음
2차원 행렬식
$$ A = \begin{bmatrix} a & b \\\\ c & d \end{bmatrix} $$$$ \det{(A)} = ad - bc $$행렬식은 해당 행렬을 이용하여 변환된 기저 벡터들 사이 공간이라고 해석할 수도 있는데, 이 때 행렬식이 0이 되면, 즉 변환된 기저 벡터들 사이 공간이 0이 되면 모든 기저 벡터들이 원래 차원보다 낮은 부분 공간에(2차원의 경우 1차원 선 위에) 놓이게 되면서 공간 정보(추가적인 차원 정보)를 잃게 되고, 이 경우 다시 2차원으로 되돌릴 수 없기 때문에 행렬식이 0인 경우 역함수가 존재할 수 없음
일반적인 행렬의 역행렬: \(A^{-1} = \frac{1}{\det{(A)}} \mathrm{adj}(A)\)
- \(\mathrm{adj}(A) = C^T\)(여인수 행렬의 전치행렬)
크기 변환 행렬의 역행렬: \(S^{-1} = \begin{bmatrix} \frac{1}{a} & 0 \\\\ 0 & \frac{1}{b} \end{bmatrix}\)
회전 행렬의 역행렬: \(R^{-1} = \begin{bmatrix} \cos{\theta} & \sin{\theta} \\\\ -\sin{\theta} & \cos{\theta} \end{bmatrix}\)
- \(-\theta\)만큼 회전하는 것으로 해석할 수도 있고, 기존의 회전 행렬을 전치한 행렬로 해석할 수도 있음
전단 변환 행렬의 역행렬: \(S = \begin{bmatrix} 1 & -a \\\\ 0 & 1 \end{bmatrix}\)
- \(x\)축 방향으로 민 만큼 반대편으로 밀기
행렬 곱의 역행렬: \((AB)^{-1} = B^{-1} A^{-1}\)
5. 아핀 공간
깊게 이해할 부분은 아니고 벡터의 이동을 구현하기 위해 간단히만 살펴봄
선형 대수에서 말하는 엄격한 의미의 벡터는 순수하게 방향만을 나타내지만, 실제로 게임 프로그래머가 벡터를 사용할 때는 점(위치 벡터)과 방향 벡터를 모두 의미하는 경우가 많음
아핀 공간은 점과 벡터를 구분하는 공간으로, 다음과 같은 연산이 가능함
점 - 점 = 벡터
점 + 벡터 = 점
벡터 + 벡터 = 벡터
아핀 공간에서 다음과 같은 연산은 불가능
점 + 점
점 * 스칼라
\((a, b, c)\)같은 값은 실벡터 공간에서는 원점 \(O\)에서 \((a, b, c)\)로 향하는 벡터를 의미하지만, 아핀 공간은 일종의 원점 없는 벡터 공간으로, 절대 위치의 개념이 없음
동차 좌표계(Homogeneous Coordinates)
벡터의 이동 연산은 선형성을 만족하지 않기 때문에(특히 가법성), 일반적인 2차원 행렬 곱으로 표현할 수 없음
그런데, \(y\)를 1로 고정시킨 전단 변환을 생각해보면 \(y\)를 1로 고정한 채로 \(x\)만 밀어내는, 즉 마지막 축을 제외한 모든 축을 이동시키는 연산을 만들 수 있음(이 경우엔 1차원 이동)
$$ \begin{bmatrix} 1 & a \\\\ 0 & 1 \end{bmatrix} \begin{bmatrix} x \\\\ 1 \end{bmatrix} = \begin{bmatrix} x + a \\\\ 1 \end{bmatrix} $$2차원에서 벡터 이동을 전단 변환처럼 구현하기 위해 한 차원을 늘린 후, 마지막 요소를 1로 고정시키면 다음과 같이 벡터의 이동 연산을 선형 변환으로 구현할 수 있음
$$ \begin{bmatrix} 1 & 0 & a \\\\ 0 & 1 & b \\\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\\\ y \\\\ 1 \end{bmatrix} = \begin{bmatrix} x + a \\\\ y + b \\\\ 1 \end{bmatrix} $$이렇게 벡터 이동을 행렬로 나타낸 것을 이동 변환 행렬이라 하고, 벡터 공간에서의 이동을 위해 좌표를 한 차원 확장하고 마지막 좌표를 1로 두는 표현을 동차 좌표계(Homogeneous Coordinates)라고 함. 특정 좌표계의 이름이 아니고, 차원이 늘기는 했지만 3차원과 동일한 차원의 좌표계라는 의미에서 동차 좌표계임
이동 변환(\((x + a, y + b)\)): \(T = \begin{bmatrix} 1 & 0 & a \\\\ 0 & 1 & b \\\\ 0 & 0 & 1 \end{bmatrix}\)
동차 좌표계 표현을 통해 아핀 공간에서의 이동 변환을 선형 변환(행렬 곱)으로 다룰 수 있음
이동 변환 행렬의 역행렬은 그냥 \(a\)와 \(b\)의 부호를 바꾸면 됨
기본 단위 변환 행렬
아핀 공간에서 동차 좌표계를 통해 선형 변환하는 연산을 아핀 변환이라고 함
회전, 스케일링, 이동 연산을 포함한 기본 단위 변환의 동차 좌표계 표현은 다음과 같음
$$ M_{\mathrm{affine}} = \begin{bmatrix} U_{2 \times 2} & t_{2 \times 1} \\\\ 0_{1 \times 2} & 1 \end{bmatrix} $$이 행렬은 보통 모델 변환(로컬 공간 -> 월드 공간) 행렬이라고 하며, 모델 변환 행렬을 만들 때는 보통 스케일 -> 회전 -> 이동 순서로 적용함
$$ M = S \cdot R \cdot T $$- 행렬 곱은 교환법칙이 성립하지 않기 때문에 순서를 반드시 정해두는 편이 좋은데, 많은 엔진에서 보통 위 순서를 적용함(정해진건 아니지만 순서를 바꾸면 동작이 조금 달라질 수 있음)
강체 변환(Rigid Transformation)
회전과 이동 변환만을 포함하여 물체의 형태가 변하지 않는 변환을 특별히 강체 변환이라고 부름
$$ \begin{bmatrix} R \\\\ t \end{bmatrix} $$
법선 벡터의 변환
기하학 적으로 Primitive(삼각형 면) 자체의 법선도 존재하지만, 보통 법선 벡터는 정점의 속성으로 저장됨
- 특정 오브젝트에서 정점은 여러 면에 포함되는데, 이 경우 법선은 각 면 Primitive 법선들의 평균으로 만들어짐
법선 벡터의 특징 중 하나는, 다른 정점 벡터들의 변환과는 달리 변환 행렬의 역전치행렬(\((M^{-1})^T\))을 사용해야한다는 것
균등한 스케일링(Uniform Scailing)이면서 전단 변환을 포함하지 않는다고 하면 법선 벡터도 정점 벡터처럼 보존(평면과의 수직성 등)되지만, 스케일링이 비균등하거나 전단 변환이 포함되면 그 각도가 달라져서 평면과의 수직성을 잃어버릴 수 있음. 역전치행렬이 그런 현상을 막아주는 역할
- 법선 벡터가 벡터의 외적으로 생성되는 유사 벡터(Pseudo Vector)이기 때문에 역전치행렬이 필요하다고 볼 수도 있음
7. 내적
벡터의 내적
벡터의 내적 결과는 스칼라이기 때문에 여러 내적 연산이 연달아 일어나는 경우는 정의되지 않음
- 같은 이유로, 결합법칙을 만족할 수가 없음
벡터의 내적은 덧셈과 곱셈으로 이루어져 있기 때문에 교환법칙을 만족하며, 벡터의 합과 내적의 분배법칙 또한 만족함
$$ \vec{v} \cdot \vec{u} = \vec{u} \cdot \vec{v} $$$$ \vec{w} \cdot (\vec{v} + \vec{u}) = \vec{w} \cdot \vec{v} + \vec{w} \cdot \vec{u} $$벡터의 내적은 삼각함수를 통해 \(\vec{v} \cdot \vec{u} = |\vec{v}||\vec{u}|\cos{\theta}\)로 나타낼 수도 있으며, 만약 두 벡터의 길이가 모두 1이면 두 벡터 간 사잇각의 코사인 값을 나타내게 됨
행렬의 곱셈을 벡터의 내적을 통해 나타낼 수 있음
$$ \begin{bmatrix} a & b \\\\ c & d \end{bmatrix} \begin{bmatrix} e & f \\\\ g & h \end{bmatrix} = \begin{bmatrix} (a, b) \cdot (e, g) & (a, b) \cdot (f, h) \\\\ (c, d) \cdot (e, g) & (c, d) \cdot (f, h) \end{bmatrix} $$정방행렬을 구성하는 모든 행 벡터 또는 열 벡터(둘 중 하나만 만족해도 반대쪽이 자동 만족)들이 모두 길이가 1이면서 서로 직교하는 특별한 케이스를 직교행렬이라고 하며, 다음을 만족함
$$ Q^T Q = I $$- 직교행렬의 행렬식은 항상 1 또는 -1임
회전 연산과 같이 물체의 형태가 그대로 유지되면서 위치나 방향만 바꾸는 변환을 강체 변환(rigid transformation)이라고 하는데, 강체 변환의 성질을 만족하기 위해서는 해당 변환 행렬이 직교행렬이면서 행렬식의 값이 1이어야 함
단, 이동 연산은 강체 변환이기는 해도 아핀 공간에서 표현되는 이동 행렬은 직교행렬이 아님!
- 직교행렬은 선형 변환에 대해서만 정의
투영 벡터
\(\vec{u}\)를 \(\vec{v}\) 위에 투영한 벡터를 투영벡터라고 하는데, 이 또한 내적을 통해 구할 수 있음
내적은 \(\vec{u}\)를 \(\vec{v}\)에 투영시킨 길이와 \(\vec{v}\)의 길이의 곱(삼각함수를 통한 내적의 정의)이라는 점을 통해 투영 벡터의 길이 자체는 쉽게 구할 수 있으며, 그 길이에 \(\vec{v}\)를 정규화한 벡터를 곱하면 투영 벡터를 구할 수 있음
$$ \vec{v}' = \frac{\vec{u} \cdot \vec{v}}{|\vec{v}|} \cdot \frac{\vec{v}}{|\vec{v}|} $$$$ = \frac{\vec{u} \cdot \vec{v}}{\vec{v} \cdot \vec{v}} \cdot \vec{v} $$
8. 외적
벡터의 외적
모든 차원의 벡터에 적용할 수 있는 내적과 달리 외적은 3차원 벡터에서만 사용할 수 있음
벡터의 외적 결과는 벡터이며, 다음과 같이 정의됨
$$ \vec{u} = (u_x, u_y, u_z), \vec{v} = (v_x, v_y, v_z) $$$$ \vec{u} \times \vec{v} = (u_y v_z - v_y u_z, u_x v_z - v_x u_z, u_x v_y - v_x u_y) $$벡터의 외적은 교환법칙이나 결합법칙이 성립하지 않지만, 벡터의 합과 외적의 분배법칙은 만족함
$$ \vec{u} \times (\vec{v} + \vec{w}) = \vec{u} \times \vec{v} + \vec{u} \times \vec{w} $$방향과 상관없이 평행한 두 벡터를 외적한 결과는 항상 영벡터임
\(\vec{v}\)를 \(\vec{u}\)와 평행한 성분과 수직인 성분 \(\vec{v_{\parallel}}, \vec{v_{\perp}}\)로 나누었을 때, 벡터의 외적에서는 \(\vec{u}\)와 수직인 \(\vec{v_{\perp}}\) 성분만 관여하게 됨
- 이는 두 벡터의 사잇각 \(\theta\)에 대한 \(\sin{\theta}\)에 비례하는 값임
벡터의 외적 결과 크기는 삼각함수를 통해 정의할 수 있음
$$ \vec{u} \times \vec{v} = |\vec{u}||\vec{v}|\sin{\theta} $$벡터의 외적 결과 벡터는 항상 두 벡터에 직교하며, 이를 통해 벡터의 외적 결과를 두 벡터가 이루는 평면의 법선 벡터로 사용할 수 있음
- 법선 벡터는 수학적으로 길이가 1일 필요는 없지만, 그래픽스나 물리 계산에서는 거의 항상 단위 벡터로 사용함
벡터의 외적을 통해 특정 물체가 시선 방향 기준 좌측에 위치하는지, 우측에 위치하는지도 판별할 수 있음
두 벡터가 수직할 때 0을 기준으로 부호를 통해 앞 뒤를 판별할 수 있는 내적과 달리, 외적은 두 벡터가 평행할 때 0을 기준으로 부호를 통해 좌측 우측을 판단할 수 있음
시선 벡터 \(\vec{f}\)를 기준으로 물체가 좌측에 있는 경우: \((\vec{f} \times \vec{v}) \cdot \vec{y} > 0\)
시선 벡터 \(\vec{f}\)를 기준으로 물체가 우측에 있는 경우: \((\vec{f} \times \vec{v}) \cdot \vec{y} < 0\)
벡터로부터 회전행렬 생성
다음 설명은 y-up 오른손 좌표계를 기준으로 함
임의로 주어진 두 벡터에 직교하는 벡터를 생성하는 외적의 성질을 통해 카메라의 회전을 설정하는 회전 행렬을 생성할 수 있음
카메라의 시선 방향 벡터를 \(\vec{v}\)라고 할 때, 카메라의 로컬 \(\vec{z}\)는 \(\vec{v}\)의 단위 벡터로 구할 수 있음
- \(\vec{z_{\text{local}}} = \frac{\vec{v}}{|\vec{v}|}\)
카메라의 로컬 \(\vec{x}\) 벡터는 월드 업 벡터인 \(\vec{u}\)와 카메라의 로컬 \(\vec{z}\)의 외적으로 구할 수 있음
\(\vec{x_{\text{local}}} = \frac{\vec{u} \times \vec{z_{\text{local}}}}{|\vec{u} \times \vec{z_{\text{local}}}|}\)
월드 업 벡터를 \(\vec{y}\)로 두지 않는 이유는, 자주 있는 상황은 아니지만 카메라가 뒤집혀있는 경우 \(\vec{y}\) 대신 \((0, -1, 0)\)를 사용해야하기 때문
만약 카메라의 로컬 \(\vec{z}\)와 월드 업 벡터가 평행한 경우에는 외적 결과가 영벡터가 되어버리기 때문에 이 경우에는 수동으로 카메라의 로컬 \(\vec{x}\)를 지정해주어야 함
카메라의 로컬 \(\vec{y}\)는 간단히 로컬 \(\vec{z}\)와 로컬 \(\vec{x}\)의 외적으로 구할 수 있음(두 벡터가 서로 직교하는 단위 벡터이므로 그 결과도 단위 벡터임이 보장됨)
- \(\vec{y_{\text{local}}} = \vec{z_{\text{local}}} \times \vec{x_{\text{local}}}\)
이를 통해 구할 수 있는 View Space 변환 행렬은 다음과 같음
$$ V = \begin{bmatrix} x_{\text{local}}^x & y_{\text{local}}^x & z_{\text{local}}^x & 0 \\\\ x_{\text{local}}^y & y_{\text{local}}^y & z_{\text{local}}^y & 0 \\\\ x_{\text{local}}^z & y_{\text{local}}^z & z_{\text{local}}^z & 0 \\\\ 0 & 0 & 0 & 1 \end{bmatrix} $$
삼중곱
\(\vec{u} \cdot (\vec{v} \cdot \vec{w})\)나 \(\vec{u} \times (\vec{v} \cdot \vec{w})\)의 경우에는 내적의 결과인 스칼라와 벡터의 곱으로 바뀌기 때문에 이런 경우들은 벡터의 삼중곱으로 보지 않음
\(\vec{u} \cdot (\vec{v} \times \vec{w})\)같은 경우를 스칼라 삼중곱이라고 부르며, 두 벡터의 외적 결과가 두 벡터로부터 만들어지는 평행사변형의 넓이를 의미하는 만큼 스칼라 삼중곱의 결과는 세 벡터로 생성되는 평행육면체의 부피로 해석할 수 있음
$$ |\vec{u} \cdot (\vec{v} \times \vec{w})| = |\vec{u}||\vec{v} \times \vec{w}|\cos{\theta} $$스칼라 삼중곱은 다음과 같은 특별한 성질을 가짐
$$ \vec{u} \cdot (\vec{v} \times \vec{w}) = \vec{v} \cdot (\vec{w} \times \vec{u}) $$$$ = \vec{w} \cdot (\vec{u} \times \vec{v}) $$스칼라 삼중곱 연산에 포함되는 벡터 중 두 벡터 이상이 선형 종속 관계이거나 세 벡터가 모두 동일 평면 상에 있으면 스칼라 삼중곱의 결과가 0이 되므로, 스칼라 삼중곱이 0이 아니면 세 벡터가 모두 선형 독립의 관계를 가짐을 알 수 있음
\(\vec{u} \times (\vec{v} \times \vec{w})\)같은 경우는 벡터 삼중곱이라고 부르며, 라그랑주 공식에 따라 다음과 같은 성질을 확인할 수 있음
$$ \vec{u} \times (\vec{v} \times \vec{w}) = (\vec{u} \cdot \vec{w}) \cdot \vec{v} - (\vec{u} \cdot \vec{v}) \cdot \vec{w} $$벡터 삼중곱의 결과 벡터는 \(\vec{v}\), \(\vec{w}\)와 동일한 평면 상에 존재함(직교하는 벡터에 직교하는 벡터 == 동일 평면)
\(\vec{u}\)와 \(\vec{v}\)가 만드는 평면 상에서 \(\vec{u}\)에 직교하는 벡터를 구하고 싶을 때, \((\vec{u} \times \vec{v}) \times \vec{u}\)를 통해 쉽게 구할 수 있음
3161 Words
2026-02-03 22:18 (Last updated: 2026-03-13 23:05)