게임 수학 시리즈 – 회전 변환 행렬

이전 글에서는 이동 변환 행렬(Translation Matrix)이 왜 중요한지를 정리해보았습니다.

객체 위치를 변경하는 과정이 단순 좌표 덧셈에서 끝나는 것이 아니라, 행렬(Matrix)을 통해 다른 공간 변환들과 함께 계산된다는 점도 함께 살펴보았습니다.

이번에는 또 다른 중요한 행렬인 회전 변환 행렬(Rotation Matrix)을 살펴보려고 합니다.

게임 안에서는 객체가 계속 이동할 뿐만 아니라 방향도 끊임없이 바뀝니다.

캐릭터는 이동 방향을 바라보고, 카메라는 플레이어 입력에 따라 회전하며, 총알과 미사일은 목표를 향해 방향을 수정합니다.

그리고 이런 회전을 수학적으로 표현하고 계산하기 위해 회전 변환 행렬(Rotation Matrix)을 사용합니다.


회전은 생각보다 복잡한 변환

객체를 이동시키는 것은 비교적 직관적입니다.

오른쪽으로 이동하고 싶다면 X 좌표에 값을 더하면 되고, 위쪽으로 이동하고 싶다면 Y 좌표에 값을 더하면 됩니다.

하지만 회전은 조금 다릅니다.

예를 들어 어떤 객체를 90도 회전시키고 싶다고 해서 X 좌표나 Y 좌표에 단순히 숫자를 더하는 방식으로는 원하는 결과를 얻을 수 없습니다.

회전이 발생하면 객체의 방향 자체가 바뀌고, 좌표들 사이의 관계도 함께 변경되기 때문입니다.

특히 회전 전에는 X축 방향을 향하던 벡터가 회전 후에는 전혀 다른 방향을 향하게 됩니다.

회전은 단순한 위치 변경이 아니라 방향과 좌표계를 함께 변경하는 공간 변환입니다.

또한 회전 계산에서는 삼각함수와 행렬(Matrix)이 함께 등장하게 됩니다.


회전 계산과 삼각함수

앞서 삼각함수 시리즈에서 cos와 sin이 방향 계산에 사용된다는 점을 살펴보았습니다.

단위원(Unit Circle) 위의 한 점을 생각해보면 각도 θ에 대한 좌표는 아래와 같이 표현할 수 있습니다.

(cosθ, sinθ)

즉, cos는 X축 방향 성분을 의미하고 sin은 Y축 방향 성분을 의미합니다.

그래서 삼각함수는 단순히 삼각형 문제를 풀기 위한 도구가 아니라, 특정 방향을 수치로 표현하기 위한 도구라고 할 수 있습니다.

회전 역시 결국 방향을 변경하는 과정입니다.

그래서 회전 계산을 수학적으로 표현하려면 자연스럽게 cos와 sin이 등장하게 됩니다.

실제로 2D 공간에서 어떤 점을 θ만큼 회전시키면 아래와 같은 공식이 만들어집니다.

x' = x * cos(θ) - y * sin(θ)

y' = x * sin(θ) + y * cos(θ)

이 공식은 회전 후의 새로운 좌표를 계산하는 식입니다.

그리고 이 식을 행렬 형태로 정리한 것이 바로 회전 변환 행렬입니다.


회전 행렬은 어떻게 만들어질까

회전 행렬을 처음 접하면 많은 개발자들이 cos와 sin 위치를 암기하려고 합니다.

하지만 원리를 이해하면 훨씬 쉽게 기억할 수 있습니다.

먼저 x축 방향 기저 벡터 (1, 0)을 생각해보겠습니다.

이 벡터를 θ만큼 회전시키면 단위원 위에서 아래와 같은 좌표를 얻을 수 있습니다.

(cosθ, sinθ)

이번에는 y축 방향 기저 벡터 (0, 1)을 동일하게 θ만큼 회전시켜보겠습니다.

회전된 결과는 아래와 같습니다.

(-sinθ, cosθ)

회전이 발생한 이후에도 두 축은 서로 직교 상태를 유지해야 하고, 각 축의 길이 역시 변하지 않아야 합니다.

그래서 회전된 x축과 y축은 위와 같은 형태를 가지게 됩니다.

DirectX에서 주로 사용하는 행 벡터(Row Vector) 기준으로 생각하면, 이렇게 회전된 기저 축 정보를 이용해 아래와 같은 회전 행렬을 만들 수 있습니다.

|  cos(θ)  sin(θ) |
| -sin(θ)  cos(θ) |

즉, 회전 행렬은 갑자기 등장한 공식이 아니라 회전된 기저 벡터를 행렬 형태로 정리한 결과라고 볼 수 있습니다.

이 원리를 이해하면 시간이 지나도 cos와 sin 위치를 훨씬 쉽게 기억할 수 있습니다.

DirectX 행 벡터(Row Vector) 기준으로 회전 행렬(Rotation Matrix)이 만들어지는 과정을 설명하는 게임 수학 이미지
x축과 y축 기저 벡터를 회전시켜 회전 행렬을 만드는 과정을 설명한 이미지입니다. DirectX의 행 벡터(Row Vector) 기준으로 회전 행렬이 어떻게 구성되는지 시각적으로 보여줍니다.

2D 회전 행렬

2D 공간에서 사용하는 회전 행렬은 아래와 같습니다.

|  cos(θ)   sin(θ) |
| -sin(θ)   cos(θ) |

회전하려는 벡터와 이 행렬을 곱하면 회전된 결과를 얻을 수 있습니다.

예를 들어 오른쪽 방향을 의미하는 벡터 (1, 0)을 90도 회전시키면 위쪽 방향 벡터 (0, 1)을 얻을 수 있습니다.

