이전 글에서는 외적(Cross Product)이 왜 중요한지를 정리해보았습니다.
특히 외적을 이용해 법선 벡터(Normal Vector)를 계산하는 방법과,
카메라 좌표계를 구성하는 방식, 그리고 회전 방향 계산에 어떻게 활용되는지를 함께 살펴보았습니다.
이번에는 게임 수학에서 가장 중요한 개념 중 하나인 행렬(Matrix)을 살펴보려고 합니다.
게임 개발을 공부하다 보면 어느 순간부터 벡터만으로는 설명하기 어려운 문제들이 등장하기 시작합니다.
객체를 이동시키고 회전시키는 것까지는 어느 정도 이해가 되지만,
여러 트랜스폼(Transform)이 동시에 적용되기 시작하면 공간 계산이 갑자기 복잡해지기 때문입니다.
예를 들어 어떤 객체를 회전시킨 뒤 이동시키는 경우와,
먼저 이동한 뒤 회전시키는 경우는 결과가 완전히 달라질 수 있습니다.
카메라 역시 단순 위치 계산만으로는 충분하지 않습니다.카메라 기준 좌표계를 계산해야 하고,
최종적으로는 3D 공간을 화면 공간(Screen Space)으로 변환하는 과정까지 필요해집니다.
그리고 바로 이런 공간 변환을 처리하기 위해 행렬(Matrix)이 사용됩니다.
특히 게임 개발에서는 객체를 이동시키고 회전시키는 과정뿐 아니라,
카메라 좌표계를 계산하고 3D 공간을 화면에 렌더링하는 과정 전체가 대부분 행렬 기반으로 동작합니다.
그래서 게임 개발을 공부하다 보면 아래와 같은 다양한 행렬들이 계속 등장하게 됩니다.
- 이동 변환 행렬(Translation Matrix)
- 회전 변환 행렬(Rotation Matrix)
- 크기 변환 행렬(Scale Matrix)
- 뷰 행렬(View Matrix)
- 투영 행렬(Projection Matrix)
그리고 이런 행렬들은 단순히 각각 따로 존재하는 개념이 아닙니다.
실제로는 렌더링 파이프라인(Rendering Pipeline) 안에서 순차적으로 적용되면서,
3D 공간의 객체를 최종 화면(Screen Space)까지 변환하는 과정 전체를 담당하게 됩니다.

