동차좌표계의 소개 및 기본 개념

컴퓨터 그래픽스에서 동차좌표계(Homogeneous Coordinates)는 2D 및 3D 변환을 보다 효율적으로 처리하기 위해 사용된다. 이는 주로 직선 및 평면의 변환을 포함한 여러 기하학적 연산을 행렬 곱셈으로 단순화할 수 있게 한다.

동차좌표계는 주어진 차원 공간에 차원 하나를 추가하여 표현한다. 예를 들어, 2D 점 (x, y)는 동차좌표계에서 (x, y, w)로 표현되며, 3D 점 (x, y, z)(x, y, z, w)로 표현된다. 이 때, w는 보통 1로 설정되며, 변환 후 결과를 다시 원래 차원으로 변환할 때 사용된다.

2D 변환

2차원 공간에서의 변환에는 평행이동, 회전, 스케일링, 반사 등이 포함된다. 이러한 변환을 동차좌표계로 표현하면 행렬 곱셈을 사용하여 쉽게 계산할 수 있다. 2D 변환 행렬은 다음과 같은 형태를 갖는다.

\mathbf{T} = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix}
\mathbf{R} = \begin{bmatrix} \cos \theta & -\sin \theta & 0 \\ \sin \theta & \cos \theta & 0 \\ 0 & 0 & 1 \end{bmatrix}
\mathbf{S} = \begin{bmatrix} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & 1 \end{bmatrix}
\mathbf{F} = \begin{bmatrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ 0 & 0 & 1 \end{bmatrix}

여기서 (t_x, t_y)는 평행이동 벡터, \theta는 회전 각도, s_xs_y는 각각 x축과 y축 방향의 스케일 팩터이다.

3D 변환

3차원 공간에서의 동차 변환에는 평행이동, 회전, 스케일링, 반사, 전단 변환 등이 있다. 이러한 변환 역시 동차좌표계로 표현되며, 일반적으로는 4 \times 4 변환 행렬을 사용한다.

\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}
\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}
\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}
\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{S} = \begin{bmatrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}
\mathbf{F} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & -1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}
\mathbf{H} = \begin{bmatrix} 1 & s_{xy} & s_{xz} & 0 \\ s_{yx} & 1 & s_{yz} & 0 \\ s_{zx} & s_{zy} & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

여기서, s_{xy}, s_{xz}, s_{yx}, s_{yz}, s_{zx}, s_{zy}는 각각 x, y, z 평면에서의 전단 요소이다.

변환의 순서

복합 변환을 수행할 때 변환의 순서가 매우 중요하다. 변환이 차례대로 적용되므로, 예를 들어 먼저 스케일링을 하고 난 후에 평행이동을 하는 경우와, 먼저 평행이동을 한 후 스케일링을 하는 경우는 결과가 다를 수 있다. 이를 행렬 곱셈 순서로도 나타낼 수 있다.

\mathbf{T}_{total} = \mathbf{T}_2 \mathbf{T}_1 \mathbf{P}

여기서 \mathbf{T}_{total}은 복합 변환을 나타내는 행렬, \mathbf{T}_1\mathbf{T}_2는 차례대로 적용되는 개별 변환 행렬, 그리고 \mathbf{P}는 원래의 점 벡터이다.

시각적 예제

시각적으로 이러한 개념을 이해하는 것이 매우 중요하다. 회전, 스케일링, 평행이동 등의 변환이 실제 그래픽스 장면에서 어떻게 적용되는지를 구현해보면 큰 도움이 된다. 여러 소프트웨어 라이브러리와 도구, 예를 들면 OpenGL, DirectX, Unity 등에서 이러한 변환을 직접 시각화해 볼 수 있는 기능을 제공한다.

동차좌표계와 프로젝션

동차좌표계는 또한 3D 장면을 2D 화면에 투영하는 데 중요한 역할을 한다. 이는 카메라 모델과 프로젝트 매트릭스와 관련이 있다. 원근 투영(perspective projection)과 직교 투영(orthographic projection) 모두 동차좌표계를 사용하여 쉽게 구현할 수 있다.

\mathbf{P}_{ortho} = \begin{bmatrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & -\frac{2}{f-n} & -\frac{f+n}{f-n} \\ 0 & 0 & 0 & 1 \end{bmatrix}
\mathbf{P}_{persp} = \begin{bmatrix} \frac{2n}{r-l} & 0 & \frac{r+l}{r-l} & 0 \\ 0 & \frac{2n}{t-b} & \frac{t+b}{t-b} & 0 \\ 0 & 0 & -\frac{f+n}{f-n} & -\frac{2fn}{f-n} \\ 0 & 0 & -1 & 0 \end{bmatrix}

여기서 n, f, l, r, b, t는 각각 near, far, left, right, bottom, top 클리핑 평면의 좌표이다.


동차좌표계는 컴퓨터 그래픽스에서 중요한 도구로, 2D 및 3D 변환을 효율적으로 처리하고 복잡한 기하학적 연산을 단순화하는 데 사용된다. 이를 통해 그래픽스 프로그래머는 더욱 복잡한 장면과 애니메이션을 효율적으로 렌더링할 수 있다. 다양한 변환 기술을 익히고 이를 연습해보면, 컴퓨터 그래픽스의 핵심 개념을 깊이 이해할 수 있을 것이다.