게임 수학 시리즈 – 게임 개발에서 벡터 정규화가 중요한 이유

이전 글에서는 벡터(Vector)가 게임 안에서 위치와 방향을 표현하기 위해 어떻게 사용되는지를 정리해보았습니다.

하지만 실제 게임 개발에서는 단순히 방향만 계산해서는 충분하지 않은 경우가 많습니다.

예를 들어 플레이어가 이동 방향을 계산했다고 해도,
그 방향 벡터의 길이가 일정하지 않다면 이동 속도가 계속 달라질 수 있습니다.

또한 두 객체 사이의 거리를 계산하거나,
일정한 속도로 이동시키기 위해서도 벡터의 길이 개념이 필요해집니다.

그리고 바로 이 때 벡터의 길이(Length)와 정규화(Normalize) 개념이 등장합니다.


벡터는 길이를 함께 가지고 있다

벡터는 단순 방향 정보만 표현하는 구조가 아닙니다.

방향뿐 아니라 얼마나 긴 거리인지를 함께 표현합니다.

예를 들어 아래 벡터를 생각해보겠습니다.

Vector2 direction = { 3.0f, 4.0f };

이 벡터는 단순히 “오른쪽 위 방향”만 의미하는 것이 아닙니다.

X축 방향으로 3, Y축 방향으로 4만큼 이동하는 정보를 함께 가지고 있습니다.

그리고 벡터의 길이는 x² + y²의 제곱근으로 계산됩니다.

따라서 위 벡터의 길이는 3² + 4²의 제곱근 = 5입니다.

이 계산은 피타고라스 정리와 같습니다.

그리고 게임 개발에서는 이런 벡터 길이 계산이 굉장히 자주 사용됩니다.


이동 속도가 달라지는 문제가 발생한다

게임에서 캐릭터를 이동시킬 때 방향 벡터를 그대로 사용하는 경우가 많습니다.

예를 들어 아래처럼 입력 방향을 벡터로 표현할 수 있습니다.

Vector2 move = { 1.0f, 0.0f };

이 경우 캐릭터는 오른쪽으로 이동하게 됩니다.

대각선 입력이 들어오면 아래와 같이 벡터로 표현할 수 있습니다.
이 벡터를 방향 벡터로 사용해서 이동을 하면 캐릭터는 오른쪽 위 방향으로 이동하게 됩니다.

Vector2 move = { 1.0f, 1.0f };

문제는 이 상태에서는 벡터 길이가 달라진다는 점입니다.

오른쪽 이동 벡터의 길이는 1이지만, 대각선 벡터의 길이는 아래와 같이 대략 1.414로 계산됩니다.

sqrt(1 * 1 + 1 * 1) = 1.414

즉, 대각선 방향으로 이동할 때 이동 속도가 더 빨라지는 문제가 발생하게 됩니다.

실제로 게임 개발을 처음 시작하는 단계에서 굉장히 자주 발생하는 문제 중 하나입니다.


정규화(Normalize)는 길이를 1로 맞추는 과정

이 문제를 해결하기 위해 사용하는 것이 바로 정규화(Normalize)입니다.

정규화는 벡터의 방향은 유지한 상태에서 길이만 1로 맞추는 과정입니다.

예를 들어 아래의 벡터가 있다고 가정해보겠습니다.

Vector2 direction = { 3.0f, 4.0f };

이 벡터의 길이는 5입니다.

따라서 각 요소를 길이로 나누면 아래처럼 길이가 1인 벡터를 만들 수 있습니다.

(3 / 5, 4 / 5)

이렇게 정규화를 수행하면 방향은 유지하면서 벡터 길이를 항상 일정하게 유지할 수 있습니다.

벡터 정규화(Normalize)를 통해 방향은 유지하고 길이를 1로 만드는 게임 수학 예제

벡터 정규화(Normalize)는 벡터의 방향은 유지하면서 길이를 1로 만드는 과정입니다.

게임 엔진 안에서는 이동 방향 계산과 카메라 처리, 물리 계산 같은 다양한 시스템에서 정규화가 계속 사용됩니다.

또한 게임 로직에서 캐릭터를 일정한 속도로 이동시키기 위해서도 정규화가 계속 사용됩니다.


정규화는 방향 벡터를 만들기 위해 사용된다

게임 안에서는 “어디를 향하고 있는가”를 계산해야 하는 상황이 굉장히 많습니다.

예를 들어 플레이어가 적을 바라보거나, 총알이 특정 방향으로 발사되는 상황을 생각해볼 수 있습니다.

이 경우에는 방향 자체가 중요하지, 거리 정보까지 함께 필요하지 않은 경우가 많습니다.

따라서 두 객체 사이의 방향 벡터를 계산한 뒤, 정규화를 통해 길이가 1인 방향 벡터로 변환해서 사용하는 경우가 많습니다.

예를 들어 아래처럼 사용할 수 있습니다.

Vector2 direction = Normalize(enemy - player);

위 코드에서 Normalize 함수는 정규화를 통해 벡터의 길이를 1로 만들어주는 함수입니다.

이렇게 하면 플레이어 위치에서 적 방향으로 향하는 순수 방향 벡터를 얻을 수 있습니다.

그리고 이 벡터에 속도를 곱하면 일정한 속도로 이동하는 구조를 만들 수 있습니다.


게임 엔진 안에서는 정규화가 계속 사용된다

정규화는 단순 이동 처리에서만 사용되는 개념이 아닙니다.

카메라 방향 계산과 조명 계산, 물리 처리와 AI 이동 같은 다양한 시스템들 역시 대부분 정규화된 방향 벡터를 기반으로 동작합니다.

특히 조명 계산에서는 대부분 빛의 방향 벡터를 정규화해서 사용하고, 카메라 역시 바라보는 방향을 정규화된 벡터로 관리하는 경우가 많습니다.

정규화는 게임 엔진 안에서 방향 정보를 안정적으로 다루기 위한 핵심 기초 기술 중 하나라고 볼 수 있습니다.


마무리

벡터는 방향뿐 아니라 길이 정보까지 함께 가지고 있습니다.

그리고 게임 개발에서는 벡터 길이를 일정하게 유지하는 것이 굉장히 중요할 때가 많습니다.

특히 이동 처리와 방향 계산, 카메라 이동 같은 다양한 시스템에서는 정규화된 방향 벡터를 사용해야 합니다.

따라서 벡터 길이와 정규화 개념은 게임 수학 안에서도 굉장히 중요한 기초 개념 중 하나라고 할 수 있습니다.

다음 글에서는 두 벡터가 얼마나 같은 방향을 바라보고 있는지를 계산하는 내적(Dot Product)이 왜 중요한지,
그리고 시야 판정과 조명 계산에서 어떻게 활용되는지를 이어서 정리해보겠습니다.

댓글 남기기

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