트랜스폼(Transform)이란 무엇일까?

게임 엔진을 공부하다 보면 정말 자주 보게 되는 단어가 있습니다.

바로 Transform입니다.

유니티를 사용해도 그렇고, 언리얼 엔진을 사용해도 그렇고 대부분의 게임 객체는 Transform 정보를 가지고 있습니다.

캐릭터를 움직이거나, 카메라를 회전시키거나, 오브젝트 크기를 변경할 때도 결국 Transform 정보가 변경됩니다.

처음에는 단순히 “객체 위치를 저장하는 기능인가 보다” 정도로 느껴질 수도 있습니다.

하지만 조금 더 깊게 들여다보기 시작하면 Transform은 단순 좌표 정보가 아니라, 게임 공간 자체를 표현하기 위한 핵심 구조라는 것을 알게됩니다.

실제로 게임 엔진에서 등장하는 수많은 개념들이 결국 Transform과 연결됩니다.

  • Position
  • Rotation
  • Scale
  • Local 좌표
  • World 좌표
  • Scene Graph
  • Matrix

같은 개념들이 모두 Transform을 기반으로 동작합니다.

즉, Transform은 단순 기능 하나가 아니라 게임 엔진이 공간을 어떻게 표현하고 계산하는가와 연결된 굉장히 중요한 구조라고 볼 수 있습니다.

이번 글에서는 Transform이 정확히 무엇인지, 그리고 왜 대부분의 게임 엔진들이 비슷한 구조를 사용하는지를 정리해보려고 합니다.


게임 엔진은 결국 공간을 다루는 프로그램이다

게임 안에는 굉장히 많은 객체들이 존재합니다.

플레이어 캐릭터가 존재하고, 몬스터가 존재하며, 카메라와 건물, 총알과 이펙트 같은 수많은 객체들이 함께 존재합니다.

그리고 이런 객체들은 단순히 존재만 하는 것이 아닙니다.

계속 움직이고, 회전하고, 크기가 변하며, 서로 다른 위치 관계를 가지게 됩니다.

즉, 게임 엔진은 결국 “객체를 공간 안에 어떻게 배치할 것인가”를 계속 계산하는 프로그램에 가깝습니다.

예를 들어 플레이어가 앞으로 이동하면 위치가 바뀌어야 하고, 카메라가 플레이어를 바라보도록 회전해야 하며, 아이템을 획득했을 때 특정 오브젝트 크기가 커질 수도 있습니다.

이런 모든 변화들을 표현하기 위해 게임 엔진은 객체의 공간 정보를 관리해야 합니다.

그리고 이 공간 정보를 표현하는 구조가 바로 Transform입니다.


Transform은 객체의 공간 정보를 표현한다

Transform은 보통 객체의 위치, 회전, 스케일 정보를 관리합니다.

아래와 같은 형태를 생각해 봅시다.

struct Vector3
{
    float x;
    float y;
    float z;
};

struct Transform
{
    Vector3 position;
    Vector3 rotation;
    Vector3 scale;
};

단순한 구조처럼 보일 수도 있습니다.

하지만 실제 게임 엔진 안에서는 거의 모든 객체들이 이런 형태의 정보를 기반으로 움직이게 됩니다.

즉, 트랜스폼은 “객체가 어디에 존재하는가”, “어느 방향을 바라보는가”, “얼마나 큰가”를 표현하는 핵심 데이터라고 볼 수 있습니다.


Position은 객체의 위치를 의미한다

Position은 가장 직관적인 정보입니다.

객체가 현재 공간 안 어디에 존재하는지를 표현합니다.

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

Vector3 position = { 10.0f, 5.0f, 0.0f };

이 값은 객체가

– x = 10
– y = 5
– z = 0

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

2D 게임에서는 보통 x, y만 사용하는 경우가 많고, 3D 게임에서는 x, y, z를 모두 사용하게 됩니다.

게임 안에서 플레이어가 이동한다는 것은 결국 이 Position 값이 계속 변경된다는 의미와 같습니다.

즉, Position은 객체를 공간 안 어디에 배치할 것인가를 결정하는 가장 기본적인 정보입니다.


Rotation은 객체의 방향을 의미한다

객체는 단순히 위치만 가진다고 끝나지 않습니다.

어느 방향을 바라보는지도 굉장히 중요합니다.

예를 들어 FPS 게임을 생각해보면 플레이어 카메라는 계속 회전하게 됩니다.

몬스터 역시 플레이어를 바라보도록 방향을 변경할 수 있고, 총알은 특정 방향으로 발사되어야 합니다.

이런 방향 정보를 표현하는 값이 Rotation입니다.

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

Vector3 rotation = { 0.0f, 90.0f, 0.0f };

게임 엔진에서는 Rotation을 표현하는 방식도 여러 가지가 존재합니다.

오일러 각(Euler Angle)을 사용하는 경우도 있고, 쿼터니언(4원수, Quaternion)을 사용하는 경우도 있습니다.

