행렬(Matrix)은 왜 필요한 걸까?

이전 글들에서는 Transform | Local 좌표와 World 좌표 | Parent / Child로 연결되는 계층 구조 개념을 정리했습니다.

게임 엔진은 객체를 공간 안에 배치하고, 객체들 사이의 관계를 계산하는 프로그램이라는 점도 함께 살펴봤습니다.

상용 게임 엔진을 사용하며 공부하는 경우에도 자체 엔진을 구현하면서 공부하는 경우에도
어느 순간이 되면 반드시 등장하는 개념이 하나 있습니다.

바로 Matrix, 행렬입니다.

처음 행렬을 접하면 굉장히 어렵고 복잡하게 생각될 수 있습니다.

그리고 많은 분들이 “게임 개발을 하는데 왜 수학을 해야하지?라는 생각도 많이 합니다.

또한, 아래와 같이 행렬을 직접 마주하면 더 당황하는 경우도 많습니다.

| 1 0 0 0 |
| 0 1 0 0 |
| 0 0 1 0 |
| 0 0 0 1 |

“이 숫자들이 대체 무슨 의미지?”처럼 느껴질 수도 있습니다.

즉, 행렬은 단순 수학 공식이 아니라, 게임 공간을 효율적으로 계산하기 위해 등장한 구조입니다.

그리고 지금까지 살펴본 대부분의 Transform 개념들은 행렬과 연결됩니다.

저 4×4 행렬에 위치, 회전, 스케일 정보가 모두 담겨 있습니다.

이번 글에서는 왜 게임 엔진에서 행렬이 등장하게 되었는지,
그리고 왜 대부분의 엔진들이 결국 행렬 기반으로 공간 계산을 수행하는지를 정리해보려고 합니다.


게임 엔진은 계속 좌표를 계산해야 한다

게임 안의 객체들은 끊임없이 움직입니다. 즉각적인 피드백을 위해서는 객체가 화면에서 움직여야 합니다.

플레이어가 이동하고, 카메라가 회전하며, 몬스터가 방향을 바꾸고, 무기가 손 위치를 따라 움직입니다.

게임 엔진은 결국 객체들의 위치와 방향을 계속 계산하는 프로그램이라고 할 수 있습니다.

아래와 같은 상황은 게임에서 빈번하게 발생합니다.

  • 객체를 오른쪽으로 이동시키고 싶다
  • 객체를 회전시키고 싶다
  • 객체 크기를 확대하고 싶다
  • 부모 좌표 기준으로 자식 위치를 계산하고 싶다

문제는 이런 계산들이 생각보다 굉장히 자주 발생한다는 점입니다.

그리고 게임 안에는 이런 객체들이 수십 개가 아니라, 수천 개 이상 존재할 수도 있습니다.

그래서 게임 엔진은 공간 계산을 굉장히 효율적으로 처리할 필요가 생기기 시작했습니다.


처음에는 단순 계산으로 처리할 수도 있다

객체를 단순히 오른쪽으로 이동시키고 싶다면 아래처럼 계산할 수 있습니다.

position.x += 10;

굉장히 직관적입니다. 회전 역시 단순 값 변경처럼 보일 수도 있습니다.

rotation.y += 90;

이런 방식으로 충분해 보입니다. 하지만 문제가 점점 복잡해지기 시작합니다.

예를 들어 이동, 회전, 크기 변경을 동시에 처리해야하고,
심지어 부모 객체 Transform | Local → World 변환 | 카메라 공간 변환 같은 계산까지 처리해야하는 경우도 빈번하게 발생할 수 있습니다.

즉, 좌표 계산이 점점 복잡해집니다.


회전 계산은 생각보다 굉장히 복잡하다

특히 회전 계산은 생각보다 훨씬 복잡합니다.

객체를 단순히 이동시키는 것은 좌표를 더하거나 빼는 수준으로 처리할 수 있습니다.

하지만 회전은 다릅니다.

객체를 특정 축 기준으로 회전시키기 시작하면 좌표 자체가 함께 변하기 시작합니다.

x 값, y 값, z 값이 서로 영향을 주기 시작합니다.

아래와 같은 다양한 상황이 섞이기 시작하면, 단순 계산 만으로는 처리하기 굉장히 어려워집니다.

  • 여러 축 회전
  • 부모 회전
  • 카메라 회전

그래서 등장한 것이 행렬(Matrix)이다

행렬은 결국 “공간 변환 계산을 효율적으로 처리하기 위한 구조”라고 볼 수 있습니다.

  • 이동(Translation)
  • 회전(Rotation)
  • 크기 변경(Scale)

같은 변환들을 하나의 형태로 표현할 수 있습니다.

그리고 이런 변환들을 서로 결합할 수도 있습니다.

행렬은 단순 수학 공식이라기보다, Transform 계산을 체계적으로 처리하기 위한 도구입니다.


게임 엔진은 결국 Transform를 계속 변환한다

게임 엔진에서 계속 발생하는 작업들을 생각해보면 결국 대부분 “좌표 변환”입니다.

  • Local 좌표를 World 좌표로 변환하거나
  • 객체를 회전시키거나
  • 카메라 기준 공간으로 변환하거나
  • 화면 좌표로 변환합니다.

즉, 게임 엔진은 결국 계속 변환을 수행하는 프로그램입니다.

