좌표 원점의 이동

좌표 원점의 이동은 2D 및 3D 그래픽스에서 매우 중요한 개념이다. 기본적으로, 좌표 원점의 이동은 좌표계의 기원(원점)을 다른 위치로 옮기는 것이다. 이를 통해 객체들의 위치를 더 쉽게 계산하거나 조정할 수 있다.

동차좌표계에서의 원점 이동

동차좌표계는 추가적인 차원(일반적으로 3D에서는 4차원, 2D에서는 3차원)을 이용해 변환을 쉽게 표현할 수 있도록 해준다. 기존의 좌표계에서의 이동 변환은 다음과 같은 형태로 나타낼 수 있다.

예를 들어, 2D 평면에서 좌표 원점을 (h, k)만큼 이동한다고 가정하자. 이렇게 되면 좌표 (x, y)는 새로운 좌표계에서 (x', y')로 변환된다:

x' = x + h
y' = y + k

동차좌표계에서는 이를 행렬 형태로 표현할 수 있다. 이를 위해 원래의 2D 좌표 (x, y)를 동차좌표계로 확장하여 (x, y, 1)로 나타낸다. 이제 이동 변환 행렬 \mathbf{T}를 정의해 보자.

이동 변환 행렬 \mathbf{T}는 다음과 같다:

\mathbf{T} = \begin{bmatrix} 1 & 0 & h \\ 0 & 1 & k \\ 0 & 0 & 1 \end{bmatrix}

여기서 (x, y, 1)에 행렬 \mathbf{T}를 곱하면 다음과 같은 결과를 얻는다:

\begin{bmatrix} 1 & 0 & h \\ 0 & 1 & k \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} x + h \\ y + k \\ 1 \end{bmatrix}

위 결과를 통해 좌표 (x, y, 1)가 새로운 좌표 (x', y', 1)로 변환된 것을 확인할 수 있다.

3D 그래픽스에서의 원점 이동

3D 그래픽스에서도 비슷한 방식으로 원점을 이동할 수 있다. 원점을 (h, k, l)만큼 이동하면, 변환 행렬은 다음과 같다:

\mathbf{T} = \begin{bmatrix} 1 & 0 & 0 & h \\ 0 & 1 & 0 & k \\ 0 & 0 & 1 & l \\ 0 & 0 & 0 & 1 \end{bmatrix}

3D 좌표 (x, y, z)를 동차 좌표 (x, y, z, 1)로 확장하여 \mathbf{T}와 곱하면:

\begin{bmatrix} 1 & 0 & 0 & h \\ 0 & 1 & 0 & k \\ 0 & 0 & 1 & l \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} = \begin{bmatrix} x + h \\ y + k \\ z + l \\ 1 \end{bmatrix}

이 결과는 원점이 (h, k, l)만큼 이동한 좌표 (x', y', z', 1)로 변환된 것을 보여준다.

적용 예시

동차좌표계를 이용한 원점 이동은 다양한 그래픽스 응용 프로그램에서 사용된다. 예를 들어, 객체들이 일정한 패턴을 따라 움직이거나, 화면 내에서 특정 위치로 이동해야 하는 경우 등이 있다. 동일한 원리를 이용해 여러 복잡한 변환들을 복합적으로 적용할 수 있다.

합성 변환

실제로 그래픽스에서는 여러 변환 행렬들을 순차적으로 적용하여 복합적인 변환을 수행한다. 예를 들어, 객체를 이동시키고, 비례 확대/축소를 하고, 회전시키는 경우 각 변환을 따로 수행할 수도 있지만, 한꺼번에 할 수 있는 합성 변환을 이용하는 것이 더 효율적이다.

합성 행렬의 개념

합성 변환은 여러 개의 기본 변환(이동, 회전, 축소/확대 등)을 하나의 행렬로 결합하여 한 번에 적용하는 것을 의미한다. 이를 위해 각 기본 변환에 대한 행렬을 곱해 하나의 합성 행렬을 만든 후, 이 합성 행렬을 객체의 좌표 벡터에 곱한다.

예를 들어, 2D 공간에서 먼저 (h, k)만큼 이동하고, \theta만큼 회전한 후, s_xs_y로 각각 축소/확대한다고 가정해 봅시다. 각 변환에 대한 행렬은 다음과 같다:

  1. 이동 행렬:
\mathbf{T} = \begin{bmatrix} 1 & 0 & h \\ 0 & 1 & k \\ 0 & 0 & 1 \end{bmatrix}
  1. 회전 행렬: (각도 \theta만큼 회전)
\mathbf{R} = \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix}
  1. 축소/확대 행렬:
\mathbf{S} = \begin{bmatrix} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & 1 \end{bmatrix}

합성 행렬 \mathbf{C}는 다음과 같이 각 행렬을 곱하여 구한다:

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

이 합성 행렬을 사용하여 좌표 벡터에 곱하면, 한 번의 연산으로 모든 변환을 적용할 수 있다.

순서의 중요성

각 변환의 순서는 결과에 큰 영향을 미친다. 예를 들어, 회전을 먼저 하고 이동을 나중에 하는 것과 그 반대는 완전히 다른 결과를 초래한다. 일반적으로 행렬 곱의 순서는 오른쪽부터 왼쪽으로 적용되므로, 예제에서 이동 행렬이 제일 먼저 적용되도록 행렬의 순서를 잘 맞춰야 한다.

예제

구체적인 예로, 원점을 (3, 5)로 이동하고, 45^\circ (즉, \frac{\pi}{4} 라디안) 만큼 회전하고, x축과 y축 방향으로 각각 두 배씩 확대한다고 가정한다. 각각의 변환 행렬은 다음과 같다:

\mathbf{T} = \begin{bmatrix} 1 & 0 & 3 \\ 0 & 1 & 5 \\ 0 & 0 & 1 \end{bmatrix}
\mathbf{R} = \begin{bmatrix} \cos \frac{\pi}{4} & -\sin \frac{\pi}{4} & 0 \\ \sin \frac{\pi}{4} & \cos \frac{\pi}{4} & 0 \\ 0 & 0 & 1 \end{bmatrix} = \begin{bmatrix} \frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} & 0 \\ \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} & 0 \\ 0 & 0 & 1 \end{bmatrix}
\mathbf{S} = \begin{bmatrix} 2 & 0 & 0 \\ 0 & 2 & 0 \\ 0 & 0 & 1 \end{bmatrix}

이 세 변환을 합성하여 하나의 행렬로 결합해 보면:

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

각 행렬을 곱하므로써 얻어지는 합성 행렬을 사용하여 처음 좌표에 변환을 적용하면, 최종 위치를 계산할 수 있다.

이와 같은 동차좌표계를 이용한 변환 방식은 그래픽스 및 컴퓨터 비전에서 매우 널리 사용된다. 다양한 변환을 조합하여 복잡한 애니메이션이나 이미지 변환을 손쉽게 구현할 수 있기 때문이다.