하지만 핵심은 같습니다.

객체가 현재 어떤 방향을 바라보고 있는가를 표현하는 것입니다.


Scale은 객체의 크기를 의미한다

Scale은 객체의 크기를 표현하는 정보입니다.

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

Vector3 scale = { 2.0f, 2.0f, 2.0f };

이 경우 객체 크기가 원본보다 2배 커질 수 있습니다.

반대로 아래처럼 표현하면 절반 크기로 축소될 수 있습니다.

Vector3 scale = { 0.5f, 0.5f, 0.5f };

게임에서는 생각보다 Scale 변경이 자주 사용됩니다.

예를 들어

– UI 확대 애니메이션
– 캐릭터 변신 연출
– 오브젝트 등장 효과

같은 부분들에서도 Scale 변경이 많이 사용됩니다.

즉, Scale 역시 게임 공간 안에서 객체를 표현하는 중요한 정보 중 하나입니다.


왜 게임 엔진은 이 세 가지를 하나로 묶을까?

처음에는 이런 생각이 들 수도 있습니다.

“위치만 저장하면 되는 것 아닌가?”

하지만 실제 게임에서는 위치, 회전, 크기가 서로 독립적으로 굉장히 자주 변경됩니다.

예를 들어 캐릭터는 이동하지만 크기는 그대로일 수 있습니다. 반대로 UI는 위치는 유지한 채 확대될 수도 있고, 카메라는 회전하지만 위치는 고정될 수도 있습니다.

즉, 이 세 가지 정보는 서로 다른 역할을 가지면서도 함께 객체를 표현합니다.

그래서 게임 엔진들은 위치, 회전, 스케일 정보를 하나로 묶어서 관리합니다.

그리고 이 구조를 Transform이라고 부릅니다.


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

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

유니티에서는 모든 GameObject가 기본적으로 Transform Component를 가집니다.

즉, 모든 객체는 위치, 회전, 크기 정보를 기본적으로 가지게 됩니다.

언리얼 엔진 역시 비슷합니다.

언리얼 엔진에서는 FTransform 구조를 사용하며, Actor 역시 결국 Transform 정보를 기반으로 공간 안에 배치됩니다.

즉, 엔진마다 이름이나 내부 구현은 조금 다를 수 있지만 결국 객체의 공간 정보를 표현한다는 핵심 개념은 거의 동일합니다.


Transform은 생각보다 훨씬 더 많은 개념과 연결된다

처음에는 Transform이 단순 좌표 정보처럼 느껴질 수도 있습니다.

하지만 실제 게임 엔진 구조를 공부하기 시작하면 거의 모든 공간 관련 개념들이 Transform과 연결된다는 것을 알게됩니다.

예를 들어 부모 객체를 이동하면 자식 객체가 함께 이동하는 Parent / Child 구조 역시 Transform을 기반으로 동작합니다.

Local 좌표와 World 좌표 개념도 결국 Transform 계산과 연결됩니다.

그리고 Scene Graph 구조 역시 객체들의 Transform 관계를 관리하기 위해 등장한 구조라고 볼 수 있습니다.

심지어 나중에 배우게 되는 행렬(Matrix) 역시 결국은 Position, Rotation, Scale을 계산하고 결합하기 위해 사용됩니다.

즉, Transform은 단순 기능 하나가 아니라 게임 공간 전체를 표현하는 핵심 구조라고 볼 수 있습니다.


최근 게임 엔진은 Transform 데이터 처리 방식도 변화하기 시작했다

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

왜냐하면 최근 게임들은 처리해야 하는 객체 수가 과거보다 훨씬 많아졌기 때문입니다.

예를 들어

  • 수천 개의 NPC
  • 수많은 파티클
  • 대규모 오브젝트

같은 것들의 위치와 회전을 매 프레임 계속 계산해야 합니다.

그리고 이 과정에서

  • Cache 효율
  • ECS
  • Data Oriented Design

같은 개념들을 점점 더 중요시하기 시작했습니다.

즉, 최근 엔진 구조는 단순히 “객체를 어떻게 표현할 것인가”뿐만 아니라 “Transform 데이터를 어떻게 더 효율적으로 처리할 것인가”도 함께 고민하기 시작했습니다.


마무리

게임 엔진을 공부하다 보면 Transform이라는 단어를 정말 끊임없이 보게 됩니다.

처음에는 단순히 위치 정보를 저장하는 구조처럼 느껴질 수도 있습니다.

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

그리고 이런 흐름을 이해하기 시작하면 왜 대부분의 게임 엔진들이 비슷한 Transform 구조를 사용하는지도 조금씩 보이기 시작합니다.

앞으로 이어지는 글에서는

  • Local 좌표와 World 좌표
  • Scene Graph
  • Matrix

같은 개념들이 왜 등장하는지도 계속 정리해보려고 합니다.


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

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

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

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

댓글 남기기

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