그리고 이런 변환들을 효율적으로 처리하기 위해 행렬 구조가 등장하게 됩니다.


행렬은 여러 변환을 하나로 묶을 수 있다

행렬의 굉장히 중요한 특징 중 하나는 여러 Transform 계산을 하나로 결합할 수 있다는 점입니다.

  • 이동하고
  • 회전하고
  • 크기까지 변경된다면,

각 계산을 따로 수행할 수도 있습니다.

하지만 행렬을 사용하면 이런 변환들을 하나의 행렬로 결합할 수 있습니다.

이를 통해 Transform 계산을 훨씬 체계적으로 관리할 수 있습니다.

이 부분이 굉장히 중요합니다.

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


Local 좌표와 World 좌표도 결국 행렬 계산이다

이전 글에서 Local 좌표와 World 좌표 개념을 설명했습니다.

예를 들어 부모 객체 위치가 ( 100, 0, 0 ) 이고

{ 100, 0, 0 }

자식 객체 Local Position이 ( 10, 0, 0 ) 이라면

{ 10, 0, 0 }

최종 World Position은 ( 110, 0, 0 )으로 계산됩니다.

{ 110, 0, 0 }

단순 덧셈처럼 보일 수도 있지만 회전, 크기 변경, 여러 계층 구조가 함께 등장하기 시작하면 계산이 급격히 복잡해집니다.

그리고 이런 계산들을 안정적으로 처리하기 위해 게임 엔진들은 결국 행렬 기반 구조를 사용하게 됩니다.


유니티와 언리얼 엔진도 결국 행렬을 사용한다

유니티와 언리얼 엔진 역시 결국 내부적으로는 행렬 기반 계산을 사용한다는 점입니다.

유니티의 Transform 컴포넌트도 내부에서 행렬 계산으로 변환을 처리합니다.

언리얼 엔진 역시 FTransform, FMatrix 같은 구조를 적극적으로 사용합니다.

엔진마다 API는 다를 수 있지만, 결국 대부분의 게임 엔진들은 행렬 기반으로 공간 계산을 수행합니다.


행렬은 단순 수학이 아니라 공간 계산 도구다

행렬을 처음 배우면 수학 공식처럼 느껴질 수 있습니다.

하지만 실제 게임 엔진 안에서 행렬은 결국 공간 계산을 효율적으로 처리하기 위해 등장했다는 것을 알게됩니다.

행렬은 단순 시험용 수학 개념이 아니라, 게임 공간을 계산하기 위한 실용적인 도구에 가깝습니다.

그리고 이 것을 이해하면 게임 엔진에서 Matrix 개념이 등장한 이유와 우리가 행렬을 학습할 이유가 이해될 겁니다.


최근 게임 엔진은 행렬 계산 최적화도 굉장히 중요하게 보기 시작했다

또한, 최근 게임 엔진들은 Transform 계산 자체를 굉장히 중요하게 보기 시작했습니다.

최근 게임들의 규모가 커졌기 때문입니다. 규모가 커짐에 따라 계산해야 하는 변환의 양이 대폭 증가했습니다.

  • 수많은 객체
  • 복잡한 계층 구조
  • 대규모 Scene

기본적으로 처리해야 하는 계산량이 많이 졌기 때문에 효율을 더 중요하시기 시작했습니다.

그리고 이 과정에서 CPU 관점에서 빠르게 처리할 수 있는 방향으로 많은 개념들이 등장하고 적용되기 시작했습니다.

  • Cache 효율
  • SIMD
  • ECS
  • Data Oriented Design

최근 게임 엔진 구조는 점점 “Transform를 어떻게 표현할 것인가”뿐만 아니라,
“행렬 계산을 어떻게 더 효율적으로 처리할 것인가”도 중요하게 고려합니다.


결국 행렬은 게임 공간을 계산하기 위해 등장했다

행렬이 어렵고 추상적으로 느껴질 수도 있습니다.

하지만 지금까지 설명했던 내용들을 살펴보면, 행렬은 게임 공간을 체계적으로 계산하기 위해 등장했다는 것을 알게됩니다.

객체를 이동시키고, 회전시키고, 부모/자식 관계를 계산하고, 카메라 공간으로 변환하는 과정들이 결국 모두 행렬과 연관되어 있습니다.

행렬은 단순한 수학 공식이나 개념이 아니라, 게임 엔진이 공간을 표현하고 계산하기 위해 사용하는 핵심 도구 중 하나입니다.


마무리

게임 엔진을 공부하다 보면 행렬이라는 단어를 정말 자주 접하게 됩니다.

행렬이 어렵고 복잡하게 느껴질 수도 있습니다.

제 블로그에서 다루는 다양한 주제와 마찬가지로 결국 행렬도 어떤 문제가 있었고, 그 문제를 잘 해결하려는 고민의 결과입니다.

게임 엔진은 가상 공간에 물체를 배치해 관리하는 프로그램이고, 이 공간을 어떻게 효율적으로 계산할지 여부가 매우 중요한 문제였습니다.

이 과정에서 행렬은 게임 엔진, 그리고 게임에 너무나 적합한 도구였습니다.

이런 고민의 과정과 이유의 궤적을 잘 따라가면서 이해하면,
왜 대부분의 게임 엔진들이 행렬 기반으로 공간 계산을 처리하는지 그 이유가 이해되실 겁니다.


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

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

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

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

댓글 남기기

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