우리가 이전 글에서 SRT 변환에 대해서 알아본적이 있다.
우리는 이번에 크기와 회전의 대해서 수학적인 공식으로 알아보고자 한다.
먼저 다시 선형변환의 정의에 대해서 상기시켜보자.
예를들어 수학 함수 $\tau(v)$ $= \tau(x,y,z)$ $= (x^{'},y^{'},z^{'})$을 생각해 보자. 이 함수는 3차원 벡터 하나를 받아서 3차원 벡터 하나를 얻을 수 있다. 만일 $\tau$가 다음 조건들을 만족하면, 이를 가리켜 선형변환(linear transformation)이라고 부른다.
- $\tau(u + v) = \tau(u) + \tau(v)$
- $\tau(ku) = k\tau(u)$
여기서 $u = (u_x,u_y,u_z)$와 $v = (v_x,v_y,v_z)$는 임의의 3차원 벡터이고, $k$는 스칼라이다.
하나 알아두어야 할 점은 입력과 출력이 3차원 벡터 이외의 값들인 함수도 선형변환이 될 수 있다. 하지만 우리는 3차원 공간상의 벡터를 다루므로 이 점은 다루지 않도록 하겠다.
만약 $\tau$가 선형변환이면 다음을 만족한다.
$$\begin{aligned} \tau(a\mathbf{u} + b\mathbf{v} + c\mathbf{w}) &= \tau(a\mathbf{u} + (b\mathbf{v} + c\mathbf{w})) \ \\ &= a\tau(\mathbf{u}) + \tau(b\mathbf{v} + c\mathbf{w}) \ \\ &= a\tau(\mathbf{u}) + b\tau(\mathbf{v}) + c\tau(\mathbf{w}) \end{aligned}$$
행렬 표현
$u = (x,y,z)$라고 하자. 이를 다음과 같이 표기할 수 있다.
$u = (x,y,z) = xi + yj + zk = x(1,0,0) + y(0,1,0) + z(0,0,1)$
여기서 $i = (1,0,0)$이고 $j = (0,1,0)$, $k = (0,0,1)$이다. 이 벡터들은 현재 좌표계의 축들과 같은 방향인 단위벡터들이다.이들을 $\mathbb{R}^3$에 대한 표준기저벡터(standard basis vector)라고 부른다. ($\mathbb{R}^3$은 모든 3차원 좌표 벡터 $(x,y,z)$의 집합을 뜻함) 이제 $\tau$가 하나의 선형변환이라 하면, 다음식이 성립한다.
$\tau(u) = \tau(xi + yj +zk) = x\tau(i) + y\tau(j) + z\tau(k)$
이것이 우리가 벡터와 행렬의 곱셈을 바라보는 하나의 방식이였던 선형결합(일차결합)이다.
결국 해당 식은 아래와 같이 표현할 수 있다.
$$\begin{aligned} \tau(\mathbf{u}) &= x\tau(\mathbf{i}) + y\tau(\mathbf{j}) + z\tau(\mathbf{k}) \\ &= \mathbf{uA} = \begin{bmatrix} x & y & z \end{bmatrix} \begin{bmatrix} \leftarrow & \tau(\mathbf{i}) & \rightarrow \\ \leftarrow & \tau(\mathbf{j}) & \rightarrow \\ \leftarrow & \tau(\mathbf{k}) & \rightarrow \end{bmatrix} \\ &= \begin{bmatrix} x & y & z \end{bmatrix} \begin{bmatrix} A_{11} & A_{12} & A_{13} \\ A_{21} & A_{22} & A_{23} \\ A_{31} & A_{32} & A_{33} \end{bmatrix} \end{aligned}$$
여기서 $\tau(i) = (A_{11}, A_{12}, A_{13})$, $\tau(j) = (A_{21},A_{22},A_{23})$, $\tau(k) = (A_{31},A_{32},A_{33})$이다. 이러한 행렬 $A$를 선형변환 $\tau$의 행렬 표현이라고 부른다.
비례(Scale: 확대, 축소)
비례는 물체의 크기를 바꾸는 효과를 낸다. 이러한 비례 변환은 다음과 같이 정의된다.
$S(x,y,z) = (s_{x}x, s_{y}y, s_{z}z)$
이 변환에 의해 벡터는 현재 좌표계를 기준으로 하여 $x$ 축으로 $s_x$ 단위, $y$ 축으로 $s_y$ 단위, 그리고 $z$ 축으로 $s_z$ 단위만큼 비례된다. 그럼 이 S가 사실 하나의 선형변환임을 증명해 보자.
$$\begin{aligned} S(\mathbf{u}+\mathbf{v}) &= (s_x(u_x+v_x), s_y(u_y+v_y), s_z(u_z+v_z)) \\ &= (s_x u_x + s_x v_x, s_y u_y + s_y v_y, s_z u_z + s_z v_z) \\ &= (s_x u_x, s_y u_y, s_z u_z) + (s_x v_x, s_y v_y, s_z v_z) \\ &= S(\mathbf{u}) + S(\mathbf{v}) \\ \\ S(k\mathbf{u}) &= (s_x k u_x, s_y k u_y, s_z k u_z) \\ &= k(s_x u_x, s_y u_y, s_z u_z) \\ &= kS(\mathbf{u}) \end{aligned}$$
해당 선형변환의 특성 2가지를 만족하므로, $S$는 하나의 선형변환이고, 따라서 행렬 표현이 존재한다. 그 행렬 표현을 구하려면 이전 식에서 $S$를 표준기저벡터들 각각에 적용하고 결과로 나오는 벡터들을 행들로 하는 행렬을 만들면 된다.
비례된 기저벡터들은 다음과 같다.
$S(i) = (s_x \cdot 1, s_y \cdot 0, s_z \cdot 0) = (s_x,0,0)$
$S(j) = (s_x \cdot 0, s_y \cdot 1, s_z \cdot 0) = (0,s_y,0)$
$S(k) = (s_x \cdot 0, s_y \cdot 0, s_z \cdot 1) = (0,0,s_z)$
따라서 $S$의 행렬 표현은 아래와 같다.
$S = \begin{bmatrix} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & s_z \\ \end{bmatrix}$
이 행렬을 비례행렬(scaling matrix)이라 한다.
비례행렬의 역은 다음과 같다.
$S^{-1} = \begin{bmatrix} 1/s_x & 0 & 0 \\ 0 & 1/s_y & 0 \\ 0 & 0 & 1/s_z \\ \end{bmatrix}$
회전(Rotate)
이번에는 벡터 $v$를 축 $n$에(회전축으로 사용하겠다) 대해 $\theta$각 만큼 회전하는 변환을 알아보자.
단계적으로 한 번 접근해 보면 아래와 같다.
- 벡터의 분해 (Decomposition)
먼저, 회전시키고자 하는 벡터 $v$를 두 부분으로 나눈다.- 평행 성분 ($v_{\parallel}$): 축 $n$과 나란한 방향의 성분
- 계산: $v_{\parallel} = \text{proj}_n(v) = (n \cdot v)n$
- 특징: 축을 중심으로 회전해도 이 성분은 위치가 변하지 않는다. (고정석)
- 수직 성분 ($v_{\perp}$): 축 $n$과 직교하며, 실제 회전이 일어나는 평면 위에 놓인 성분
- 계산: $v_{\perp} = v - v_{\parallel} = v - (n \cdot v)n$
- 특징: 이 성분만 회전 평면 위에서 $\theta$만큼 돌아가게 된다.
- 평행 성분 ($v_{\parallel}$): 축 $n$과 나란한 방향의 성분
- 회전 평면의 두 기준축 설정
수직 성분 $v_{\perp}$가 회전하는 평면을 2차원 좌표계처럼 생각하기 위해, 서로 수직인 두 개의 기준 벡터(Basis)를 찾는다.- 첫 번째 축: $v_{\perp}$ 자신을 사용
- 두 번째 축: 축 $n$과 $v_{\perp}$ 모두에 수직인 벡터를 찾기 위해 외적($n \times v$)을 수행
- $n \times v$는 $v_{\perp}$와 길이는 같으면서 90도 꺾인 방향을 가진다.
- 이제 우리는 평면 위의 $x$축 역할($v_{\perp}$)과 $y$축 역할($n \times v$)을 할 벡터 두 개를 얻을 수 있다.
- 평면에서의 2차원 회전
회전 평면 위에서 $v_{\perp}$를 $x$축, $(n \times v)$를 $y$축으로 하는 2차원 좌표계를 상상해 보자. 두 벡터는 서로 수직이며 길이가 같으므로, 삼각함수의 정의를 직접 적용할 수 있다.- 삼각함수를 통한 좌표 분해: 단위 원에서 각도 $\theta$ 위치의 좌표가 $(\cos \theta, \sin \theta)$인 것과 같은 원리
- 밑변(Horizontal): 원래의 수직 성분 $v_{\perp}$ 방향으로 $\cos \theta$만큼 투영
- 높이(Vertical): $v_{\perp}$와 90도를 이루는 $(n \times v)$ 방향으로 $\sin \theta$만큼 투영
- 따라서 회전된 수직 성분 $R_n(v_{\perp})$는 이 두 벡터를 빗변으로 하는 벡터 합이 된다.
- 삼각함수를 통한 좌표 분해: 단위 원에서 각도 $\theta$ 위치의 좌표가 $(\cos \theta, \sin \theta)$인 것과 같은 원리
- 최종 결과 합치기
회전이 끝나면, 아까 고정해두었던 평행 성분과 방금 회전시킨 수직 성분을 다시 더한다.- $R_n(v) = v_{\parallel} + R_n(v_{\perp})$
- $R_n(v) = (n \cdot v)n + \cos \theta (v - (n \cdot v)n) + \sin \theta (n \times v)$
참고 사진

이제 이게 왜 선형변환인지 확인해 볼 차례이다. 아래를 확인해 보자
아래 두 사항이 성립하게 된다.
$$\begin{aligned} R_n(kv) &= \cos \theta (kv) + (1 - \cos \theta)(n \cdot kv)n + \sin \theta (n \times kv) \\ &= k(\cos \theta v) + (1 - \cos \theta)k(n \cdot v)n + \sin \theta k(n \times v) \\ &= k [ \cos \theta v + (1 - \cos \theta)(n \cdot v)n + \sin \theta (n \times v) ] \\ &= k R_n(v) \end{aligned}$$
$$\begin{aligned} R_n(u + v) &= \cos \theta (u + v) + (1 - \cos \theta)(n \cdot (u + v))n + \sin \theta (n \times (u + v)) \\ &= \cos \theta u + \cos \theta v + (1 - \cos \theta)(n \cdot u + n \cdot v)n + \sin \theta (n \times u + n \times v) \\ &= [ \cos \theta u + (1 - \cos \theta)(n \cdot u)n + \sin \theta (n \times u) ] + [ \cos \theta v + (1 - \cos \theta)(n \cdot v)n + \sin \theta (n \times v) ] \\ &= R_n(u) + R_n(v) \end{aligned}$$
이제 이 변환에 대한 행렬표현을 구해보자.
$R_n$을 표준기저벡터에 적용하고 그래서 나온 벡터들을 행으로 삼아서 하나의 행렬을 만들면 된다. 결과는 아래와 같다.
단위 벡터 $\mathbf{n} = (n_x, n_y, n_z)$를 축으로 $\theta$만큼 회전하는 행렬이라고 할 때,
$c = \cos\theta, s = \sin\theta$라 할 때
회전행렬에는 행렬의 각 행벡터는 단위길이이고, 행벡터들은 서로 직교이다. 따라서 행벡터들은 정규직교이다. 직교행렬에는 그 역행렬이 자신의 전치행렬과 같다는 편리한 속성이 존재한다.
다음은 $x,y,z$축에 대한 회전행렬들이다.
X축 회전 ($\mathbf{R}_x$):
Y축 회전 ($\mathbf{R}_y$):
Z축 회전 ($\mathbf{R}_z$):
임의의 축 회전 ($\mathbf{R}_n$):
'DirectX' 카테고리의 다른 글
| DirectX3D) 9. 아핀변환 (0) | 2026.05.10 |
|---|---|
| DirectX3D) 7. 행렬식 (0) | 2026.05.10 |
| DirectX3D) 6. 행렬의 활용(SRT) (0) | 2026.05.09 |
| DirectX3D) 5. 행렬 (0) | 2026.05.05 |
| DirectX3D) 4. Point (0) | 2026.04.30 |