# 동차좌표계를 통한 좌표계 변환

동차좌표계(Homogeneous Coordinates)는 컴퓨터 그래픽스와 기하학적인 변환에 주로 사용되는 좌표 표현 방식이다. 이는 차원을 하나 더 추가하여 변환 행렬의 일관성을 유지하고, 병렬 이동 등의 변환을 쉽게 수행할 수 있게 해준다. 이를 통해, 2차원 및 3차원 공간에서의 여러 기하학적 변환(회전, 이동, 스케일링 등)을 간단하게 표현할 수 있다.

#### 동차좌표계 기본 개념

일반적으로 2차원 평면상의 점 $(x, y)$는 동차좌표계에서 $(x, y, 1)$로 표현된다. 같은 방식으로 3차원 공간상의 점 $(x, y, z)$는 동차좌표계에서 $(x, y, z, 1)$로 표현된다. 여기서 마지막 성분인 '1'은 변환을 단순화하고 일관성을 유지하는 데 사용된다.

#### 동차좌표계로의 변환

원래의 좌표를 동차좌표계로 변환하는 과정은 간단한다. $w = 1$을 추가하여 다음과 같이 표현한다:

* 2차원 점 $(x, y) \to (x, y, 1)$
* 3차원 점 $(x, y, z) \to (x, y, z, 1)$

#### 행렬을 통한 변환 수행

동차좌표계에서는 여러 가지 기하학적 변환을 행렬 곱셈을 통해 쉽게 수행할 수 있다. 일반적으로 사용되는 변환 행렬에는 다음과 같은 것들이 있다:

**2차원 변환 행렬**

* **이동(Translation)**:

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

* **회전(Rotation)** (각도 $\theta$):

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

이와 같은 변환 행렬들을 이용하여 동차좌표계에서 좌표 변환을 수행하면 된다. 예를 들어, 이동 변환을 수행하기 위해서는 다음과 같이 계산한다:

$$
\mathbf{P'} = \mathbf{T} \mathbf{P}
$$

여기서 $\mathbf{P}$는 원래의 점을 동차좌표계로 표현한 벡터이다.

#### 3차원 변환 행렬

3차원 변환 행렬은 4x4 형태로 표현된다:

* **이동(Translation)**:

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

* **회전(Rotation)**:
  * **X축 회전** (각도 $\theta$):

$$
\mathbf{R\_x} = \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축 회전** (각도 $\theta$):

$$
\mathbf{R\_y} = \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축 회전** (각도 $\theta$):

$$
\mathbf{R\_z} = \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{M} = \mathbf{T} \mathbf{R}
$$

여기서 $\mathbf{M}$은 결합된 변환 행렬이다. 이런 방식으로 복잡한 변환을 하나의 행렬로 단순화할 수 있다.

### 좌표계의 변경

좌표계의 변경은 다른 기준 시스템으로 객체를 표현하는 과정이다. 이를 통해, 동일한 객체지만 다른 참조 프레임에서 어떻게 보이는지를 이해할 수 있다. 주로 사용되는 변환 방식은 선형 변환과 순차적인 회전과 병렬 이동을 포함한다.

#### 행렬을 통한 좌표계 변경

좌표계의 변경은 보통 두 좌표계 간의 변환 행렬을 통해 이루어진다. 변환 행렬을 이용해 한 좌표계에서 다른 좌표계로의 변환을 수행할 수 있다. 기본적으로 변환 행렬은 회전 행렬과 이동 벡터로 구성된다.

**회전 행렬**

회전 행렬은 두 좌표계 간의 회전을 나타낸다. 예를 들어, 두 좌표계 $A$와 $B$가 있을 때, 좌표계 $A$에서 좌표계 $B$로 변환하는 회전 행렬 $\mathbf{R\_{AB}}$는 다음과 같이 정의될 수 있다:

$$
\mathbf{R\_{AB}} = \begin{bmatrix} r\_{11} & r\_{12} & r\_{13} \ r\_{21} & r\_{22} & r\_{23} \ r\_{31} & r\_{32} & r\_{33} \end{bmatrix}
$$

여기서 각 $r\_{ij}$는 회전의 성분을 나타낸다.

**이동 벡터**

이동 벡터는 두 좌표계 간의 병렬 이동을 나타낸다. 좌표계 $A$에서 좌표계 $B$로의 이동 벡터 $\mathbf{T\_{AB}}$는 다음과 같이 정의될 수 있다:

$$
\mathbf{T\_{AB}} = \begin{bmatrix} t\_x \ t\_y \ t\_z \end{bmatrix}
$$

여기서 $t\_x, t\_y, t\_z$는 각각 x, y, z 방향으로의 이동을 나타낸다.

#### 변환 행렬의 적용

변환 행렬을 좌표 $\mathbf{P}$에 적용하면, 새로운 좌표 $\mathbf{P'}$를 얻을 수 있다. 이는 다음과 같이 표현된다:

$$
\mathbf{P'*B} = \mathbf{R*{AB}} \mathbf{P\_A} + \mathbf{T\_{AB}}
$$

이 식은 좌표계 $A$에서 표현된 점 $\mathbf{P\_A}$를 좌표계 $B$에서의 새로운 점 $\mathbf{P'\_B}$로 변환하는 과정을 나타낸다.

#### 예제

1. 회전 변환: 30도 각도로 시계 방향으로 회전하는 변환 행렬은 다음과 같다.

$$
\mathbf{R} = \begin{bmatrix} \cos{30^\circ} & -\sin{30^\circ} \ \sin{30^\circ} & \cos{30^\circ} \end{bmatrix} = \begin{bmatrix} \frac{\sqrt{3}}{2} & -\frac{1}{2} \ \frac{1}{2} & \frac{\sqrt{3}}{2} \end{bmatrix}
$$

2. 병렬 이동: $x$ 방향으로 2 단위, $y$ 방향으로 3 단위 이동하는 변환은 다음과 같다.

$$
\mathbf{T} = \begin{bmatrix} 2 \ 3 \end{bmatrix}
$$

이 두 변환을 결합한 완전한 변환 행렬은 다음과 같다:

$$
\mathbf{P'\_B} = \mathbf{R} \mathbf{P\_A} + \mathbf{T}
$$

마지막으로 동차좌표계를 사용하면 더 편리하게 표현할 수 있다:

$$
\mathbf{M} = \begin{bmatrix} \mathbf{R} & \mathbf{T} \ \mathbf{0} & 1 \end{bmatrix} = \begin{bmatrix} \frac{\sqrt{3}}{2} & -\frac{1}{2} & 2 \ \frac{1}{2} & \frac{\sqrt{3}}{2} & 3 \ 0 & 0 & 1 \end{bmatrix}
$$

따라서 동차 좌표 $\mathbf{P} = (x, y, 1)$에 적용 시:

$$
\mathbf{P'} = \mathbf{M} \mathbf{P}
$$

를 통해 좌표 변환을 쉽게 수행할 수 있다.
