모델링, 뷰, 투영 변환

모델링, 뷰, 투영 변환은 컴퓨터 그래픽스와 3D 렌더링에서 중요한 과정이다. 이들은 다음의 변환 과정을 거친다.

모델링 변환

모델링 변환은 객체가 표현할 좌표를 정의하는 과정이다. 즉, 로컬 좌표계에서 객체를 전역 좌표계로 변환하는 과정이다.

모델링 변환은 주로 다음의 수학적 연산을 포함한다: - 이동 변환 (Translation): 객체를 x, y, z 방향으로 이동.

\mathbf{T}(t_x, t_y, t_z) = \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}
- 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{S}(s_x, s_y, s_z) = \begin{bmatrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

뷰 변환

뷰 변환은 장면의 어떤 부분을 카메라가 볼지 정의한다. 즉, 월드 좌표계를 뷰 좌표계로 변환하는 과정이다.

뷰 변환은 주로 다음의 행렬로 표현된다: - 카메라 위치 이동 (Camera Translation): 카메라 위치를 이동. - 카메라 회전 (Camera Rotation): 카메라 방향을 회전.

이는 일반적으로 다음과 같은 단계로 구성된다: 1. 카메라의 위치를 원점으로 이동:

\mathbf{T}(-\mathbf{e}) = \begin{bmatrix} 1 & 0 & 0 & -e_x \\ 0 & 1 & 0 & -e_y \\ 0 & 0 & 1 & -e_z \\ 0 & 0 & 0 & 1 \end{bmatrix}
여기서 $\mathbf{e} = (e_x, e_y, e_z)$는 카메라 위치를 나타낸다.
  1. 카메라의 회전:
\mathbf{R}_\text{view} = \begin{bmatrix} \mathbf{u}_x & \mathbf{u}_y & \mathbf{u}_z & 0 \\ \mathbf{v}_x & \mathbf{v}_y & \mathbf{v}_z & 0 \\ \mathbf{n}_x & \mathbf{n}_y & \mathbf{n}_z & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}
여기서 $\mathbf{u}, \mathbf{v}, \mathbf{n}$는 카메라의 축을 나타낸다 (기본적으로 오른손 좌표계).

투영 변환

투영 변환은 3D 공간을 2D 화면에 매핑하는 과정이다. 주로 원근 투영 (Perspective Projection)과 직교 투영 (Orthographic Projection)으로 나뉜다.

\mathbf{P}_{ortho} = \begin{bmatrix} 2/(r - l) & 0 & 0 & -(r + l)/(r - l) \\ 0 & 2/(t - b) & 0 & -(t + b)/(t - b) \\ 0 & 0 & -2/(f - n) & -(f + n)/(f - n) \\ 0 & 0 & 0 & 1 \end{bmatrix}

여기서 l, r, b, t, n, f는 각각 좌, 우, 하, 상, 전방, 후방 절단면이다.

\mathbf{P}_{perspective} = \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는 각각 앞쪽과 뒤쪽 평면과의 거리이다.

동차 좌표계 (Homogeneous Coordinates)

동차 좌표계는 변환 행렬을 사용하여 기하학적 변환을 쉽게 처리할 수 있도록 하는 방법이다. 이는 3D 공간의 점(P)를 4D 공간의 벡터로 표현함으로써 가능해진다.

기본 개념

3D 좌표 (x, y, z)는 동차 좌표 (x, y, z, w)로 확장된다. 여기서 w는 일반적으로 1로 설정되며, 실수 변환 후 다시 3D 좌표로 돌아올 때 \frac{x}{w}, \frac{y}{w}, \frac{z}{w}로 변환된다.

왜 동차 좌표계를 사용하는가?

  1. 변환의 통일화: 이동, 스케일링, 회전을 포함한 모든 기하학적 변환을 행렬 곱셈으로 표현할 수 있다.
  2. 혼합 변환 처리: 여러 변환을 하나의 연산으로 결합하여 수행할 수 있다.

동차 좌표계에서의 기본 변환 행렬

  1. 이동 변환 (Translation):
\mathbf{T}(t_x, t_y, t_z) = \begin{bmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix}
  1. 회전 변환 (Rotation):
    • 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}
  1. 스케일링 변환 (Scaling):
\mathbf{S}(s_x, s_y, s_z) = \begin{bmatrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

그래픽 파이프라인 (Graphics Pipeline)

그래픽 파이프라인은 화면에 최종 이미지를 렌더링하는 과정에서 데이터를 단계별로 처리하는 일련의 과정이다. 주요 단계는 다음과 같다:

  1. 응용 단계 (Application Stage):

    • 모델링 연산 및 애니메이션을 포함한 사용자 입력 처리.
    • 씬 그래프 구축 및 불필요한 객체 제거 기능(프러스트 culling).
  2. 지오메트리 처리 단계 (Geometry Processing Stage):

    • 모델링, 뷰, 투영 변환 등이 포함되며, 동차 좌표계를 사용하여 점, 선, 면 등의 지오메트리를 변환.
    • 정점 셰이더(Vertex Shader): 정점을 처리하고, 변환 및 조명 계산.
    • 테셀레이션 셰이더(Tessellation Shader): 지오메트리를 세분화하여 더 많은 디테일을 추가.
    • 기하 셰이더(Geometry Shader): 기하 도형을 생성 및 변형.
  3. 래스터화 단계 (Rasterization Stage):

    • 3D 지오메트리를 2D 화면에 그리기 위한 픽셀로 변환.
    • 프래그먼트 셰이더(Fragment Shader): 각 픽셀의 색상과 텍스처 계산.
  4. 프레임 버퍼 조작 단계 (Frame Buffer Operations Stage):

    • 알파 블렌딩, 스텐실 테스트, 깊이 테스트 등 최종 이미지 조작.

모델링, 뷰, 투영 변환 및 동차 좌표계는 3D 그래픽스를 이해하는 데 필수적이며, 이러한 개념을 통합하여 그래픽 파이프라인을 통해 화면에 최종 이미지를 렌더링한다. 이는 현대 모든 3D 그래픽 응용 프로그램 및 게임 엔진의 기초를 이루고 있다.