Local 좌표와 World 좌표는 무엇이 다를까?

이전 글에서는 Transform이 무엇인지,
그리고 왜 대부분의 게임 엔진들이 Position, Rotation, Scale 구조를 사용하는지를 정리했습니다.

게임 엔진은 결국 공간 안에서 객체를 배치하고 움직이는 프로그램이고,
Transform은 그 공간 정보를 표현하는 핵심 구조라는 점도 함께 살펴봤습니다.

그런데 Transform을 공부하기 시작하면 어느 순간 굉장히 자주 등장하는 개념이 하나 있습니다.

바로 Local 좌표와 World 좌표입니다.

유니티에서도 Local Position, World Position 같은 개념이 등장하고,
언리얼 엔진 역시 Relative Transform, World Transform을 사용합니다.

그리고 두 개념의 차이를 이해하는 것은 매우 중요합니다.

특히 아래에 나열된 기능들이 대부분 Local 좌표와 World 좌표 개념을 기반으로 동작합니다.

  • 부모/자식 구조
  • 카메라 추적
  • 무기 장착
  • Scene Graph

이번 글에서는 Local 좌표와 World 좌표가 무엇인지,
그리고 왜 게임 엔진들이 두 개념을 함께 사용하는지를 정리해보려고 합니다.


World 좌표는 “게임 세계 전체 기준” 위치다

World 좌표는 가장 직관적인 개념입니다.

가상의 게임 세계 전체를 기준으로 객체 위치를 표현하는 방식입니다.

예를 들어 아래와 같은 좌표를 생각해볼 수 있습니다.

Position = { 100, 50, 0 }

이 값은 게임 세계 전체 기준으로 객체가

  • x = 100
  • y = 50
  • z = 0

위치에 존재한다는 의미입니다.

즉, World 좌표는 절대적인 위치 개념에 가깝습니다.

게임 안에서 캐릭터가 현재 어디에 존재하는가를 표현할 때 가장 흔하게 사용하는 좌표라고 볼 수 있습니다.


그런데 게임 객체들은 서로 연결되는 경우가 많다

문제는 실제 게임에서는 객체들이 독립적으로만 존재하지 않는다는 점입니다.

예를 들어 아래와 같은 다양한 상황들이 존재할 수 있습니다.

  • 캐릭터 손에 무기를 장착하거나
  • 카메라가 플레이어를 따라다니거나
  • 자동차 바퀴가 차체와 함께 움직이거나
  • UI가 특정 객체를 따라 움직이는 경우

즉, 객체가 다른 객체를 기준으로 움직이는 경우가 굉장히 많아집니다.

그리고 이런 구조를 표현하기 위해 등장하는 개념이 바로 Local 좌표입니다.


Local 좌표는 “부모 객체 기준” 위치다

Local 좌표는 부모 객체를 기준으로 위치를 표현하는 방식입니다.

예를 들어 플레이어 손 위치에 검을 장착한다고 생각해보겠습니다.

이 경우 검은 게임 세계 전체 기준으로 위치를 계산하기보다, “플레이어 손 위치 기준”으로 배치하는 것이 훨씬 자연스럽습니다.

예를 들어 아래처럼 표현할 수 있습니다.

Sword Local Position = { 10, 0, 0 }

이 의미는 “플레이어 손 기준으로 오른쪽 10만큼 떨어져 있다”는 뜻입니다.

즉, Local 좌표는 부모 객체를 기준으로 상대적인 위치를 표현합니다.


왜 Local 좌표가 필요할까?

“그냥 World 좌표만 사용하면 되는 것 아닌가?”하는 생각이 들 수도 있습니다.

하지만 실제 게임에서는 부모 객체가 계속 움직입니다.

예를 들어 플레이어가 이동하면 손에 들고 있는 검도 함께 움직여야 합니다.

만약 모든 객체를 World 좌표 기준으로 직접 계산해야 한다면,
매 프레임 검의 위치를 계속해서 새로 계산해야 할 수도 있습니다.

하지만 Local 좌표를 사용하면 부모 객체가 움직였을 때 자식 객체도 자연스럽게 함께 이동할 수 있습니다.

즉, 계층 구조를 훨씬 효율적으로 관리할 수 있게 됩니다.


부모가 움직이면 자식도 함께 움직인다

예를 들어 아래와 같은 구조를 생각해보겠습니다.

Player
 └─ Sword

플레이어 위치가 아래와 같이 ( 100, 0, 0 ) 이고,

Player Position = { 100, 0, 0 }

검의 Local Position이 ( 10, 0, 0 ) 이라고 가정한다면,

Sword Local Position = { 10, 0, 0 }

실제 검의 World Position은 ( 110, 0, 0 )이 됩니다.

{ 110, 0, 0 }

그리고 플레이어가 이동하면, 검 역시 자동으로 함께 이동하게 됩니다.

즉, Local 좌표 구조를 사용하면 부모/자식 관계를 훨씬 자연스럽게 표현할 수 있습니다.


유니티와 언리얼 엔진도 같은 개념을 사용한다