예를 들어 객체는 먼저 크기와 회전, 이동 변환을 거쳐 월드 공간(World Space)으로 배치됩니다.
그 다음에는 카메라 기준 좌표계(View Space)로 변환되고,
마지막으로 투영 행렬(Projection Matrix)을 통해 2D 화면 공간으로 변환됩니다.
즉, 객체의 위치와 방향, 카메라 시점, 그리고 최종 화면 출력까지
게임 공간 전체를 변환하는 과정이 대부분 행렬 계산을 통해 처리된다고 할 수 있습니다.
행렬(Matrix)은 공간 변환을 계산하는 핵심 개념
게임 개발에서 행렬(Matrix)은 굉장히 중요한 수학 개념 중 하나입니다.
특히 3D 게임 개발로 넘어가면 대부분의 공간 계산이 행렬 기반으로 이루어지기 시작합니다.
게임 안에서는 객체를 계속 이동시키고 회전시키며, 크기를 변경해야 합니다.
캐릭터가 움직이면 위치(Position)가 바뀌고, 카메라가 회전하면 바라보는 방향 역시 계속 변경됩니다.
애니메이션이 재생되는 동안에는 캐릭터 뼈(Bone)의 Transform도 매 프레임 변경됩니다.
문제는 이런 변환들이 단순히 독립적으로 발생하지 않는다는 점입니다.
예를 들어 어떤 객체를 먼저 회전시킨 뒤 이동시키는 경우와,
먼저 이동시킨 뒤 회전시키는 경우는 최종 결과가 완전히 달라질 수 있습니다.
부모 객체가 이동했을 때 자식 객체 위치 역시 함께 이동해야 합니다.
그리고 이런 복잡한 공간 계산을 안정적으로 처리하는 과정에서 행렬(Matrix)이 사용됩니다.
예를 들어 캐릭터를 오른쪽으로 이동시키거나,
카메라를 회전시키는 작업 역시 내부적으로는 대부분 행렬 계산으로 처리됩니다.
게임 엔진 안에서는 객체 위치와 방향,
크기 정보가 계속 변경되기 때문에 행렬 계산 역시 거의 매 프레임 반복적으로 수행됩니다.
결국 행렬은 게임 안의 공간 변화를 계산하는 핵심 개념이라고 할 수 있습니다.
Transform과 공간 변환
게임 엔진에서 다루는 가상 공간에 배치된 모든 게임 객체는 모두 Transform 정보를 가집니다.
객체가 현재 어디에 존재하는지,
어느 방향을 바라보고 있는지,
그리고 얼마나 크거나 작은지를 계속 관리해야 하기 때문입니다.
예를 들어 플레이어 캐릭터는 위치(Position)와 회전(Rotation), 크기(Scale) 정보를 가지고 있습니다.
그리고 게임이 실행되는 동안 이 값들은 계속 변경됩니다.
캐릭터가 이동하면 위치가 바뀌고, 카메라가 회전하면 바라보는 방향 역시 변경됩니다.
애니메이션이 재생되는 동안에는 캐릭터 뼈(Bone)의 Transform 역시 매 프레임 계속 변경됩니다.
특히 부모-자식 관계(Hierarchy)를 가진 객체들은 서로 영향을 주면서 함께 움직입니다.
예를 들어 플레이어 손에 무기를 장착한 경우, 플레이어가 회전하면 무기 역시 함께 회전해야 합니다.
캐릭터 팔 애니메이션이 재생되면 손 위치가 변경되고, 그 결과 무기 위치 역시 함께 변경되어야 합니다.
즉, 게임 엔진 안에서는 단순히 객체 하나만 움직이는 것이 아니라,
여러 Transform이 서로 연결된 상태로 계속 계산되고 있는 것입니다.
그리고 이런 복잡한 공간 변환 관계를 안정적으로 계산하기 위해 행렬(Matrix)이 사용됩니다.
행렬을 사용하면 이동과 회전, 크기 변환 같은 여러 Transform를 하나의 계산 과정으로 결합할 수 있습니다.
또한 부모-자식 관계(Hierarchy)를 가진 객체들의 공간 변환 역시 일관된 방식으로 계산할 수 있게 됩니다.
행렬을 활용한 여러 변환의 결합
행렬(Matrix)이 중요한 이유 중 하나는 여러 공간 변환(Transform)을 결합할 수 있다는 점입니다.
게임 안의 객체는 여러 변환이 복합적으로 처리되어야 합니다.
크기가 변경되기도 하고, 회전하기도 하며, 위치 역시 계속 변경됩니다.
어떤 캐릭터가 있다고 가정해보겠습니다.
캐릭터 크기를 확대하고, 특정 방향으로 회전시킨 뒤, 맵 안의 원하는 위치로 이동시켜야 할 수 있습니다.
이런 작업들을 각각 따로 계산할 수도 있지만, 게임 엔진에서는 대부분 하나의 행렬(Matrix)로 합쳐서 처리합니다.
예를 들어 아래와 같이 사용할 수 있습니다.
Matrix world = scaleMatrix * rotationMatrix * translationMatrix;
위 코드에서는 크기 변환(Scale)과 회전(Rotation),
이동(Translation) 변환 정보를 하나의 World Matrix로 결합하고 있습니다.
그리고 이렇게 만들어진 최종 행렬(World Matrix)을 이용하면
객체 위치와 방향, 크기 변환을 한 번에 계산할 수 있습니다.
특히 게임 엔진 안에서는 이런 Transform 계산이 거의 모든 객체에 대해 반복적으로 수행됩니다.
캐릭터와 카메라, 애니메이션 Bone, 파티클, UI 같은 다양한 시스템 역시 대부분 행렬 기반 Transform 계산 위에서 동작합니다.
결국 행렬은 복잡한 공간 변환 관계를 효율적으로 관리하고 계산하는 핵심 개념이라고 할 수 있습니다.
곱셈의 순서가 중요
행렬(Matrix)을 사용할 때는 곱셈의 순서가 중요합니다.
일반 숫자 간의 곱셈과는 달리 행렬은 일반적인 경우에 곱셈의 교환 법칙이 성립하지 않습니다.
따라서 행렬은 어떤 순서로 곱하느냐에 따라 최종 결과가 완전히 달라질 수 있습니다.
예를 들어 아래 두 계산은 서로 다른 결과를 만들어냅니다.
A * B B * A
이 특징은 게임 엔진의 Transform 계산에서도 그대로 이어집니다.
특히 이동(Translation)과 회전(Rotation),
크기 변경(Scale) 같은 Transform은 적용 순서에 따라 최종 위치와 방향이 달라질 수 있습니다.
예를 들어 어떤 객체를 먼저 회전시킨 뒤 이동시키는 경우와,
먼저 이동한 뒤 회전시키는 경우는 서로 다른 결과를 만들어냅니다.
회전을 먼저 적용하면 객체는 자신의 원점을 기준으로 회전한 뒤 이동하게 됩니다.
반대로 이동을 먼저 적용하면 객체가 월드 공간의 다른 위치로 이동한 뒤 회전하게 되므로,
최종 위치와 방향이 달라질 수 있습니다.
부모 객체 Transform가 먼저 적용되는지,
자식 객체 Transform가 먼저 적용되는지 역시 결과에 큰 영향을 주게 됩니다.
특히 계층 구조(Hierarchy)를 가진 객체들은 부모 좌표계 영향을 계속 받기 때문에,
Transform 순서를 잘못 처리하면 객체가 예상과 다르게 움직이는 문제가 발생할 수 있습니다.
실제로 3D 게임 개발에서는 Transform 순서 문제 때문에 예상하지 못한 문제가 굉장히 자주 발생합니다.
예를 들어 객체 회전 방향이 갑자기 뒤틀리거나, 카메라 움직임이 어색하게 동작하는 경우가 발생할 수 있습니다.
애니메이션 Bone Transform 계산이 잘못되어 캐릭터 팔이나 손 위치가 비정상적으로 움직이는 문제 역시 자주 발생합니다.
그리고 바로 이런 복잡한 공간 변환 관계를 안정적으로 계산하기 위해 게임 엔진에서는 행렬 곱셈 순서를 매우 중요하게 관리합니다.
카메라 시스템 역시 행렬 기반
게임 카메라 역시 행렬(Matrix) 기반으로 처리됩니다.
게임 화면에 어떤 객체를 렌더링하려면 단순히 객체 위치만 계산해서는 충분하지 않습니다.
현재 카메라가 어디에 존재하는지,
어느 방향을 바라보고 있는지에 따라 객체가 화면에서 어떻게 보일지가 달라지기 때문입니다.
즉, 같은 객체라고 하더라도 카메라 위치와 방향이 바뀌면 화면에 보이는 결과 역시 완전히 달라질 수 있습니다.
그래서 렌더링 과정에서는 객체 위치를 카메라 기준 좌표계로 변환하는 과정이 필요합니다.
또한 최종적으로는 3D 공간 좌표를 2D 화면(Screen Space)으로 투영(Projection)하는 과정까지 처리해야 합니다.
그리고 이런 공간 변환 과정에서 다양한 행렬(Matrix)이 함께 사용됩니다.
예를 들어 World Matrix는 객체를 월드 공간(World Space)에 배치하는 데 사용됩니다.
그 다음에는 View Matrix를 이용해 객체 위치를 카메라 기준 좌표계(View Space)로 변환하게 됩니다.
마지막으로 Projection Matrix를 이용해 3D 공간을 화면 좌표(Screen Space)로 투영하게 됩니다.

