이동 변환

이동 변환은 원점을 기준으로 벡터 \mathbf{t} = (t_x, t_y, t_z)만큼 좌표를 평행 이동시키는 것을 말한다. 이는 동차좌표계를 사용하면 다음과 같이 표현할 수 있다.

이동 변환을 \mathbf{T} 행렬로 나타내면:

\mathbf{T}=\begin{bmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix}

3차원 점 \mathbf{p} = (x, y, z, 1)을 이동시키려면, \mathbf{p}'를 구하는 식은 다음과 같다.

\mathbf{p}' = \mathbf{T} \mathbf{p}

이를 풀어서 쓰면:

\begin{bmatrix} x' \\ y' \\ z' \\ 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} = \begin{bmatrix} x + t_x \\ y + t_y \\ z + t_z \\ 1 \end{bmatrix}

따라서, 이동된 좌표는 \mathbf{p}' = (x + t_x, y + t_y, z + t_z)가 된다.

회전 변환

회전 변환은 특정 축을 중심으로 주어진 각도만큼 회전시키는 것을 말한다. 회전 변환은 축에 따라 다른 변환 행렬을 갖는다.

x축 회전

\theta만큼 x축을 기준으로 회전하는 변환은 다음과 같다:

\mathbf{R}_x(\theta) = \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축 회전

\theta만큼 y축을 기준으로 회전하는 변환은 다음과 같다:

\mathbf{R}_y(\theta) = \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축 회전

\theta만큼 z축을 기준으로 회전하는 변환은 다음과 같다:

\mathbf{R}_z(\theta) = \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{p}를 x축 기준 \theta만큼 회전시키려면:

\mathbf{p}' = \mathbf{R}_x(\theta) \mathbf{p}

확대/축소 변환

확대/축소 변환은 각 축을 기준으로 크기를 조절하는 변환을 말한다. 확대/축소 변환 행렬은 다음과 같다:

\mathbf{S} = \begin{bmatrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

여기서 s_x, s_y, s_z는 각각 x, y, z축 방향의 확대/축소 비율이다.

축소/확대를 적용하려면 단순히 \mathbf{S}를 원래의 점에 곱해주면 된다:

\mathbf{p}' = \mathbf{S} \mathbf{p}

이를 풀어서 쓰면:

\begin{bmatrix} x' \\ y' \\ z' \\ 1 \end{bmatrix} = \begin{bmatrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} = \begin{bmatrix} s_x x \\ s_y y \\ s_z z \\ 1 \end{bmatrix}

따라서, 확대/축소된 좌표는 \mathbf{p}' = (s_x x, s_y y, s_z z)가 된다.

복합 변환

복합 변환은 여러 개의 기본 변환(이동, 회전, 확대/축소)을 결합하여 하나의 변환으로 만들어낸 것이다. 이를 위해 각 변환 행렬을 곱하면 된다. 각 변환의 순서가 중요하다. 일반적으로, 변환의 순서는 다음과 같이 적용된다:

  1. 확대/축소 변환
  2. 회전 변환
  3. 이동 변환

예를 들어, 점 \mathbf{p}에 대해 먼저 확대/축소 \mathbf{S}, 그 다음 회전 \mathbf{R}, 마지막으로 이동 \mathbf{T}를 적용하려면 복합 변환 행렬은 다음과 같다:

\mathbf{M} = \mathbf{T} \mathbf{R} \mathbf{S}

따라서, 점 \mathbf{p}의 최종 변환된 위치 \mathbf{p}'는:

\mathbf{p}' = \mathbf{M} \mathbf{p} = \mathbf{T} \mathbf{R} \mathbf{S} \mathbf{p}

다음은 각 기본 변환들을 복합하여 변환 행렬을 계산하는 예시이다. 예를 들어, 먼저 x축으로 2배 확대, z축으로 45도 회전, 마지막으로 (5, 5, 0)만큼 이동시키는 변환을 복합하면:

  1. 확대/축소 변환 행렬 \mathbf{S}:
\mathbf{S} = \begin{bmatrix} 2 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}
  1. z축 회전 변환 행렬 \mathbf{R}_z (45^\circ):
\mathbf{R}_z = \begin{bmatrix} \cos{45^\circ} & -\sin{45^\circ} & 0 & 0 \\ \sin{45^\circ} & \cos{45^\circ} & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} = \begin{bmatrix} \frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} & 0 & 0 \\ \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}
  1. 이동 변환 행렬 \mathbf{T}:
\mathbf{T} = \begin{bmatrix} 1 & 0 & 0 & 5 \\ 0 & 1 & 0 & 5 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

각 변환 행렬을 각각 순서대로 곱하면 복합 변환 행렬 \mathbf{M}은 다음과 같다:

\mathbf{M} = \mathbf{T} \mathbf{R}_z \mathbf{S}
= \begin{bmatrix} 1 & 0 & 0 & 5 \\ 0 & 1 & 0 & 5 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} \frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} & 0 & 0 \\ \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 2 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

이를 계산하면 최종 복합 변환 행렬 \mathbf{M}을 얻을 수 있다.

이제 해당 복합 변환 행렬을 원래의 점 \mathbf{p}에 적용하면 최종 변환된 좌표를 구할 수 있다.