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 축을 중심으로 한 회전으로 구분된다. 각 축을 중심으로 한 회전 행렬은 다음과 같다:

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

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

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

\mathbf{p'} = \mathbf{C} \mathbf{p_h}

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