본문 바로가기

게임 프로그래밍

3D 에서 Local Space와 World Space 변환 이해하기

3D 그래픽스의 Local Space와 World Space 변환 이해하기

3D 그래픽스에서 모델링한 객체들은 모두 Local Space(로컬 좌표계)에 정의되어 있습니다. 이를 실제 게임 환경에 배치하기 위해서는 World Space(월드 좌표계)로 변환해야 합니다. 이번 포스팅에서는 Local Space에서 World Space로의 변환 과정과 그 원리에 대해 자세히 알아보겠습니다.

 

Local Space란?

Local Space는 모델 각각의 좌표 공간을 의미합니다. 모델링 툴에서 만든 객체의 정점(Vertex)들은 로컬 좌표계를 기준으로 위치가 정해져 있습니다. 이 로컬 좌표는 모델 자체에 대한 상대적인 위치를 나타내며, 아직 게임 세계에 배치된 것은 아닙니다.

 

World Space란?

World Space는 게임 전체의 좌표계를 정의합니다. 즉, 게임에서 모델이 실제로 배치되는 위치와 방향을 나타내는 공간입니다. Local Space에 정의된 모델을 World Space로 이동시키면, 게임 세계의 특정 위치에 모델이 자리잡게 됩니다.

 

Local Space → World Space 변환

Local Space에 정의된 모델의 정점들은 모두 동일한 변환을 거쳐야 World Space에 올바르게 배치될 수 있습니다. 이때 필요한 것이 World Matrix(월드 행렬)입니다.

 

World Matrix란?

World Matrix는 Local Space에 있는 정점들을 World Space로 변환하는 행렬입니다. 이 행렬은 4x4 형태로 정의되며, 모델의 회전, 크기, 이동 정보를 담고 있습니다.

[0, 0, -1, 0] // Right Vector (X 축 방향)
[0, 1,  0, 0] // Up Vector (Y 축 방향)
[1, 0,  0, 0] // Look Vector (Z 축 방향)
[0, 0,  0, 1] // Position (위치 정보)
  • Right Vector: 객체의 오른쪽 방향
  • Up Vector: 객체의 위쪽 방향
  • Look Vector: 객체가 바라보는 방향
  • Position: 객체의 실제 위치

이 정보들을 통해 Local Space의 정점들이 World Space에 정확히 배치됩니다.

 

벡터 정규화와 직교 상태 유지

3D 모델의 방향 벡터(Up, Right, Look)는 반드시 직교 상태를 유지해야 합니다. 이를 위해, 다음과 같은 과정을 거칩니다:

  1. Look Vector 구하기
    • 목표 지점과 현재 위치의 차를 통해 Look Vector를 계산합니다.
  2. Right Vector 구하기
    • Up Vector와 Look Vector의 외적(Cross Product)을 통해 Right Vector를 구합니다.
  3. Up Vector 갱신하기
    • Look Vector와 Right Vector의 외적을 통해 Up Vector를 다시 계산합니다.

이 과정을 통해 모델의 공간적 일관성을 유지할 수 있습니다.

 

월드 좌표계에서의 크기 측정

각 Vector의 크기(Magnitude)는 월드 공간에서의 크기를 의미합니다. 예를 들어:

Right Vector => sqrt(0^2 + 0^2 + (-1)^2) = 1
Up Vector    => sqrt(0^2 + 1^2 +  0^2) = 1
Look Vector  => sqrt(1^2 + 0^2 +  0^2) = 1

크기가 1이라는 것은 단위 벡터임을 의미합니다.

 

카메라와 뷰 변환

게임 화면에 3D 객체를 그리기 위해서는 카메라(Camera)가 필요합니다. 카메라가 바라보는 시점을 기준으로 Local Space와 World Space를 조정하는 것이 뷰 변환(View Transformation)입니다.

 

뷰 변환 행렬(View Matrix)

  • 카메라의 월드 행렬의 역행렬(Inverse Matrix)입니다.
  • 카메라의 위치를 원점으로 변환하는 역할을 합니다.
  • 모든 객체에 이 변환을 적용하면, 카메라 기준으로 화면에 보이게 됩니다.

 

원근 투영과 Z 나누기

3D 객체를 2D 화면에 그리기 위해서는 **원근 투영(Perspective Projection)**이 필요합니다.
이때, Z 값을 나누는 과정이 필요합니다.

이를 통해 먼 객체는 작게, 가까운 객체는 크게 보이게 하는 원근감을 표현할 수 있습니다.

 

결론

3D 그래픽스에서 Local Space와 World Space의 변환 과정은 매우 중요합니다.
올바르게 설정된 World Matrix를 통해 모델은 게임 세계에 자연스럽게 배치됩니다. 또한, 카메라와 뷰 변환을 통해 플레이어가 원하는 시점에서 세계를 탐험할 수 있습니다.

'게임 프로그래밍' 카테고리의 다른 글

DX9 - 카메라  (1) 2025.04.27
동차 좌표  (0) 2025.04.20
DX - 투영 행렬  (0) 2025.04.12
몬스터 행동 패턴 구현 정리 (2D)  (0) 2025.04.03