DirectX

DirectX3D) 8. 선형변환

minkg3532 2026. 5. 10. 20:00

우리가 이전 글에서 SRT 변환에 대해서 알아본적이 있다.

우리는 이번에 크기와 회전의 대해서 수학적인 공식으로 알아보고자 한다.

 

먼저 다시 선형변환의 정의에 대해서 상기시켜보자.

 

예를들어 수학 함수 $\tau(v)$ $= \tau(x,y,z)$ $= (x^{'},y^{'},z^{'})$을 생각해 보자. 이 함수는 3차원 벡터 하나를 받아서 3차원 벡터 하나를 얻을 수 있다. 만일 $\tau$가 다음 조건들을 만족하면, 이를 가리켜 선형변환(linear transformation)이라고 부른다.

 

  1. $\tau(u + v) = \tau(u) + \tau(v)$
  2. $\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$각 만큼 회전하는 변환을 알아보자.

 

단계적으로 한 번 접근해 보면 아래와 같다.

  1. 벡터의 분해 (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$만큼 돌아가게 된다.
  2. 회전 평면의 두 기준축 설정
    수직 성분 $v_{\perp}$가 회전하는 평면을 2차원 좌표계처럼 생각하기 위해, 서로 수직인 두 개의 기준 벡터(Basis)를 찾는다.
    1. 첫 번째 축: $v_{\perp}$ 자신을 사용
    2. 두 번째 축: 축 $n$과 $v_{\perp}$ 모두에 수직인 벡터를 찾기 위해 외적($n \times v$)을 수행
      • $n \times v$는 $v_{\perp}$와 길이는 같으면서 90도 꺾인 방향을 가진다.
      • 이제 우리는 평면 위의 $x$축 역할($v_{\perp}$)과 $y$축 역할($n \times v$)을 할 벡터 두 개를 얻을 수 있다.
  3. 평면에서의 2차원 회전
    회전 평면 위에서 $v_{\perp}$를 $x$축, $(n \times v)$를 $y$축으로 하는 2차원 좌표계를 상상해 보자. 두 벡터는 서로 수직이며 길이가 같으므로, 삼각함수의 정의를 직접 적용할 수 있다.
    • 삼각함수를 통한 좌표 분해: 단위 원에서 각도 $\theta$ 위치의 좌표가 $(\cos \theta, \sin \theta)$인 것과 같은 원리
      1. 밑변(Horizontal): 원래의 수직 성분 $v_{\perp}$ 방향으로 $\cos \theta$만큼 투영
      2. 높이(Vertical): $v_{\perp}$와 90도를 이루는 $(n \times v)$ 방향으로 $\sin \theta$만큼 투영
    • 따라서 회전된 수직 성분 $R_n(v_{\perp})$는 이 두 벡터를 빗변으로 하는 벡터 합이 된다.
           $$R_n(v_{\perp}) = (\cos \theta) v_{\perp} + (\sin \theta) (n \times v)$$

  4. 최종 결과 합치기
    회전이 끝나면, 아까 고정해두었던 평행 성분과 방금 회전시킨 수직 성분을 다시 더한다.
    • $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)$

 

참고 사진

축 n에 대한 회전

 

 

이제 이게 왜 선형변환인지 확인해 볼 차례이다. 아래를 확인해 보자

아래 두 사항이 성립하게 된다.

 

$$\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$라 할 때

$$\mathbf{R}_n = \begin{bmatrix} c + (1-c)n_x^2 & (1-c)n_x n_y + sn_z & (1-c)n_x n_z - sn_y \\ (1-c)n_x n_y - sn_z & c + (1-c)n_y^2 & (1-c)n_y n_z + sn_x \\ (1-c)n_x n_z + sn_y & (1-c)n_y n_z - sn_x & c + (1-c)n_z^2 \end{bmatrix}$$

 

회전행렬에는 행렬의 각 행벡터는 단위길이이고, 행벡터들은 서로 직교이다. 따라서 행벡터들은 정규직교이다. 직교행렬에는 그 역행렬이 자신의 전치행렬과 같다는 편리한 속성이 존재한다.

 

$$\mathbf{R}_n^T = \mathbf{R}_n^{-1}$$

 

다음은 $x,y,z$축에 대한 회전행렬들이다.

 

X축 회전 ($\mathbf{R}_x$):

$$\mathbf{R}_x = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos\theta & \sin\theta & 0 \\ 0 & -\sin\theta & \cos\theta & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}$$

Y축 회전 ($\mathbf{R}_y$):

$$\mathbf{R}_y = \begin{bmatrix} \cos\theta & 0 & -\sin\theta & 0 \\ 0 & 1 & 0 & 0 \\ \sin\theta & 0 & \cos\theta & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}$$

Z축 회전 ($\mathbf{R}_z$):

$$\mathbf{R}_z = \begin{bmatrix} \cos\theta & \sin\theta & 0 & 0 \\ -\sin\theta & \cos\theta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}$$

임의의 축 회전 ($\mathbf{R}_n$):

$$\mathbf{R}_n = \begin{bmatrix} c + (1-c)n_x^2 & (1-c)n_x n_y + sn_z & (1-c)n_x n_z - sn_y & 0 \\ (1-c)n_x n_y - sn_z & c + (1-c)n_y^2 & (1-c)n_y n_z + sn_x & 0 \\ (1-c)n_x n_z + sn_y & (1-c)n_y n_z - sn_x & c + (1-c)n_z^2 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}$$
 

'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