이전 글에서는 행렬(Matrix)이 왜 중요한지를 정리해보았습니다.
특히 게임 엔진 안에서 객체 이동과 회전, 카메라 처리, 렌더링 파이프라인, 스켈레탈 애니메이션 같은 다양한 시스템들이 모두 행렬 기반으로 동작한다는 점을 함께 살펴보았습니다.
이번에는 가장 기본적인 행렬 중 하나인 이동 변환 행렬(Translation Matrix)을 정리해보려고 합니다.
게임 안에서는 객체 위치가 계속 변경됩니다.
캐릭터가 앞으로 걸어가고, 총알이 발사되며, 카메라 역시 플레이어 움직임에 따라 계속 이동합니다.
그리고 이런 위치 변경은 대부분 이동 변환(Translation Transform)을 통해 처리됩니다.
객체 이동은 위치를 변경하는 과정
게임 안에서 객체를 이동시킨다는 것은 결국 위치(Position) 값을 변경하는 과정입니다.
예를 들어 어떤 객체가 아래 위치에 존재한다고 가정해보겠습니다.
Vector3 position = { 3.0f, 2.0f, 1.0f };
이 상태에서 X축 방향으로 5만큼 이동하면 새로운 위치는 아래처럼 변경됩니다.
Vector3 position = { 8.0f, 2.0f, 1.0f };
처음에는 단순히 위치 값에 숫자를 더하는 계산처럼 보일 수 있습니다.
하지만 실제 게임 엔진 안에서는 객체 하나만 독립적으로 움직이는 경우보다 여러 객체가 서로 연결된 상태로 함께 이동하는 경우가 훨씬 많습니다.
예를 들어 플레이어가 이동하면 손에 들린 무기 위치 역시 함께 이동해야 합니다.
차량 위에 올라탄 캐릭터 역시 차량 이동 영향을 함께 받아야 합니다.
즉, 게임 엔진 안에서는 단순 Position 변경보다 훨씬 복잡한 공간 변환 계산이 계속 발생하게 됩니다.
그리고 이런 공간 변환 관계를 안정적으로 계산하는 과정에서 이동 변환 행렬(Translation Matrix)이 사용됩니다.
이동 변환 행렬
이동 변환 행렬(Translation Matrix)은 객체 위치를 특정 방향으로 이동시키기 위해 사용됩니다.
특히 3D 그래픽스에서는 대부분 4×4 행렬 형태를 사용하게 됩니다.
예를 들어 아래와 같은 이동 변환 행렬이 있다고 가정해보겠습니다.
| 1 0 0 tx | | 0 1 0 ty | | 0 0 1 tz | | 0 0 0 1 |
여기서 tx는 X축 이동량, ty는 Y축 이동량, tz는 Z축 이동량을 의미합니다.
즉, 객체 위치에 이동값을 추가하는 역할을 담당하게 됩니다.
예를 들어 X축 방향으로 5만큼 이동하고 싶다면 tx 위치에 5가 들어가게 됩니다.
그리고 이렇게 만들어진 이동 행렬은 위치 벡터와 곱해지면서 최종 위치를 계산하게 됩니다.
게임 엔진 안에서는 이런 이동 계산이 거의 모든 객체에 대해 반복적으로 수행됩니다.
4×4 행렬을 사용하는 이유
처음 이동 행렬을 보면 많은 개발자들이 의문을 가지게 됩니다.
단순 위치 이동인데 왜 굳이 4×4 행렬까지 사용하는 것일까 하는 점입니다.
이유는 이동(Translation) 역시 회전(Rotation)과 크기 변경(Scale)처럼 동일한 행렬 연산 체계 안에서 함께 처리하기 위해서입니다.
특히 3D 그래픽스에서는 이동과 회전, 크기 변경을 모두 동일한 방식으로 계산하는 것이 굉장히 중요합니다.
그리고 이 과정에서 동차 좌표(Homogeneous Coordinate) 개념이 사용됩니다.
예를 들어 일반적인 3D 위치 벡터는 아래처럼 표현됩니다.
Vector3 position = { x, y, z };
하지만 행렬 계산에서는 보통 아래처럼 w 값을 추가한 4차원 형태로 변환해서 사용합니다.
Vector4 position = { x, y, z, 1.0f };
그리고 바로 이 w 값 덕분에 이동 변환 역시 행렬 곱셈 하나로 함께 처리할 수 있게 됩니다.
즉, 4×4 행렬 구조는 이동과 회전, 크기 변경 같은 다양한 공간 변환을 하나의 계산 체계 안에서 통합하기 위해 사용된다고 볼 수 있습니다.
게임 엔진에서 이동 행렬을 사용하는 이유
게임 엔진 안에서는 객체 위치가 계속 변경됩니다.
캐릭터가 이동하고, 카메라가 움직이며, 파티클과 투사체 역시 계속 위치를 변경하게 됩니다.
특히 부모-자식 관계(Hierarchy)를 가진 객체들은 이동 결과가 서로 연결된 상태로 계산됩니다.
예를 들어 플레이어가 이동하면 손에 들린 무기 위치 역시 함께 변경되어야 합니다.
차량이 이동하면 차량 위에 올라탄 캐릭터 위치 역시 함께 변경되어야 합니다.
즉, 게임 엔진 안에서는 단순히 객체 하나만 이동하는 것이 아니라 여러 공간 변환 관계가 동시에 연결된 상태로 계산되고 있는 셈입니다.
그리고 바로 이런 공간 변환 계산 중심에서 이동 행렬이 핵심 역할을 담당하게 됩니다.
카메라 이동 역시 이동 행렬 기반
카메라 시스템 역시 이동 행렬을 굉장히 자주 사용합니다.
예를 들어 FPS 카메라에서는 플레이어 움직임에 따라 카메라 위치 역시 계속 변경되어야 합니다.
특히 카메라가 앞으로 이동하거나 좌우로 이동할 때는 카메라 위치 Transform를 계속 갱신해야 합니다.
그리고 이런 이동 역시 내부적으로는 대부분 이동 행렬 기반으로 처리됩니다.
또한 View Matrix 역시 결국 카메라 위치와 방향 정보를 기반으로 계산됩니다.
즉, 이동 행렬은 단순 오브젝트 이동뿐 아니라 카메라 시스템 전체에서도 매우 중요한 역할을 담당하게 됩니다.
이동 행렬은 공간 계산의 출발점
흥미로운 점은 게임 안의 거의 모든 객체가 결국 위치(Position) 정보를 가지고 있다는 점입니다.
객체가 월드 공간(World Space)의 어디에 존재하는지를 계산하려면 반드시 위치 정보가 필요하기 때문입니다.
그리고 이 위치 정보는 대부분 이동 행렬(Translation Matrix)을 통해 처리됩니다.
특히 게임 엔진 안에서는 객체 배치와 카메라 이동, 애니메이션, 렌더링, 물리 처리 같은 다양한 시스템들이 모두 위치 계산과 연결됩니다.
결국 이동 행렬은 게임 엔진 안에서 공간 계산 전체를 구성하는 가장 기본적인 행렬 중 하나라고 볼 수 있습니다.
마무리
이동 변환 행렬(Translation Matrix)은 객체 위치를 변경하기 위해 사용되는 가장 기본적인 행렬 중 하나입니다.
게임 엔진 안에서는 객체 이동과 카메라 처리, 애니메이션, 렌더링 같은 다양한 시스템들이 모두 이동 Transform과 연관되어 있습니다.
특히 4×4 행렬 구조와 동차 좌표(Homogeneous Coordinate)를 이용하면 이동 역시 행렬 곱셈 하나로 함께 처리할 수 있게 됩니다.
따라서 이동 행렬은 게임 수학과 렌더링 파이프라인을 이해하기 위한 가장 중요한 기초 개념 중 하나라고 볼 수 있습니다.
다음 글에서는 회전 변환 행렬(Rotation Matrix)이 실제로 어떻게 동작하는지,
그리고 왜 삼각함수와 함께 사용되는지를 이어서 정리해보겠습니다.