아핀 변환(affine transformation)은 2차원과 3차원 모두에서 일반적으로 사용되는 변환 중 하나이다. 이러한 변환은 평행성을 보존하며, 회전, 이동, 확대/축소, 그리고 전단(shear) 등의 변환을 포함한다. 아핀 변환은 수학적으로 행렬로 표현되기 때문에 동차 좌표(homogeneous coordinates) 체계를 통해 보다 일관되고 간단하게 표현할 수 있다.
동차좌표
동차좌표는 유클리드 좌표를 확장한 형태로, 차원(dimension)을 하나 더 추가하여 점을 표현하는 방법이다. 예를 들어, 2차원 좌표 (x, y)는 동차좌표계에서 (x, y, w)로 표현되며, 일반적으로 w=1로 설정된다. 동차좌표를 사용하면 변환들을 행렬로 일관되게 표현할 수 있다.
2차원 아핀 변환
2차원의 아핀 변환은 3x3 행렬로 표현된다. 이 행렬은 다음과 같이 구성된다.
여기서 (tx, ty)는 이동 벡터이다. 이 행렬을 점 \mathbf{p} = (x, y, 1)에 적용하면 새로운 점 \mathbf{p}' = (x', y', 1)을 얻을 수 있다:
이로써 점이 아핀 변환된 새로운 위치를 얻을 수 있다.
3차원 아핀 변환
3차원의 아핀 변환은 4x4 행렬로 표현된다. 이 행렬은 다음과 같이 구성된다.
이 행렬을 점 \mathbf{p} = (x, y, z, 1)에 적용하면 새로운 점 \mathbf{p}' = (x', y', z', 1)을 얻을 수 있다:
이는 점이 3차원 공간에서 아핀 변환된 새로운 위치를 의미한다. 동차좌표계를 이용하면 이와 같은 아핀 변환을 통합된 방식으로 처리할 수 있으며, 변환 행렬을 연산하여 일관성 있게 여러 변환을 조합할 수 있다.
동차좌표계의 장점
동차좌표계를 사용하는 것의 주요 장점 중 하나는 변환의 일관성과 단순성이다. 다차원 행렬 연산을 통해 변환들을 쉽게 합성할 수 있으며, 변환의 순서를 간단하게 유지할 수 있다. 특히, 다중 변환을 한꺼번에 적용할 때 매우 유용하다.
변환 행렬의 합성
여러 변환을 함께 사용하는 경우, 각각의 변환 행렬을 곱하여 하나의 합성 행렬을 만들 수 있다. 예를 들어, 이동, 회전, 그리고 축소/확대 변환을 차례로 적용하고자 하는 경우, 각 변환에 대한 행렬을 곱하여 최종 변환 행렬을 얻는다. 이것은 다음과 같은 순서로 이루어진다.
- 이동 변환:
이동 벡터가 (tx, ty)인 2차원 이동 변환 행렬은 다음과 같다.
$$ \mathbf{T}_{\text{translate}} = \begin{bmatrix} 1 & 0 & tx \ 0 & 1 & ty \ 0 & 0 & 1 \end{bmatrix} $$
- 회전 변환:
회전 각도가 \theta인 2차원 회전 변환 행렬은 다음과 같다.
$$ \mathbf{T}_{\text{rotate}} = \begin{bmatrix} \cos(\theta) & -\sin(\theta) & 0 \ \sin(\theta) & \cos(\theta) & 0 \ 0 & 0 & 1 \end{bmatrix} $$
- 축소/확대 변환:
확장/축소 비율이 (sx, sy)인 2차원 스케일 변환 행렬은 다음과 같다.
$$ \mathbf{T}_{\text{scale}} = \begin{bmatrix} sx & 0 & 0 \ 0 & sy & 0 \ 0 & 0 & 1 \end{bmatrix} $$
최종 변환 행렬 \mathbf{T}_{\text{final}}은 이 행렬들을 곱하여 구할 수 있다.
연산 순서에 따라 얻어지는 결과가 달라질 수 있으므로, 필요한 순서로 행렬을 곱해야 한다.
동일한 개념은 3차원에서도 적용된다. 각 변환에 대응하는 4x4 행렬을 곱하여 최종 변환 행렬을 구하면 된다. 예를 들어, 이동, 회전, 확대/축소 변환을 차례로 적용하고자 한다면, 각 변환에 대한 행렬을 다음과 같은 순서로 곱한다.
- 이동 변환:
$$ \mathbf{T}_{\text{translate}} = \begin{bmatrix} 1 & 0 & 0 & tx \ 0 & 1 & 0 & ty \ 0 & 0 & 1 & tz \ 0 & 0 & 0 & 1 \end{bmatrix} $$
- 회전 변환 (예: Z축 기준 회전):
$$ \mathbf{T}_{\text{rotate}} = \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{T}_{\text{scale}} = \begin{bmatrix} sx & 0 & 0 & 0 \ 0 & sy & 0 & 0 \ 0 & 0 & sz & 0 \ 0 & 0 & 0 & 1 \end{bmatrix} $$
최종 변환 행렬 \mathbf{T}_{\text{final}}은 다음과 같이 구할 수 있다.
결론적으로, 동차좌표와 행렬을 이용하면 복잡한 변환을 일관되게 처리할 수 있으며, 다양한 그래픽스 및 컴퓨터 비전 응용에서 효율적으로 사용할 수 있다.