# 컴퓨터 그래픽스에서의 응용

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

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

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

#### 2D 변환

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

* **평행이동(Translation):**

$$
\mathbf{T} = \begin{bmatrix} 1 & 0 & t\_x \ 0 & 1 & t\_y \ 0 & 0 & 1 \end{bmatrix}
$$

* **회전(Rotation):**

$$
\mathbf{R} = \begin{bmatrix} \cos \theta & -\sin \theta & 0 \ \sin \theta & \cos \theta & 0 \ 0 & 0 & 1 \end{bmatrix}
$$

* **스케일링(Scaling):**

$$
\mathbf{S} = \begin{bmatrix} s\_x & 0 & 0 \ 0 & s\_y & 0 \ 0 & 0 & 1 \end{bmatrix}
$$

* **반사(Reflection):**

$$
\mathbf{F} = \begin{bmatrix} 1 & 0 & 0 \ 0 & -1 & 0 \ 0 & 0 & 1 \end{bmatrix}
$$

여기서 $(t\_x, t\_y)$는 평행이동 벡터, $\theta$는 회전 각도, $s\_x$와 $s\_y$는 각각 x축과 y축 방향의 스케일 팩터이다.

#### 3D 변환

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

* **평행이동(Translation):**

$$
\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}
$$

* **회전(Rotation):**

$$
\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}
$$

* **스케일링(Scaling):**

$$
\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}
$$

* **반사(Reflection):**

$$
\mathbf{F} = \begin{bmatrix} 1 & 0 & 0 & 0 \ 0 & -1 & 0 & 0 \ 0 & 0 & 1 & 0 \ 0 & 0 & 0 & 1 \end{bmatrix}
$$

* **전단(Shear):**

$$
\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) 모두 동차좌표계를 사용하여 쉽게 구현할 수 있다.

* **직교 투영(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}
$$

* **원근 투영(Perspective Projection):**

$$
\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 변환을 효율적으로 처리하고 복잡한 기하학적 연산을 단순화하는 데 사용된다. 이를 통해 그래픽스 프로그래머는 더욱 복잡한 장면과 애니메이션을 효율적으로 렌더링할 수 있다. 다양한 변환 기술을 익히고 이를 연습해보면, 컴퓨터 그래픽스의 핵심 개념을 깊이 이해할 수 있을 것이다.
