s-nova 님의 블로그
3. 행렬 본문
'이득우의 게임수학' 도서를 바탕으로 공부한 내용을 작성한 글입니다.
1. 선형성
선형성$^{\text{Linearity}}$은 가법성$^{\text{Additivity}}$과 1차 동차성$^{\text{Homogeneity of Degree 1}}$ 두 가지 조건을 모두 만족하는 함수의 성질입니다.
1-1. 가법성
함수에 두 입력의 합을 넣은 결과가, 각각을 넣은 결과의 합과 같아야 합니다.
$$f(x_1 + x_2) = f(x_1) + f(x_2)$$
1-2. 1차 동차성
입력에 스칼라를 곱한 후 함수에 넣은 결과가, 함수 결과에 스칼라를 곱한 것과 같아야 합니다.
$$f(kx) = k f(x)$$
💡 예시: $f(x) = 2x$는 선형 함수입니다. 반면 $f(x) = x + 1$은 가법성을 만족하지 않으므로 $($f(1+1) = 3이지만 f(1) + f(1) = 4$)$ 선형 함수가 아닙니다.
2. 변환과 선형 변환
변환$^{\text{Transformation}}$은 두 벡터 공간이 동일한 구조를 지닐 때, 두 공간의 대응 관계를 의미합니다.
그 중에서 선형성을 유지시켜주는 함수를 선형 변환$^{\text{Linear Transformation}}$이라고 합니다.
예를 들어, 다음 함수는 선형 변환입니다:
$$f(x, y) = (ax + by, cx + dy)$$
여기서 $a, b, c, d$는 상수입니다.
🎮 게임에서의 활용: 게임 오브젝트의 회전, 크기 조절, 기울이기 등은 모두 선형 변환입니다. 이들은 원점을 유지하고 직선을 직선으로 변환합니다.
3. 행렬의 기초
행렬$^{\text{Matrix}}$은 수를 사각형의 형태로 행과 열을 맞춰 배열한 테이블입니다.
3-1. 벡터의 행렬 표현
벡터는 한 줄로 구성된 행렬로 표현됩니다.
$$A = \begin{bmatrix} x \\ y \end{bmatrix} \quad \text{(열벡터)}$$
$$B = \begin{bmatrix} x & y \end{bmatrix} \quad \text{(행벡터)}$$
3-2. 정방행렬
선형 변환을 표현할 때는 행과 열의 크기가 같은 정방행렬$^{\text{Square Matrix}}$을 사용합니다.
앞서 본 선형 변환 $f(x, y) = (ax + by, cx + dy)$는 2×2 정방행렬로 표현됩니다:
$$A = \begin{bmatrix} a & b \\ c & d \end{bmatrix}$$
3-3. 행렬 곱셈
선형 변환은 행렬 곱으로 표현됩니다:
$$f(x, y) = A \cdot \vec{v} = \begin{bmatrix} a & b \\ c & d \end{bmatrix} \cdot \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} ax + by \\ cx + dy \end{bmatrix}$$
3-4. 결합법칙을 통한 최적화
행렬 곱의 결합법칙을 이용하면 연산량을 크게 줄일 수 있습니다.
예시: 100개의 점에 5번의 선형 변환을 적용하는 경우
| 방법 | 수식 | 연산 횟수 |
| 비효율적 | $E \cdot D \cdot C \cdot B \cdot A \cdot \vec{v}$ $($100번 반복$)$ | 500번 |
| 효율적 | $F = E \cdot D \cdot C \cdot B \cdot A$ 계산 후 $F \cdot \vec{v}$ $($100번 반복$)$ |
104번 |
⚡ 최적화 팁: 게임 엔진에서는 여러 변환을 하나의 행렬로 미리 합성한 후 $($월드 변환 행렬$)$, 이를 각 정점에 적용합니다. 이것이 Transform Hierarchy의 핵심 원리입니다.
4. 주요 변환 행렬
4-1. 크기 변환 행렬
크기 변환 행렬$^{\text{Scale Transformation Matrix}}$은 x축 방향으로 $a$배, y축 방향으로 $b$배 확대/축소합니다.
$$S = \begin{bmatrix} a & 0 \\ 0 & b \end{bmatrix}$$
// Unity 예시
transform.localScale = new Vector3(2.0f, 3.0f, 1.0f); // x축 2배, y축 3배
4-2. 회전 변환 행렬
회전 변환 행렬$^{\text{Rotation Transformation Matrix}}$은 원점을 중심으로 반시계방향으로 $\theta$만큼 회전시킵니다.
$$R_{\theta} = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}$$
// C++로 2D 회전 행렬 구현
struct Matrix2x2
{
float m[2][2];
static Matrix2x2 Rotation(float theta)
{
float c = std::cos(theta);
float s = std::sin(theta);
return Matrix2x2
{
c, -s,
s, c
};
}
Vector2 operator*(const Vector2& v) const
{
return Vector2
{
m[0][0] * v.x + m[0][1] * v.y,
m[1][0] * v.x + m[1][1] * v.y
};
}
};
4-3. 전단 변환 행렬
전단 변환 행렬$^{\text{Shear Transformation Matrix}}$은 한 축 방향으로 밀어서 기울이는 변환입니다.
x축 방향으로 $a$만큼 미는 전단 변환:
$$S = \begin{bmatrix} 1 & a \\ 0 & 1 \end{bmatrix}$$
📌 활용 예시: 전단 변환은 이탤릭체 글꼴 효과나 원근감을 표현하는 데 사용됩니다.
5. 역행렬
5-1. 항등행렬
항등행렬$^{\text{Identity Matrix}}$은 원 공간의 변화 없이 동일한 공간으로 유지되는 변환입니다.
$$I = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}$$
임의의 행렬 $A$에 대해 $A \cdot I = I \cdot A = A$가 성립합니다.
5-2. 역행렬의 정의
역행렬$^{\text{Inverse Matrix}}$은 행렬 곱의 결과가 항등행렬이 나오는 특별한 행렬입니다.
$$A \cdot A^{-1} = A^{-1} \cdot A = I$$
🎮 게임 활용: 월드 좌표를 로컬 좌표로 변환하거나, 카메라 변환의 역을 구할 때 역행렬을 사용합니다.
5-3. 행렬식
행렬식$^{\text{Determinant}}$은 역행렬이 존재하는지 파악할 수 있는 수식으로, $\det(A)$ 또는 $|A|$로 표시합니다.
2×2 정방행렬의 행렬식:
$$A = \begin{bmatrix} a & b \\ c & d \end{bmatrix}$$
$$\det(A) = ad - bc$$
행렬식이 0이 아니면 역행렬이 존재하고, 0이면 역행렬이 존재하지 않습니다.
6. 주요 변환 행렬의 역행렬
6-1. 크기 변환 행렬의 역행렬
$$S = \begin{bmatrix} a & 0 \\ 0 & b \end{bmatrix}$$
$$S^{-1} = \begin{bmatrix} \frac{1}{a} & 0 \\ 0 & \frac{1}{b} \end{bmatrix}$$
확대한 만큼 축소하면 원래대로 돌아옵니다.
6-2. 전단 변환 행렬의 역행렬
$$S = \begin{bmatrix} 1 & a \\ 0 & 1 \end{bmatrix}$$
$$S^{-1} = \begin{bmatrix} 1 & -a \\ 0 & 1 \end{bmatrix}$$
오른쪽으로 민 만큼 왼쪽으로 밀면 원래대로 돌아옵니다.
6-3. 회전 변환 행렬의 역행렬
$$R_{\theta} = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}$$
$$R_{\theta}^{-1} = R_{-\theta} = R_{\theta}^T = \begin{bmatrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{bmatrix}$$
회전 행렬의 역행렬은 세 가지 특징이 있습니다:
- 반대 방향으로 회전: $R_{-\theta}$
- 전치 행렬$^{\text{Transpose}}$과 동일: $R_{\theta}^T$ $($행과 열을 바꿈$)$
- 회전 행렬은 직교 행렬$^{\text{Orthogonal Matrix}}$
6-4. 행렬 곱의 역행렬
여러 변환을 합성한 행렬의 역행렬은 순서를 뒤집어서 각각의 역행렬을 곱합니다.
$$(A \cdot B)^{-1} = B^{-1} \cdot A^{-1}$$
// 예시: 확대 → 회전 변환의 역은 회전 역 → 축소
Matrix transform = scale * rotation;
Matrix inverse = rotation.Inverse() * scale.Inverse();
7. 정리
이번 포스트에서는 선형 변환과 행렬에 대해 학습했습니다.
- 선형성: 가법성과 1차 동차성을 만족하는 성질
- 행렬: 선형 변환을 표현하는 수학적 도구
- 주요 변환: 크기, 회전, 전단 변환 행렬
- 역행렬: 변환을 되돌리는 행렬
- 최적화: 행렬 곱의 결합법칙으로 연산량 감소