1 개요: 왜 3x3이 아니라 4x4인가
컴퓨터 그래픽은 이미지를 이동하고, 크기를 바꾸고, 회전하고, 2D 화면에 투영한다. 이 네 가지 변환은 모두 행렬 곱셈으로 표현할 수 있으면 좋겠다 — 변환의 합성이 행렬의 곱셈이 되기 때문이다 (Strang, 2009, §8.7).
스케일링과 회전은 \(3 \times 3\) 행렬로 충분하다. 그러나 평행이동(translation)은 선형 변환이 아니다. 어떤 \(3 \times 3\) 행렬 \(M\) 을 곱해도 \(M\mathbf{0} = \mathbf{0}\) 이므로 원점을 다른 점으로 옮길 수 없다. 선형 변환은 반드시 원점을 고정하기 때문이다.
해결책: 동차 좌표(homogeneous coordinates) 를 도입하여 \(4 \times 4\) 행렬을 사용한다. 한 차원을 추가하면 평행이동도 행렬 곱셈으로 표현할 수 있고, 네 가지 변환을 하나의 통일된 프레임워크로 다룰 수 있다.
비선형 변환(평행이동)을 한 차원 위에서 선형으로 본다. 이 트릭은 수학과 공학 어디에서나 등장한다.
- 컴퓨터 그래픽: \((x, y, z) \to (x, y, z, 1)\) 로 4D에서 선형화
- SVM의 커널 트릭: 비선형 결정 경계를 고차원에서 선형으로
- 딥러닝의 affine layer: \(\mathbf{Wx} + \mathbf{b} = [\mathbf{W} \;\; \mathbf{b}] \begin{bmatrix} \mathbf{x} \\ 1 \end{bmatrix}\)
2 동차 좌표: 3D 점을 4D로 올리기
2.1 정의
3D 공간의 점 \((x, y, z)\) 를 동차 좌표(homogeneous coordinates) 로 표현하면 \((x, y, z, 1)\) 이 된다. 마지막에 1을 추가한 것이다.
동차 좌표의 특별한 성질: \((cx, cy, cz, c)\) 는 \(c \neq 0\) 인 모든 \(c\) 에 대해 같은 점을 나타낸다. 마지막 좌표로 나누면 원래 점 \((x, y, z, 1)\) 을 복���할 수 있기 때문이다. 이것이 “동차(homogeneous)”라는 이름의 유래다 — 모든 좌표에 같은 상수를 곱해도 같은 점이다.
수학적으로 말하면, 동차 좌표의 점은 \(\mathbb{R}^4\) 의 원점을 지나는 직선 위의 점이다. 3D 점 하나가 4D의 직선 하나에 대응한다. 이 공간을 사영 공간(projective space) \(P^3\) 이라 부른다.
2.2 왜 이것이 작동하는가
핵심은 마지막 좌표가 항상 1로 유지되도록 행렬을 설계하는 것이다. 모든 \(4 \times 4\) 변환 행렬의 마지막 열이 \((0, 0, 0, 1)^\top\) 이면, 입력 \((x, y, z, 1)\) 에 행렬을 곱해도 출력의 마지막 성분이 1로 보존된다.
컴퓨터 그래픽에서는 행벡터 \(\times\) 행렬 관례를 사용한다: \([x \;\; y \;\; z \;\; 1] \cdot M\).
이는 수학의 일반적 관례(열벡터, \(M\mathbf{v}\))와 반대다. 이유는 메모리 레이아웃과 캐시 효율이다. 이 포���트에서는 Strang의 관례(행벡터)를 따르되, 코드 예시에서는 NumPy의 열벡터 관례를 사용한다.
3 네 가지 변환: 하나의 프레임워크
3.1 변환 1: 평행이동 (Translation)
공간의 모든 점을 벡터 \(\mathbf{v}_0 = (x_0, y_0, z_0)\) 만큼 이동한다.
\(3 \times 3\) 행렬로 불가능한 이유: 선형 변환 \(T(\mathbf{v}) = M\mathbf{v}\) 는 반드시 \(T(\mathbf{0}) = \mathbf{0}\) 을 만족한다. 평행이동은 \(T(\mathbf{0}) = \mathbf{v}_0 \neq \mathbf{0}\) 이므로 선형이 아니다.
\(4 \times 4\) 행렬로 해결:
\[ T = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ x_0 & y_0 & z_0 & 1 \end{bmatrix} \]
검증:
\[ \begin{bmatrix} x & y & z & 1 \end{bmatrix} T = \begin{bmatrix} x + x_0 & y + y_0 & z + z_0 & 1 \end{bmatrix} \]
원점도 이동한다: \([0 \;\; 0 \;\; 0 \;\; 1] \cdot T = [x_0 \;\; y_0 \;\; z_0 \;\; 1]\). 4D에서는 원점이 \((0, 0, 0, 1)\) 이고, 이것은 4D의 “진짜 원점” \((0, 0, 0, 0)\) 이 아니므로 이동이 가능하다.
역변환: \(-\mathbf{v}_0\) 로 평행이동하면 된다. \(T^{-1}\) 은 \(x_0, y_0, z_0\) 를 \(-x_0, -y_0, -z_0\) 로 바꾼 행렬이다.
3.2 변환 2: 스케일링 (Scaling)
각 축 방향으로 다른 비율로 크기를 조절한다.
\[ S = \begin{bmatrix} c_1 & 0 & 0 & 0 \\ 0 & c_2 & 0 & 0 \\ 0 & 0 & c_3 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \]
\[ \begin{bmatrix} x & y & z & 1 \end{bmatrix} S = \begin{bmatrix} c_1 x & c_2 y & c_3 z & 1 \end{bmatrix} \]
균일 스케일링은 \(c_1 = c_2 = c_3 = c\) 일 때다. 복사기가 90%로 축소하면 \(c = 0.9\).
주의: \(S\) 는 \(cI\) 가 아니다. 마지막 대각 원소는 반드시 1이어야 한다. \(cI\) 를 곱하면 \((cx, cy, cz, c)\) 가 되는데, 동차 좌표에서 이것은 \((x, y, z, 1)\) 과 같은 점이다 — 아무것도 바뀌지 않는다.
3.3 변환 3: 회전 (Rotation)
2D 평면에서 원점 주위로 각도 \(\theta\) 만큼 회전하는 \(2 \times 2\) 행렬은:
\[ Q = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix} \]
\(Q\) 는 직교행렬이다: \(Q^\top Q = I\), \(\det Q = 1\). 행렬식이 \(+1\) 이면 회전, \(-1\) 이면 회전 + 반사(mirror)다.
동차 좌표에서는:
\[ R = \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix} \]
3D 회전: 3D에서 모든 회전은 축(axis) 주위로 일어난다. 축은 \(\lambda = 1\) 인 ���유벡터의 방향이다 — 회전해도 움직이지 않는 직선이다.
\(z\) 축 주위의 회전은:
\[ Q_{3D} = \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix}, \quad R = \begin{bmatrix} Q_{3D} & \mathbf{0} \\ \mathbf{0}^\top & 1 \end{bmatrix} \]
임의의 단위 축 \(\mathbf{a} = (a_1, a_2, a_3)\) 주위의 3D 회전은 로드리게스 공식(Rodrigues’ formula) 으로 주어진다:
\[ Q = (\cos\theta) I + (1 - \cos\theta) \mathbf{a}\mathbf{a}^\top - (\sin\theta) [\mathbf{a}]_\times \]
여기서 \([\mathbf{a}]_\times\) 는 외적에 대응하는 반대칭(skew-symmetric) 행렬이다.
\[ [\mathbf{a}]_\times = \begin{bmatrix} 0 & a_3 & -a_2 \\ -a_3 & 0 & a_1 \\ a_2 & -a_1 & 0 \end{bmatrix} \]
세 항의 직관:
| 항 | 역할 | 설명 |
|---|---|---|
| \((\cos\theta) I\) | 축에 수직인 성분의 “그대로 남는” 부분 | \(\theta = 0\) 이면 항등 변환 |
| \((1 - \cos\theta) \mathbf{a}\mathbf{a}^\top\) | 축 위로의 정사영 보정 | 축 방향 성분은 회전해도 변하지 않는다 |
| \(-(\sin\theta) [\mathbf{a}]_\times\) | 축에 수직인 방향으로의 “90도 회전” 성분 | 외적 \(\mathbf{a} \times \mathbf{v}\) 가 \(\mathbf{v}\) 를 축 주위로 90도 돌린 방향 |
축 \(\mathbf{a}\) 는 움직이지 않는다: \(Q\mathbf{a} = (\cos\theta)\mathbf{a} + (1-\cos\theta)\mathbf{a} + 0 = \mathbf{a}\). 이것은 \(\mathbf{a}\) 가 \(\lambda = 1\) 의 고유벡터임을 확인해준다.
3.4 변환 4: 투영 (Projection)
원점을 지나는 평면에 수직인 단위 법선 벡터가 \(\mathbf{n}\) 일 때, 그 평면 위로의 정사영(orthogonal projection)은:
\[ P = I - \mathbf{n}\mathbf{n}^\top \]
이것은 Ch.4 §4.2에서 배운 정사영 행렬의 특수 형태다. \(P\mathbf{n} = \mathbf{0}\) (법선은 평면 위의 영벡터로 사영)이고, 평면 위의 벡터 \(\mathbf{v}\) 에 대해 \(P\mathbf{v} = \mathbf{v}\) (그대로 유지)다.
동차 좌표에서는:
\[ P_{4\times 4} = \begin{bmatrix} I - \mathbf{n}\mathbf{n}^\top & \mathbf{0} \\ \mathbf{0}^\top & 1 \end{bmatrix} \]
반사(reflection, mirror): 정사영이 법선 방향의 성분을 0으로 만드는 것이라면, 반사는 부호를 뒤집는 것이다. 정사영보다 두 배 멀리 간다.
\[ M = I - 2\mathbf{n}\mathbf{n}^\top \]
정사영과 반사의 관계: \(M = 2P - I\), 즉 반사 = 정사영의 두 배에서 항등을 뺀 것이다.
4 임의 점 주위의 변환: 동차 좌표의 진가
4.1 문제: 원점이 아닌 점 주위의 회전
점 \((4, 5)\) 주위로 2D 평면을 회전시키려면 어떻게 하는가? \(2 \times 2\) 회전 행렬은 원점 주위만 가능하다. 동차 좌표에서는 세 단계로 분해한다.
\[ \mathbf{v} \cdot T_{-} \cdot R \cdot T_{+} \]
| 단계 | 행렬 | 효과 |
|---|---|---|
| \(T_{-}\) | \((4, 5)\) 를 원점으로 이동 | 회전 중심을 원점으로 가져옴 |
| \(R\) | 원점 주위로 \(\theta\) 만큼 회전 | 원래의 \(2 \times 2\) 회전 |
| \(T_{+}\) | 원점을 다시 \((4, 5)\) 로 이동 | 회전 중심을 원래 위치로 복원 |
\[ \mathbf{v} \cdot T_{-} \cdot R \cdot T_{+} = \begin{bmatrix} x & y & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ -4 & -5 & 1 \end{bmatrix} \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 4 & 5 & 1 \end{bmatrix} \]
세 행렬의 곱 \(T_{-} R T_{+}\) 를 미리 계산해두면, 하나의 행렬 곱셈으로 임의 점 주위의 회전이 가능하다. 이 결합 방식이 OpenGL, DirectX, 게임 엔진의 모든 변환의 표준이다.
4.2 원점을 지나지 않는 평면으로의 투영
원점을 지나는 평면 \(\mathbf{n}^\top \mathbf{v} = 0\) 으로의 투영은 \(P = I - \mathbf{n}\mathbf{n}^\top\) 으로 된다. 그러면 \(\mathbf{n}^\top (\mathbf{v} - \mathbf{v}_0) = 0\) 인 일반 평면으로의 투영은?
같은 세 단계 전략을 사용한다:
\[ T_{-} P T_{+} \]
\(T_{-}\) 로 \(\mathbf{v}_0\) 을 원점으로 옮기고, \(P\) 로 원점을 지나는 평면에 투영하고, \(T_{+}\) 로 다시 돌려놓는다. \(T_{-}\) 와 \(T_{+}\) 는 역행렬 관계다 — Ch.2의 기본행렬(elementary matrix)과 같은 구조다.
4.3 아핀 변환의 일반적 형태
평행이동 + 선형 변환을 합친 것을 아핀 변환(affine transformation) 이라 한다: \(T(\mathbf{v}) = A\mathbf{v} + \mathbf{v}_0\).
동차 좌표에서 아핀 변환의 \(4 \times 4\) 행렬은:
\[ M = \begin{bmatrix} A_{3\times 3} & \mathbf{0} \\ \mathbf{v}_0^\top & 1 \end{bmatrix} \]
마지막 열이 \((0, 0, 0, 1)^\top\) 인 한, 동차 좌표의 마지막 성분은 1로 보존된다.
선형 vs 아핀: 선형 변환은 \(\mathbf{v}_0 = \mathbf{0}\) 인 특수한 아핀이다. 원점이 고정된다. 아핀은 원점을 옮길 수 있다 — 이것이 동차 좌표가 필요한 이유다.
5 변환의 합성: 행렬 곱의 힘
5.1 합성 순서가 중요하다
변환을 연속으로 적용하면 행렬을 곱한다. 그러나 곱셈 순서가 중요하다 — 행렬 곱은 교환법칙이 성립하지 않는다.
먼저 평행이동하고 스케일링하는 것(\(\mathbf{v} T S\))과, 먼저 스케일링하고 평행이동하는 것(\(\mathbf{v} S T\))은 다르다.
| 순서 | 효과 |
|---|---|
| \(\mathbf{v} T S\) | 먼저 이동한 후 스케일 — 이동량도 스케일된다 |
| \(\mathbf{v} S T\) | 먼저 스케일한 후 이동 — 이동량은 원래대로 |
구체적으로: 점 \((1, 0, 0, 1)\) 에 대해, \(T\) 가 \((2, 0, 0)\) 이동이고 \(S\) 가 3배 스케일이면:
- \(\mathbf{v}TS\): \((1,0,0) \to (3,0,0) \to (9,0,0)\) — 이동한 3도 3배가 됨
- \(\mathbf{v}ST\): \((1,0,0) \to (3,0,0) \to (5,0,0)\) — 스케일 후 원래 이동량만큼 이동
게임이나 애니메이션에서 올바른 순서를 선택하는 것은 필수적이다.
5.2 모든 변환을 하나의 행렬로
\(n\) 번의 변환을 미리 곱해서 하나의 \(4 \times 4\) 행렬 \(M = M_1 M_2 \cdots M_n\) 으로 만들 수 있다. 그러면 수백만 개의 점(vertex)에 대해 각각 한 번의 행렬-벡터 곱만 하면 된다. 이것이 GPU가 빠른 이유 중 하나다 — 같은 \(4 \times 4\) 행렬을 수백만 점에 병렬로 적용한다.
6 왜 필요한가: 현대 응용에서의 동차 좌표
| 분야 | 동차 좌표의 역할 | 구체적 예시 |
|---|---|---|
| 게임 엔진 | 모든 물체 변환의 기본 | Unity, Unreal의 Transform 컴포넌트 |
| 3D 비전 / SLAM | 카메라 외부 파라미터 | \([R \;\; \mathbf{t}]\) 행렬이 동차 변환 |
| 로봇 운동학 | 관절 체인의 변환 곱 | Denavit-Hartenberg 매개변수 |
| 이미지 증강 | 학습 데이터 확대 | 회전, 이동, 스케일, 전단(shear) |
| 딥러닝 affine layer | 선형 + 편향 | \(\mathbf{Wx} + \mathbf{b} = [\mathbf{W} \;\; \mathbf{b}] \begin{bmatrix} \mathbf{x} \\ 1 \end{bmatrix}\) |
| AR/VR | 헤드 트래킹과 렌더링 | 6DoF 포즈 = 동차 변환 행렬 |
| 의료 영상 | CT/MRI 좌표 정합 | 볼륨 간 아핀 정합(registration) |
신경망의 가장 기본적인 연산 \(\mathbf{y} = \mathbf{Wx} + \mathbf{b}\) 는 아핀 변환이다. 이것을 동차 좌표로 쓰면:
\[ \begin{bmatrix} \mathbf{y} \\ 1 \end{bmatrix} = \begin{bmatrix} \mathbf{W} & \mathbf{b} \\ \mathbf{0}^\top & 1 \end{bmatrix} \begin{bmatrix} \mathbf{x} \\ 1 \end{bmatrix} \]
깊은 네트워크의 여러 층을 거치는 것은 \(4 \times 4\) 행렬(일반적으로는 \((n+1) \times (n+1)\))을 연속으로 곱하는 것과 구조적으로 같다. 물론 실제 신경망에는 비선형 활성화 함수가 들어가므로 단순한 행렬 곱과는 다르지만, 아핀 변환이 기본 빌딩 블록이라는 점은 동일하다.
7 코드 예시
7.1 Step 1: Low-level 구현 (동차 좌표 원리)
import numpy as np
def make_translation(tx, ty, tz):
"""4x4 평행이동 행렬 (열벡터 관례: M @ v)"""
return np.array([
[1, 0, 0, tx],
[0, 1, 0, ty],
[0, 0, 1, tz],
[0, 0, 0, 1],
], dtype=float)
def make_scale(sx, sy, sz):
"""4x4 스케일링 행렬"""
return np.array([
[sx, 0, 0, 0],
[0, sy, 0, 0],
[0, 0, sz, 0],
[0, 0, 0, 1],
], dtype=float)
def make_rotation_z(theta):
"""4x4 z축 회전 행렬"""
c, s = np.cos(theta), np.sin(theta)
return np.array([
[ c, -s, 0, 0],
[ s, c, 0, 0],
[ 0, 0, 1, 0],
[ 0, 0, 0, 1],
], dtype=float)
def make_rotation_axis(a, theta):
"""
임의 축 a (단위벡터) 주위로 theta 회전 — 로드리게스 공식
"""
a = np.array(a, dtype=float)
a = a / np.linalg.norm(a)
c, s = np.cos(theta), np.sin(theta)
# 세 항: cos*I + (1-cos)*aa^T - sin*[a]_x
I3 = np.eye(3)
aaT = np.outer(a, a)
a_cross = np.array([
[ 0, a[2], -a[1]],
[-a[2], 0, a[0]],
[ a[1], -a[0], 0],
])
Q = c * I3 + (1 - c) * aaT - s * a_cross
R = np.eye(4)
R[:3, :3] = Q
return R
def to_homogeneous(v):
"""3D 점을 동차 좌표로"""
return np.append(v, 1.0)
def from_homogeneous(v):
"""동차 좌표에서 3D 점으로"""
return v[:3] / v[3]
# == 예제: 기본 변환 ==
p = np.array([1, 2, 3])
print(f"원래 점: {p}")
# 평행이동
T = make_translation(10, 20, 30)
p_translated = from_homogeneous(T @ to_homogeneous(p))
print(f"평행이동 (10,20,30): {p_translated}")
# 스케일링
S = make_scale(2, 2, 2)
p_scaled = from_homogeneous(S @ to_homogeneous(p))
print(f"2배 스케일링: {p_scaled}")
# z축 회전 90도
R = make_rotation_z(np.pi / 2)
p_rotated = from_homogeneous(R @ to_homogeneous(p))
print(f"z축 90도 회전: {np.round(p_rotated, 6)}")
# == 예제: 임의 점 주위 회전 ==
center = np.array([4, 5, 0])
theta = np.pi / 4 # 45도
T_minus = make_translation(-center[0], -center[1], -center[2])
T_plus = make_translation(center[0], center[1], center[2])
R_z = make_rotation_z(theta)
# 합성 행렬: 먼저 이동 -> 회전 -> 다시 이동
M = T_plus @ R_z @ T_minus
point = np.array([5, 5, 0])
result = from_homogeneous(M @ to_homogeneous(point))
print(f"\n점 {point}을 ({center[0]},{center[1]}) 주위로 45도 회전: {np.round(result, 4)}")7.2 Step 2: 변환 시각화 (Matplotlib)
import numpy as np
import matplotlib.pyplot as plt
def apply_transform_2d(M, points):
"""2D 점들에 3x3 동차 변환 적용"""
ones = np.ones((points.shape[0], 1))
homo = np.hstack([points, ones]) # Nx3
transformed = (M @ homo.T).T # Nx3
return transformed[:, :2] / transformed[:, 2:3]
# 집 모양 (2D)
house = np.array([
[0, 0], [4, 0], [4, 3], [2, 5], [0, 3], [0, 0]
], dtype=float)
fig, axes = plt.subplots(2, 2, figsize=(10, 10))
# 원본
axes[0, 0].plot(house[:, 0], house[:, 1], 'b-o', linewidth=2)
axes[0, 0].set_title('원본', fontsize=12)
# 평행이동 (3, 2)
T = np.array([[1, 0, 3], [0, 1, 2], [0, 0, 1]], dtype=float)
h_trans = apply_transform_2d(T, house)
axes[0, 1].plot(house[:, 0], house[:, 1], 'b--', alpha=0.3)
axes[0, 1].plot(h_trans[:, 0], h_trans[:, 1], 'r-o', linewidth=2)
axes[0, 1].set_title('평행이동 (3, 2)', fontsize=12)
# 스케일링 0.5배
S = np.array([[0.5, 0, 0], [0, 0.5, 0], [0, 0, 1]], dtype=float)
h_scale = apply_transform_2d(S, house)
axes[1, 0].plot(house[:, 0], house[:, 1], 'b--', alpha=0.3)
axes[1, 0].plot(h_scale[:, 0], h_scale[:, 1], 'g-o', linewidth=2)
axes[1, 0].set_title('스케일링 0.5배', fontsize=12)
# 중심 (2, 2.5) 주위 30도 회전
cx, cy = 2, 2.5
theta = np.radians(30)
c, s = np.cos(theta), np.sin(theta)
T_minus = np.array([[1, 0, -cx], [0, 1, -cy], [0, 0, 1]], dtype=float)
R = np.array([[c, -s, 0], [s, c, 0], [0, 0, 1]], dtype=float)
T_plus = np.array([[1, 0, cx], [0, 1, cy], [0, 0, 1]], dtype=float)
M_rot = T_plus @ R @ T_minus
h_rot = apply_transform_2d(M_rot, house)
axes[1, 1].plot(house[:, 0], house[:, 1], 'b--', alpha=0.3)
axes[1, 1].plot(h_rot[:, 0], h_rot[:, 1], 'm-o', linewidth=2)
axes[1, 1].plot(cx, cy, 'kx', markersize=10, markeredgewidth=2)
axes[1, 1].set_title('중심 (2, 2.5) 주위 30도 회전', fontsize=12)
for ax in axes.flat:
ax.set_xlim(-2, 10)
ax.set_ylim(-2, 8)
ax.set_aspect('equal')
ax.grid(True, alpha=0.3)
plt.suptitle('동차 좌표를 이용한 2D 변환', fontsize=14)
plt.tight_layout()
plt.savefig('homogeneous_transforms.png', dpi=150)
plt.show()8 요약: 동차 좌표의 세 가지 핵심 아이디어
| 핵심 아이디어 | 직관 | 수학적 표현 |
|---|---|---|
| 차원 추가 | 비선형(평행이동)을 한 차원 위에서 선형으로 | \((x, y, z) \to (x, y, z, 1)\) |
| 통일된 행렬 표현 | 네 가지 변환을 모두 \(4 \times 4\) 행렬로 | \(T, S, R, P\) 모두 같은 크기 |
| 합성 = 곱셈 | 복잡한 변환을 행렬 곱으로 사전 계산 | \(M = T_+ R T_-\) 를 미리 곱아 하나로 |
Strang의 마무리 관찰을 빌리면: 이 절은 Ch.1~7의 모든 도구 — 행렬 곱, 역행렬, 직교행렬, 정사영 — 가 하나의 실용적 문제에서 어떻게 만나는지 보여준다. 선형대수를 배운 사람이 화면에 그림을 띄우는 것은 행렬 몇 개를 곱하는 일이다.
9 관련 주제
선행 지식
- Ch.2 §2.3 — Elimination Using Matrices — 기본행렬과 행렬 곱의 개념
- Ch.4 §4.2 — Projections (투영) — 정사영 행렬 \(P = I - \mathbf{nn}^\top\)
- Ch.7 — 선형 변환의 행렬 표현 — 기저 변환과 변환 행렬
후속 주제
- Ch.8 Applications 종합 개요 — 7가지 응용의 조감도
- 쿼터니언과 3D 회전 — 짐벌 락 문제와 쿼터니언 해법
다른 카테고리 연결
- 이미지 증강과 CNN — 동차 변환의 딥러닝 응용
- 컴퓨터 비전 기초 — 카메라 모델과 투영 행렬