지역 좌표계 (Local Coordinate System)

지역 좌표계는 3D 그래픽스, 컴퓨터 비전, 애니메이션 등 다양한 응용 분야에서 객체의 위치와 방향을 정의하는 데 사용되는 초기 좌표계이다. 보통 객체 자체에 고정되어 있으며, 해당 객체와 가장 관련이 깊은 좌표계이다.

객체의 초기 위치 및 방향을 기준으로 변환 행렬을 사용하여 객체를 변형할 수 있다. 예를 들어, 정의된 변환 행렬을 통해 객체를 회전, 스케일링, 평행 이동할 수 있다. 이 때 변환은 지역 좌표계를 기준으로 이루어진다.

다음은 지역 좌표계에서의 변환 예제이다:

\mathbf{T}_{\text{local}} = \mathbf{R}(\theta) \mathbf{S}(s) \mathbf{T}(\mathbf{d})

여기서, - \mathbf{R}(\theta)는 회전 행렬이며, \theta는 회전각을 나타낸다. - \mathbf{S}(s)는 스케일링 행렬이며, s는 스케일링 비율을 나타낸다. - \mathbf{T}(\mathbf{d})는 평행이동 행렬이며, \mathbf{d}는 이동 벡터를 나타낸다.

전역 좌표계 (Global Coordinate System)

전역 좌표계는 3D 공간에서 전역적 또는 전지적인 시점을 의미하는 좌표계이다. 이 좌표계는 장면(scene) 전체를 참조하는 데 사용되며, 모든 객체는 전역 좌표계를 기준으로 위치하고 방향을 잡게 된다.

전역 좌표계에서 각 객체의 변환은 초기 상태에서부터 현재 상태까지의 모든 변환이 누적된 결과로 계산된다. 이는 지역 좌표계의 변환을 전역 좌표계로 매핑할 때 필요하다.

예를 들어, 한 객체가 지역 좌표계에서 \mathbf{T}_{\text{local}} 변환을 가졌다면, 전역 좌표계에서의 변환 \mathbf{T}_{\text{global}}은 다음과 같이 표현된다:

\mathbf{T}_{\text{global}} = \mathbf{P} \mathbf{T}_{\text{local}}

여기서, - \mathbf{T}_{\text{global}}는 세계에서의 최종 변환 행렬이다. - \mathbf{P}는 전역 좌표계에서 지역 좌표계로의 변환 행렬이다.


지역 좌표계에서 전역 좌표계로의 변환

객체 변환을 지역 좌표계에서 전역 좌표계로 변환하기 위해서는 먼저 지역 좌표계에서의 변환 \mathbf{T}_{\text{local}}을 계산하고 이를 전역 좌표계로 변환해야 한다:

  1. 지역 좌표계 변환 계산: 객체의 회전, 스케일링, 평행 이동 행렬을 결합하여 지역 좌표계에서의 변환 \mathbf{T}_{\text{local}}을 계산한다.
\mathbf{T}_{\text{local}} = \mathbf{R}_{o} \mathbf{S}_{o} \mathbf{T}_{o}

여기서, - \mathbf{R}_{o}는 객체의 로컬 회전 행렬이다. - \mathbf{S}_{o}는 객체의 로컬 스케일링 행렬이다. - \mathbf{T}_{o}는 객체의 로컬 평행 이동 행렬이다.

  1. 전역 좌표계로의 변환 매핑: 지역 좌표계에서 계산된 \mathbf{T}_{\text{local}}을 전역 좌표계로 변환하기 위해 전역 좌표계로의 전환 행렬 \mathbf{P}를 곱한다.
\mathbf{T}_{\text{global}} = \mathbf{P} \mathbf{T}_{\text{local}}

이 과정을 통해 객체의 지역 좌표계에서의 변환이 전역 좌표계로 적절히 반영된다. 이는 다양한 응용 프로그램에서 매우 중요하다. 예를 들어, 여러 객체들이 함께 움직이는 경우, 각각의 지역 변환을 올바르게 전역 좌표계로 매핑해야 한다.

예시 코드

다음은 Python에서 NumPy 패키지를 사용하여 간단한 2D 변환을 수행하는 코드이다:

import numpy as np

def rotation_matrix(theta):
    """회전 행렬을 반환하는 함수."""
    return np.array([
        [np.cos(theta), -np.sin(theta)],
        [np.sin(theta), np.cos(theta)]
    ])

def scaling_matrix(s):
    """스케일링 행렬을 반환하는 함수."""
    return np.array([
        [s, 0],
        [0, s]
    ])

def translation_matrix(dx, dy):
    """평행 이동 행렬을 반환하는 함수."""
    return np.array([
        [1, 0, dx],
        [0, 1, dy],
        [0, 0, 1]
    ])

theta = np.pi / 4  # 45도 회전
scale_factor = 2
dx, dy = 2, 3

R = rotation_matrix(theta)
S = scaling_matrix(scale_factor)
T = translation_matrix(dx, dy)

T_local = R @ S @ T

P = np.eye(3)

T_global = P @ T_local

print("지역 좌표계 변환 행렬:\n", T_local)
print("전역 좌표계 변환 행렬:\n", T_global)

이 예제 코드는 2D 변환 행렬을 사용하여 객체를 회전, 스케일링, 평행 이동시키고 이를 전역 좌표계로 변환한다.


지역 좌표계와 전역 좌표계는 복잡한 3D 그래픽스와 변환을 다루는 데 있어 중요한 역할을 한다. 각 객체의 초기 위치를 기준으로 지역 좌표계를 설정하고 이를 전역 좌표계로 변환하는 과정은 3D 모형, 애니메이션 그리고 다양한 그래픽 응용 프로그램에서 필수적이다.