흥미로운 점은 대부분의 게임 엔진들이 결국 같은 구조를 사용한다는 점입니다.

유니티에서는 transform.position | transform.localPosition 개념을 모두 제공합니다.

  • position은 World 좌표
  • localPosition은 부모 기준 좌표

에 가깝습니다.

언리얼 엔진 역시 비슷합니다. World Transform | Relative Transform 구조를 적극적으로 사용합니다.

즉, 이 개념은 특정 엔진만의 구조가 아니라, 게임 공간을 표현하기 위한 굉장히 보편적인 방식에 가깝습니다.


Local 좌표와 World 좌표는 Scene Graph와 연결된다

이 개념은 단순히 좌표 계산에서 끝나지 않습니다.

게임 엔진은 보통 객체들을 계층 구조로 관리합니다.

예를 들어 아래와 같이 플레이어 하위의 다양한 객체가 계층 구조를 이루며 구성되도록 설계할 수 있습니다.

– 플레이어
– 무기
– 카메라
– 이펙트

그리고 이런 구조를 Scene Graph라고 부르기도 합니다.

즉, 게임 엔진은 단순히 객체를 나열하는 것이 아니라, 객체들 사이의 관계까지 함께 관리합니다.

그리고 이 구조의 핵심이 바로 Local 좌표와 World 좌표입니다.


행렬(Matrix)도 결국 이 계산을 위해 등장한다

게임 수학을 공부하다 보면 행렬(Matrix)이라는 개념을 만나게 됩니다.

처음에는 굉장히 어렵고 복잡하게 느껴질 수도 있습니다.

하지만 결국 행렬 역시 게임 객체를 다룰 때 기본이 되는 위치, 회전, 스케일의 계산을 효율적으로 처리하기 위한 도구라고 생각할 수 있습니다.

  • Position
  • Rotation
  • Scale
  • Local → World 변환

즉, Transform, Local 좌표, Scene Graph, Matrix는 서로 완전히 독립적인 개념이 아닙니다.

결국 모두 “객체를 공간 안에서 어떻게 표현하고 계산할 것인가”와 연결됩니다.


최근 게임 엔진은 이런 구조를 더 효율적으로 처리하기 시작했다

최근 게임 엔진들은 단순히 좌표를 저장하는 것에서 끝나지 않습니다.

왜냐하면 최근 게임들은 수많은 객체들의 Transform 정보를 매 프레임 계속 계산해야 하기 때문입니다.

예를 들어 아래와 같은 상황에서는 Transform 계산 자체가 굉장히 큰 비용이 될 수도 있습니다.

  • 수천 개의 NPC
  • 대규모 Scene
  • 복잡한 계층 구조

그래서 최근 엔진 구조는 Cache 효율, ECS, Data Oriented Design 같은 개념들이 등장하면서 Transform 데이터 자체를 더 효율적으로 처리하기 시작했습니다.

즉, 최근 엔진 구조는 점점 “객체를 어떻게 표현할 것인가”뿐만 아니라,
“Transform 계산을 어떻게 더 효율적으로 처리할 것인가”도 중요하게 보기 시작했습니다.


결국 게임 엔진은 관계를 계산하는 프로그램이기도 하다

처음에는 Local 좌표와 World 좌표가 단순 위치 계산처럼 느껴질 수도 있습니다.

하지만 조금 더 깊게 들여다보면, 게임 엔진은 단순히 객체 위치만 계산하는 프로그램이 아니라,
객체들 사이의 관계까지 계산하는 프로그램이라는 것을 알게됩니다.

부모 객체가 움직이면 자식 객체도 함께 움직이고,
카메라는 플레이어를 따라가며,
무기는 캐릭터 손 위치를 기준으로 움직입니다.

게임 공간은 독립된 객체들의 집합이라기보다, 서로 연결된 관계 구조에 더 가깝습니다.

그리고 Local 좌표와 World 좌표는 이런 관계를 표현하기 위해 등장한 핵심 개념이라고 볼 수 있습니다.


마무리

게임 엔진을 공부하다 보면, Local 좌표와 World 좌표 개념을 정말 자주 접하게 됩니다.

처음에는 둘 다 단순 위치 정보처럼 느껴질 수도 있습니다.

하지만 조금 더 깊게 들여다보면,
결국 게임 엔진이 객체들 사이의 관계를 어떻게 표현하고 계산하는지가 이 구조 안에 담겨 있다는 것을 알게됩니다.

그리고 이런 흐름을 이해하기 시작하면 왜 대부분의 게임 엔진들이 계층 구조와 Transform 시스템을 함께 사용하는지도 조금씩 보이기 시작합니다.

다음 글에서는 왜 게임 엔진이 Parent / Child 기반 계층 구조(Scene Graph)를 사용하는지도 이어서 정리해보려고 합니다.


👉 게임 엔진 구조를 더 깊이 이해하고 싶다면

아래 강의를 통해 직접 구현해보는 것을 추천드립니다.

C++로 만드는 게임 엔진 프레임워크 강의

👉 C++로 만드는 게임 엔진 프레임워크 강의 바로가기

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다