3차원 동차좌표계에서는 좌표 \mathbf{p} = (x, y, z) 를 동차 좌표 \mathbf{P}_h = (x, y, z, w) 로 표현한다. 동차좌표계의 가장 큰 장점은 기하학적 변환(회전, 이동, 스케일링 등)을 행렬 연산으로 통일되게 다룰 수 있다는 점이다.
동차좌표의 정의
3차원 공간에서의 점 \mathbf{p} 를 동차 좌표계로 표현하면 다음과 같이 나타낼 수 있다:
\mathbf{P}_h = \begin{bmatrix}
x \\
y \\
z \\
w
\end{bmatrix}
여기서 w 는 동차 좌표(w-좌표)로, 일반적으로 w = 1 로 설정된다. 따라서, 원래의 좌표 \mathbf{p} 는 \mathbf{P}_h 에서 w 를 나누어 얻는다:
\mathbf{p} = \begin{bmatrix}
x' \\
y' \\
z'
\end{bmatrix} = \begin{bmatrix}
\frac{x}{w} \\
\frac{y}{w} \\
\frac{z}{w}
\end{bmatrix}
변환 행렬
3차원 공간에서의 변환을 동차좌표계로 표현하기 위해서는 4x4 변환행렬을 사용한다. 변환행렬은 다음과 같은 형태를 갖는다:
\mathbf{T} = \begin{bmatrix}
a_{11} & a_{12} & a_{13} & a_{14} \\
a_{21} & a_{22} & a_{23} & a_{24} \\
a_{31} & a_{32} & a_{33} & a_{34} \\
a_{41} & a_{42} & a_{43} & a_{44}
\end{bmatrix}
변환된 동차 좌표 \mathbf{P}'_h 는 다음과 같이 계산된다:
\mathbf{P}'_h = \mathbf{T} \mathbf{P}_h
이동 변환
이동 변환은 공간의 점을 일정한 벡터 \mathbf{d} = (d_x, d_y, d_z) 만큼 이동시키는 변환이다. 이를 동차 좌표계로 표현하면 다음과 같다:
\mathbf{T}_\text{translation} = \begin{bmatrix}
1 & 0 & 0 & d_x \\
0 & 1 & 0 & d_y \\
0 & 0 & 1 & d_z \\
0 & 0 & 0 & 1
\end{bmatrix}
회전 변환
회전 변환은 3차원 공간의 점을 주어진 축을 중심으로 회전시키는 변환이다. 각 축에 대한 회전행렬은 아래와 같다:
X축 회전
\mathbf{T}_\text{rotation, 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축 회전
\mathbf{T}_\text{rotation, 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축 회전
\mathbf{T}_\text{rotation, Z}(\theta) = \begin{bmatrix}
\cos\theta & -\cos\theta & 0 & 0 \\
\sin\theta & \cos\theta & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{bmatrix}
스케일링 변환
스케일링 변환은 점을 원점에 대한 일정 비율로 확대하거나 축소시키는 변환이다. 스케일링 행렬은 다음과 같다:
\mathbf{T}_\text{scaling} = \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{T}_\text{combined} = \mathbf{T}_\text{scaling} \cdot \mathbf{T}_\text{rotation} \cdot \mathbf{T}_\text{translation}
이렇게 변환 행렬을 결합하면 단 한 번의 행렬 곱셈으로 일련의 변환을 적용할 수 있다.
예제: 복합 변환
하나의 예제로 x축 방향으로 2 단위 이동, z축 회전 90도 ( \theta = \frac{\pi}{2} ), 그리고 모든 축에 대해 0.5 비율로 스케일링 하는 복합 변환을 보겠다.
- 이동 변환:
\mathbf{T}_\text{translation} = \begin{bmatrix}
1 & 0 & 0 & 2 \\
0 & 1 & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{bmatrix}
- 회전 변환 ( Z축 회전):
\mathbf{T}_\text{rotation, Z}\left( \frac{\pi}{2} \right) = \begin{bmatrix}
\cos\left(\frac{\pi}{2}\right) & -\sin\left(\frac{\pi}{2}\right) & 0 & 0 \\
\sin\left(\frac{\pi}{2}\right) & \cos\left(\frac{\pi}{2}\right) & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{bmatrix} = \begin{bmatrix}
0 & -1 & 0 & 0 \\
1 & 0 & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{bmatrix}
- 스케일링 변환:
\mathbf{T}_\text{scaling} = \begin{bmatrix}
0.5 & 0 & 0 & 0 \\
0 & 0.5 & 0 & 0 \\
0 & 0 & 0.5 & 0 \\
0 & 0 & 0 & 1
\end{bmatrix}
- 복합 변환 행렬:
\mathbf{T}_\text{combined} = \mathbf{T}_\text{scaling} \cdot \mathbf{T}_\text{rotation, Z}\left( \frac{\pi}{2} \right) \cdot \mathbf{T}_\text{translation}
\mathbf{T}_\text{combined} = \begin{bmatrix}
0.5 & 0 & 0 & 0 \\
0 & 0.5 & 0 & 0 \\
0 & 0 & 0.5 & 0 \\
0 & 0 & 0 & 1
\end{bmatrix} \cdot \begin{bmatrix}
0 & -1 & 0 & 0 \\
1 & 0 & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{bmatrix} \cdot \begin{bmatrix}
1 & 0 & 0 & 2 \\
0 & 1 & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{bmatrix}
\mathbf{T}_\text{combined} = \begin{bmatrix}
0 & -0.5 & 0 & 0 \\
0.5 & 0 & 0 & 1 \\
0 & 0 & 0.5 & 0 \\
0 & 0 & 0 & 1
\end{bmatrix}
이 변환 행렬을 사용하여 동차 좌표 \mathbf{P}_{h}에 적용하면, 해당 점에 대해 일련의 변환이 적용된다.