중요한 점은 회전 이후에도 벡터 길이는 그대로 유지된다는 것입니다.

회전은 방향만 변경할 뿐 크기 자체는 변경하지 않습니다.

그래서 회전 행렬은 객체 모양을 유지한 상태에서 방향만 변경하는 역할을 담당합니다.

2D 회전 행렬을 이용해 벡터를 회전시키는 과정과 길이 보존 특성을 설명하는 게임 수학 이미지
2D 회전 행렬을 이용해 벡터를 회전시키는 과정과 회전 전후 길이가 유지되는 특성을 설명하는 예제 이미지입니다.

3D 회전과 회전 축

2D 공간에서는 회전이 비교적 단순합니다.

평면 위에서는 하나의 축을 기준으로만 회전이 발생하기 때문입니다.

예를 들어 2D 게임에서 캐릭터가 방향을 바꾸는 경우에는 화면에 수직인 축을 기준으로 회전한다고 생각할 수 있습니다.

하지만 3D 공간에서는 상황이 훨씬 복잡해집니다.

3D 공간에는 X축과 Y축, Z축이 존재하며, 객체는 이 세 축을 기준으로 각각 회전할 수 있습니다.

예를 들어 비행기를 생각해보겠습니다.

비행기가 고개를 위아래로 드는 동작은 X축을 기준으로 회전하는 경우에 해당합니다.

반대로 좌우로 방향을 바꾸는 동작은 Y축 회전과 관련이 있습니다.

또한 비행기가 한쪽 날개를 아래로 기울이는 동작은 Z축 회전으로 표현할 수 있습니다.

그래서 3D 그래픽스에서는 하나의 회전 행렬만 사용하는 것이 아니라
X축 회전 행렬(Rotation X), Y축 회전 행렬(Rotation Y), Z축 회전 행렬(Rotation Z)을 각각 따로 정의합니다.

그리고 필요에 따라 여러 회전을 조합해서 최종 방향을 계산합니다.

흥미로운 점은 회전 순서에 따라 결과가 달라질 수 있다는 것입니다.

예를 들어 먼저 X축으로 회전한 뒤 Y축으로 회전하는 경우와, 먼저 Y축으로 회전한 뒤 X축으로 회전하는 경우는 서로 다른 방향을 만들 수 있습니다.

이 때문에 3D 회전은 단순히 각도를 더하는 문제가 아니라 회전 순서까지 함께 고려해야 하는 복잡한 공간 변환 문제가 됩니다.

실제 게임 엔진에서도 이러한 개념을 바탕으로 Yaw, Pitch, Roll이라는 표현을 자주 사용합니다.

Yaw는 좌우 방향 전환을 의미하고, Pitch는 위아래 시선 변경을 의미합니다.

그리고 Roll은 객체가 한쪽으로 기울어지는 회전을 의미합니다.

특히 FPS 카메라나 비행기 시뮬레이션 게임에서는 이러한 회전 개념이 매우 중요하게 사용됩니다.

또한 DirectX는 기본적으로 왼손 좌표계(Left-Handed Coordinate System)를 사용합니다.

따라서 같은 회전 행렬이라도 OpenGL이나 수학 교재에서 사용하는 오른손 좌표계 설명과 회전 방향이 다르게 보일 수 있습니다.

그래서 3D 회전을 공부할 때는 회전 행렬 자체뿐 아니라 현재 사용하고 있는 좌표계가 무엇인지도 함께 이해하는 것이 중요합니다.

DirectX 왼손 좌표계 기준의 3D 회전 축과 Yaw Pitch Roll 개념을 설명하는 게임 수학 이미지
3D 공간에서 사용하는 X축, Y축, Z축 회전과 Yaw, Pitch, Roll 개념을 설명하는 이미지입니다. DirectX의 왼손 좌표계를 기준으로 회전 방향과 회전 순서의 중요성을 함께 보여줍니다.

게임 엔진과 회전 계산

게임 엔진 안에서는 회전 계산이 거의 매 프레임 발생합니다.

플레이어가 마우스를 움직이면 카메라 방향이 변경되고, 적 AI는 플레이어를 바라보기 위해 계속 회전합니다.

자동차는 진행 방향에 맞춰 차체를 회전시키고, 미사일은 목표물을 추적하면서 방향을 계속 수정합니다.

애니메이션 시스템 역시 수많은 Bone Transform의 회전을 계산합니다.

즉, 게임 안에서 방향이 바뀌는 거의 모든 상황이 회전 계산과 관련이 있습니다.

그래서 회전 행렬은 게임 엔진 전체에서 매우 자주 사용되는 핵심 수학 개념 중 하나입니다.


마무리

회전 변환 행렬(Rotation Matrix)은 객체 방향을 변경하기 위해 사용하는 핵심 행렬입니다.

특히 회전 행렬은 삼각함수의 성질에서 출발하며, 회전된 기저 벡터를 행렬 형태로 표현한 결과라는 점이 중요합니다.

게임 엔진 안에서는 카메라와 AI, 애니메이션, 렌더링 시스템 등 방향이 바뀌는 거의 모든 기능이 회전 계산과 연결됩니다.

따라서 회전 행렬을 이해하는 것은 단순 수학 공식 하나를 암기하는 것이 아니라, 게임 엔진이 공간과 방향을 처리하는 방식을 이해하는 데 큰 도움이 됩니다.

다음 글에서는 X축 회전 행렬과 Y축 회전 행렬, Z축 회전 행렬이 각각 어떤 형태를 가지는지, 그리고 DirectX의 왼손 좌표계에서는 회전 방향을 어떻게 해석해야 하는지를 이어서 정리해보겠습니다.


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

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

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

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

댓글 남기기

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