이동 변환
이동 변환은 원점을 기준으로 벡터 \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)가 된다.
복합 변환
복합 변환은 여러 개의 기본 변환(이동, 회전, 확대/축소)을 결합하여 하나의 변환으로 만들어낸 것이다. 이를 위해 각 변환 행렬을 곱하면 된다. 각 변환의 순서가 중요하다. 일반적으로, 변환의 순서는 다음과 같이 적용된다:
- 확대/축소 변환
- 회전 변환
- 이동 변환
예를 들어, 점 \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)만큼 이동시키는 변환을 복합하면:
- 확대/축소 변환 행렬 \mathbf{S}:
\mathbf{S} = \begin{bmatrix}
2 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{bmatrix}
- 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}
- 이동 변환 행렬 \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}에 적용하면 최종 변환된 좌표를 구할 수 있다.