즉, 게임 엔진의 렌더링 파이프라인(Rendering Pipeline)은 여러 행렬 변환이 순차적으로 적용되면서 동작합니다.
결국 카메라 시스템 역시 행렬을 기반으로 공간을 변환하는 전체 과정 위에서 동작합니다.
스켈레탈 애니메이션 역시 행렬 기반
게임 캐릭터 애니메이션 역시 행렬(Matrix) 기반으로 처리됩니다.
특히 3D 캐릭터 애니메이션에서는 본(Bone) Transform을 계속 계산해야 합니다.
예를 들어 캐릭터가 팔을 움직이는 경우를 생각해보겠습니다.
어깨 Bone이 회전하면 팔 Bone 위치 역시 함께 변경되어야 하고,
팔 Bone이 움직이면 손 Bone 위치도 함께 변경되어야 합니다.
즉, 캐릭터의 각 Bone들은 서로 독립적으로 움직이는 것이 아니라,
부모-자식 관계(Hierarchy)로 연결된 상태에서 함께 영향을 주고받게 됩니다.
그리고 이런 구조에서는 부모 Bone Transform이 변경될 때 자식 Bone Transform 역시 함께 다시 계산되어야 합니다.
예를 들어 캐릭터 몸통이 회전하면 팔과 손, 손가락 위치까지 모두 함께 변경되어야 합니다.
애니메이션이 재생되는 동안 이런 Transform 계산은 매 프레임마다 반복적으로 수행됩니다.
그리고 바로 이 과정에서 행렬 곱셈(Matrix Multiplication)이 계속 사용됩니다.
부모 Bone 행렬과 자식 Bone 행렬을 순차적으로 결합하면서 최종 Bone Transform을 계산하게 되는 것입니다.
실제로 스켈레탈 애니메이션(Skeletal Animation) 시스템은 계층 구조와 Transform 계산,
그리고 행렬 곱셈을 중심으로 동작합니다.
각 Bone은 부모 Bone과 연결되어 있으며,
애니메이션이 재생되는 동안 부모 Transform과 자식 Transform이 계속 결합되면서 최종 자세(Pose)가 계산됩니다.
그리고 이 과정 전체가 대부분 행렬 기반 계산 위에서 이루어지게 됩니다.
결국 행렬은 캐릭터 애니메이션 시스템에서도 핵심 역할을 담당한다고 할 수 있습니다.
마무리
행렬(Matrix)은 게임 안의 공간을 변환하기 위한 핵심 수학 개념입니다.
게임 엔진 안에서는 객체 이동과 회전,
카메라 처리, 애니메이션, 렌더링 등 다양한 시스템들이 모두 행렬 기반으로 동작합니다.
특히 여러 Transform을 안정적으로 합치고,
복잡한 공간 변환을 처리하기 위해 행렬은 필수적입니다.
따라서 게임 수학과 게임 엔진 구조를 이해하기 위해서는 반드시 행렬 개념에 익숙해져야 합니다.
다음 글에서는 이동(Translation) 행렬이 실제로 어떻게 동작하는지,
그리고 게임 안에서 객체 위치를 어떻게 이동시키는지를 이어서 정리해보겠습니다.