# 예제: 3차원 그래픽 변환

### 3차원 변환의 기본 개념

3차원 공간에서 객체의 변환은 위치, 크기, 방향 등을 변경하여 객체를 원하는 형태로 만드는 과정을 의미한다. 3차원 변환에는 여러 유형이 있으며, 각각 고유한 행렬 연산을 통해 수행된다. 이 예제에서는 변환의 기본 개념을 다루고, 각 변환을 수학적으로 표현하고 이를 사용하여 그래픽 객체를 변환하는 방법을 살펴본다.

### 평행 이동 (Translation)

평행 이동은 객체를 일정한 거리만큼 이동시키는 변환이다. 수학적으로 평행 이동은 다음과 같이 표현된다:

객체의 위치를 나타내는 3차원 벡터 $\mathbf{v} = \begin{bmatrix} x \ y \ z \end{bmatrix}$가 있을 때, 원하는 평행 이동 벡터를 $\mathbf{t} = \begin{bmatrix} t\_x \ t\_y \ t\_z \end{bmatrix}$로 나타내면, 평행 이동된 벡터 $\mathbf{v'}$는 다음과 같이 구할 수 있다:

$$
\mathbf{v'} = \mathbf{v} + \mathbf{t} = \begin{bmatrix} x \ y \ z \end{bmatrix} + \begin{bmatrix} t\_x \ t\_y \ t\_z \end{bmatrix} = \begin{bmatrix} x + t\_x \ y + t\_y \ z + t\_z \end{bmatrix}
$$

동차좌표계에서는 평행 이동을 4x4 행렬로 나타낼 수 있다:

$$
\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{v'} = \mathbf{T} \mathbf{v\_h} \quad \text{where} \quad \mathbf{v\_h} = \begin{bmatrix} x \ y \ z \ 1 \end{bmatrix}
$$

### 회전 (Rotation)

회전 변환은 객체를 주어진 축을 중심으로 일정 각도만큼 회전시키는 변환이다. 회전 변환은 주로 x, y, z 축을 중심으로 한 회전으로 구분된다. 각 축을 중심으로 한 회전 행렬은 다음과 같다:

* x축을 중심으로 한 회전:

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

* y축을 중심으로 한 회전:

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

* z축을 중심으로 한 회전:

$$
\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{v\_h} = \begin{bmatrix} x \ y \ z \ 1 \end{bmatrix}$를 $\theta$ 라디안만큼 x축을 중심으로 회전시키면, 다음과 같은 결과를 얻는다:

$$
\mathbf{v'} = \mathbf{R}\_x(\theta) \mathbf{v\_h}
$$

### 스케일링 (Scaling)

스케일링은 객체의 크기를 변경하는 변환이다. 스케일링 행렬을 $\mathbf{S}$로 나타낸다. $\mathbf{S}$는 다음과 같은 4x4 행렬로 표현된다:

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

여기서 $s\_x$, $s\_y$, $s\_z$는 각각 x, y, z축에 대한 스케일 계수이다. 객체의 크기를 변경하려면 벡터 $\mathbf{v\_h}$에 스케일링 행렬 $\mathbf{S}$를 곱하면 된다:

$$
\mathbf{v'} = \mathbf{S} \mathbf{v\_h} \quad \text{where} \quad \mathbf{v\_h} = \begin{bmatrix} x \ y \ z \ 1 \end{bmatrix}
$$

### 복합 변환 (Composite Transformation)

복합 변환은 여러 개의 기본 변환을 연이어 수행하여 객체를 원하는 형태로 만드는 것이다. 복합 변환의 핵심은 변환 행렬을 순서대로 곱하여 하나의 복합 행렬을 만든 후 이를 객체에 적용하는 것이다.

예를 들어, 객체를 먼저 평행 이동시키고, 회전한 뒤 스케일링하는 경우를 생각해 봅시다. 각 변환의 행렬을 차례로 곱하면 된다. 평행 이동 행렬 $\mathbf{T}$, 회전 행렬 $\mathbf{R}$, 스케일링 행렬 $\mathbf{S}$가 주어졌을 때, 복합 변환 행렬 $\mathbf{C}$는 다음과 같이 구할 수 있다:

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

복합 변환 행렬을 구한 후, 이를 객체의 동차 좌표 벡터 $\mathbf{v\_h}$에 곱하여 변환된 객체를 얻는다:

$$
\mathbf{v'} = \mathbf{C} \mathbf{v\_h}
$$

### 예제: 2D 평행 이동

2차원 평행이동은 객체를 평면에서 이동시키는 변환으로, 각각의 점을 $\Delta x$와 $\Delta y$만큼 이동시키는 것이다. 2차원 평행이동의 수학적 표현은 다음과 같다:

점 $\mathbf{p} = \begin{bmatrix} x \ y \end{bmatrix}$이 있을 때, 평행이동 벡터 $\mathbf{t} = \begin{bmatrix} t\_x \ t\_y \end{bmatrix}$만큼 이동된 새로운 점 $\mathbf{p'}$는 다음과 같이 나타낼 수 있다:

$$
\mathbf{p'} = \mathbf{p} + \mathbf{t} = \begin{bmatrix} x + t\_x \ y + t\_y \end{bmatrix}
$$

동차좌표계에서는 평행이동을 다음과 같이 3x3 행렬로 나타낼 수 있다:

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

이를 사용하여 점 $\mathbf{p}\_h = \begin{bmatrix} x \ y \ 1 \end{bmatrix}$을 변환된 점 $\mathbf{p'}$로 표현하면:

$$
\mathbf{p'} = T \mathbf{p\_h}
$$

### 예제: 2D 회전

2차원 평면에서 회전 변환은 원점을 중심으로 점을 $\theta$만큼 회전시키는 것이다. 회전 행렬은 다음과 같이 나타낼 수 있다:

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

점 $\mathbf{p\_h} = \begin{bmatrix} x \ y \ 1 \end{bmatrix}$을 $\theta$만큼 회전시키면 변환된 점 $\mathbf{p'}$는 다음과 같다:

$$
\mathbf{p'} = \mathbf{R}(\theta) \mathbf{p}\_h
$$

### 예제: 2D 스케일링

2차원 스케일링은 점을 원점으로부터 일정 비율로 확장하거나 축소하는 변환이다. 스케일링 행렬은 다음과 같이 나타낼 수 있다:

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

여기서 $s\_x$와 $s\_y$는 각각 x축과 y축에 대한 스케일 계수이다. 점 $\mathbf{p}\_h = \begin{bmatrix} x \ y \ 1 \end{bmatrix}$에 스케일링 행렬을 적용하여 변환된 점 $\mathbf{p'}$를 구하면 다음과 같다:

$$
\mathbf{p'} = \mathbf{S} \mathbf{p}\_h
$$

### 예제: 2D 복합 변환

2차원 복합 변환은 여러 개의 기본 변환을 순서대로 적용하는 과정이다. 평행이동, 회전, 스케일링의 순서로 구성된 복합 변환을 예로 들어보겠다.

모든 변환 행렬이 다음과 같이 주어졌다고 가정한다:

* 평행 이동: $\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{C}$를 구하려면 각 변환 행렬을 순서대로 곱하면 된다:

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

최종 변환된 점 $\mathbf{p'}$는 다음과 같다:

$$
\mathbf{p'} = \mathbf{C} \mathbf{p\_h}
$$

이와 같은 방식으로 다양한 복합 변환을 수행하여 원하는 객체의 이동, 회전, 크기 변화를 표현할 수 있다.
