게임 물리와 벡터 수학 입문 가이드 총정리
게임 프로그래밍을 시작할 때 왜 벡터부터 잡아야 할까요?
캐릭터 이동은 결국 위치와 방향의 문제입니다
초보 개발자가 게임 프로그래밍을 배우다 보면 렌더링, 입력 처리, 충돌, 카메라, 애니메이션이 한꺼번에 등장합니다. 이때 가장 먼저 흔들리는 개념이 바로 벡터 수학입니다. 화면에 캐릭터를 한 칸 움직이는 코드도 실제로는 위치 벡터에 이동 방향과 속도를 더하는 과정입니다.
Will Perone 같은 개발자 포트폴리오와 게임 수학 라이브러리의 흐름을 보면, 복잡한 엔진 기능도 작은 수학 도구에서 출발합니다. 벡터를 어렵게 공식으로만 외우기보다 게임 안의 물체가 어디에 있고, 어디로 가며, 얼마나 빠르게 움직이는지 표현하는 언어로 이해하면 훨씬 빨리 감이 잡힙니다.
- 위치 벡터: 캐릭터, 총알, 카메라가 현재 어디에 있는지 나타냅니다.
- 방향 벡터: 적을 향해 바라보는 방향, 점프하는 방향, 조준선의 방향을 표현합니다.
- 속도 벡터: 방향에 시간당 이동량을 더해 실제 움직임을 만듭니다.
- 가속도 벡터: 중력, 넉백, 부스터처럼 속도를 점차 바꾸는 힘을 다룹니다.
처음부터 행렬, 쿼터니언, 물리 엔진 내부 구조를 모두 이해하려 하지 않아도 됩니다. 벡터의 덧셈, 뺄셈, 정규화, 내적만 확실히 잡아도 2D 게임 이동과 간단한 AI 추적은 직접 구현할 수 있습니다.
입문 단계에서는 좌표를 숫자 두세 개의 묶음으로 보는 습관이 중요합니다. 2D에서는 x와 y, 3D에서는 x, y, z가 필요합니다. 예를 들어 플레이어가 오른쪽으로 이동한다면 x가 증가하고, 위로 점프한다면 y가 증가합니다. 여기서 프레임마다 일정한 값을 더하면 이동이 너무 기계적으로 보일 수 있으므로, 보통은 속도와 delta time을 곱해 자연스러운 움직임을 만듭니다.
입문자가 꼭 알아야 할 핵심 벡터 연산
덧셈과 뺄셈으로 이동과 거리 감각 만들기
벡터 덧셈은 게임 오브젝트를 이동시키는 가장 기본적인 도구입니다. 현재 위치가 (3, 2)이고 이동 벡터가 (1, 0)이면 다음 위치는 (4, 2)가 됩니다. 별것 아닌 계산처럼 보이지만, 캐릭터 이동, 투사체 발사, 카메라 패닝, 파티클 이동까지 모두 같은 원리로 확장됩니다.
반대로 벡터 뺄셈은 두 대상 사이의 방향과 차이를 구할 때 사용합니다. 적 위치에서 플레이어 위치를 빼면 적이 플레이어를 향해 이동해야 하는 방향을 얻을 수 있습니다. 이 방식은 초보자가 적 추적 AI를 만들 때 가장 먼저 써보면 좋은 패턴입니다.
- 이동: 현재 위치 + 방향 벡터 × 속도 × 시간
- 추적: 목표 위치 - 현재 위치로 방향 후보 계산
- 거리 확인: 두 위치의 차이 벡터 길이로 사거리 판단
- 회피: 현재 위치 - 위험 위치로 도망갈 방향 계산
정규화와 내적으로 방향 판단하기
정규화(normalize)는 벡터의 길이를 1로 만드는 연산입니다. 방향만 필요하고 거리나 크기는 필요하지 않을 때 사용합니다. 예를 들어 마우스 클릭 지점으로 캐릭터를 이동시킬 때, 클릭 지점이 멀다고 더 빠르게 움직이면 이상합니다. 이럴 때 목표 방향 벡터를 정규화한 뒤 원하는 속도를 곱하면 일정한 속도로 이동합니다.
내적(dot product)은 두 방향이 얼마나 비슷한지 확인하는 데 유용합니다. 경비병이 플레이어를 보고 있는지, 플레이어가 적의 뒤를 잡았는지, 레이싱 게임에서 차량이 도로 방향과 얼마나 어긋났는지 판단할 수 있습니다. 초보자에게 내적은 공식보다 활용 장면으로 익히는 편이 좋습니다.
- 두 위치의 차이를 구해 방향 벡터를 만듭니다.
- 그 방향 벡터를 정규화해 길이를 1로 맞춥니다.
- 캐릭터가 바라보는 방향과 목표 방향의 내적을 구합니다.
- 값이 1에 가까우면 같은 방향, 0에 가까우면 직각, -1에 가까우면 반대 방향으로 해석합니다.
이 네 단계만 익혀도 시야 판정, 조준 보정, 근접 공격 판정 같은 기능을 직접 설계할 수 있습니다. 특히 게임 개발에서 수학은 정답을 외우는 과목이 아니라, 상태를 숫자로 표현해 규칙을 만드는 도구라는 점을 기억하면 부담이 줄어듭니다.
간단한 게임 물리 구현 순서
중력, 점프, 마찰을 작은 규칙으로 나누기
게임 물리는 현실 물리와 완전히 같을 필요가 없습니다. 플레이어가 재미있게 느끼는 움직임을 만드는 것이 우선입니다. 그래서 입문자는 거대한 물리 엔진을 바로 분석하기보다, 위치, 속도, 가속도 세 값을 직접 업데이트하는 미니 물리 루프를 만들어보는 것이 좋습니다.
가장 쉬운 예시는 점프입니다. 플레이어가 점프 키를 누르면 y축 속도에 양수 값을 넣고, 매 프레임 중력 값을 더해 y축 속도를 점점 낮춥니다. 바닥에 닿으면 y 위치를 보정하고 속도를 0으로 만듭니다. 이 구조는 단순하지만 플랫폼 게임의 기본 감각을 이해하는 데 매우 효과적입니다.
- 중력: 매 프레임 아래 방향 가속도를 적용합니다.
- 점프: 순간적으로 위 방향 속도를 부여합니다.
- 마찰: 입력이 없을 때 수평 속도를 서서히 줄입니다.
- 충돌 보정: 벽이나 바닥을 통과하지 않도록 위치를 되돌립니다.
프레임 독립적인 움직임 만들기
게임 프로그래밍에서 자주 나오는 실수는 프레임마다 고정된 픽셀 값을 더하는 방식입니다. 60FPS에서는 자연스럽지만 144FPS에서는 캐릭터가 너무 빨라질 수 있습니다. 그래서 delta time, 즉 이전 프레임 이후 흐른 시간을 곱해 움직임을 계산합니다.
예를 들어 초당 200픽셀로 이동하고 싶다면 매 프레임 이동량은 200 × delta time입니다. delta time이 0.016초라면 약 3.2픽셀, 0.008초라면 약 1.6픽셀만 움직입니다. 결과적으로 화면 주사율이 달라도 1초 동안 이동한 총거리는 비슷해집니다.
입문 프로젝트에서는 물리 값을 코드 곳곳에 흩뿌리지 말고, speed, gravity, jumpPower 같은 이름 있는 변수로 분리하세요. 나중에 손맛을 조정할 때 숫자 하나만 바꾸면 되므로 테스트 속도가 크게 빨라집니다.
프로젝트를 조금 더 체계적으로 진행하고 싶다면 개발 일정과 리소스도 함께 관리해야 합니다. 특히 혼자 만드는 작은 게임이라도 기능 범위를 정하지 않으면 끝없이 늘어집니다. 계획을 세우는 관점은 계획예산 제도의 개념처럼 목표와 자원을 연결해 보는 방식에서 힌트를 얻을 수 있습니다.
수학 라이브러리와 직접 구현 사이의 선택법
처음에는 직접 만들고, 프로젝트에서는 검증된 도구를 쓰기
초보자는 벡터 클래스를 한 번 직접 만들어보는 경험이 필요합니다. x, y 값을 가진 구조체를 만들고 add, subtract, length, normalize 함수를 구현하면 게임 수학이 추상적인 공식에서 실제 코드로 바뀝니다. 이 과정은 짧지만 매우 강력한 학습 효과가 있습니다.
다만 실제 프로젝트가 커지면 직접 만든 수학 코드만으로 버티기 어렵습니다. 3D 회전, 행렬 변환, 충돌 판정, 부동소수점 오차 처리까지 확장되면 검증된 math library나 엔진 내장 API를 활용하는 편이 안정적입니다. Will Perone의 사이트 주제처럼 developer, game programming, math, portfolio가 연결되는 지점도 바로 여기에 있습니다. 좋은 개발자는 모든 것을 직접 만드는 사람이 아니라, 무엇을 이해하고 무엇을 도구에 맡길지 판단하는 사람입니다.
- 학습용 구현: Vector2, Vector3, dot, length, normalize를 직접 작성합니다.
- 프로토타입: 엔진 내장 벡터 타입을 사용해 빠르게 기능을 검증합니다.
- 상용 프로젝트: 성능과 안정성이 검증된 수학 라이브러리를 선택합니다.
- 포트폴리오: 직접 구현한 원리와 도구 선택 이유를 함께 설명합니다.
도구 선택을 위한 비교표
입문자는 “직접 구현해야 실력이 느는지, 라이브러리를 써야 실무적인지”에서 자주 고민합니다. 답은 목적에 따라 다릅니다. 학습 단계에서는 직접 구현이 좋고, 완성해야 하는 프로젝트에서는 검증된 도구가 좋습니다. 아래 기준으로 지금 내 상황을 판단해 보세요.
| 상황 | 추천 방식 | 이유 |
|---|---|---|
| 벡터 개념을 처음 배우는 단계 | 직접 구현 | 연산 흐름을 눈으로 확인할 수 있습니다. |
| 게임잼이나 빠른 프로토타입 | 엔진 내장 기능 | 시간을 아끼고 게임성 검증에 집중할 수 있습니다. |
| 3D 카메라와 회전이 많은 프로젝트 | 검증된 라이브러리 | 행렬과 쿼터니언 오류를 줄일 수 있습니다. |
| 개발자 포트폴리오 | 핵심 일부 직접 구현 | 문제 해결 능력과 수학 이해도를 보여주기 좋습니다. |
게임 개발은 프로그래머 혼자만의 작업처럼 보이지만, 실제 현장에서는 기획, 아트, 사운드, QA가 함께 움직입니다. 역할 이해가 필요하다면 게임 기획자의 역할 설명을 참고해 개발자가 어떤 요구사항을 코드로 바꾸는지 살펴보는 것도 도움이 됩니다.
초보자용 실습 로드맵: 2D 미니 프로젝트 5단계
한 번에 큰 게임을 만들지 말고 기능 단위로 쪼개기
처음부터 완성형 RPG나 온라인 액션 게임을 만들려고 하면 좌절하기 쉽습니다. 입문자는 작은 기능을 하나씩 완성하며 수학과 코드를 연결해야 합니다. 아래 5단계는 게임 프로그래밍 입문자가 벡터와 물리를 자연스럽게 익히기 좋은 순서입니다.
- 화면 안에서 캐릭터 이동: 방향키 입력을 받아 위치 벡터를 업데이트합니다.
- 마우스 방향 조준: 캐릭터 위치와 마우스 위치의 차이 벡터를 계산합니다.
- 총알 발사: 정규화된 방향 벡터에 속도를 곱해 투사체를 이동시킵니다.
- 적 추적 AI: 적이 플레이어 방향으로 천천히 이동하도록 만듭니다.
- 간단한 충돌 판정: 원형 또는 사각형 충돌로 피격 여부를 확인합니다.
각 단계는 작아 보이지만 실제 게임에서 반복적으로 쓰이는 핵심 패턴입니다. 예를 들어 총알 발사와 적 추적은 모두 “목표 위치 - 현재 위치”로 방향을 구하는 구조입니다. 하나의 수학 개념이 여러 기능으로 재사용되는 순간, 게임 개발 속도가 눈에 띄게 빨라집니다.
포트폴리오에 남길 때의 설명 방식
게임 개발 포트폴리오를 만들 때는 결과 화면만 보여주기보다 어떤 문제를 어떻게 풀었는지 설명해야 합니다. “플레이어 이동 구현”이라고만 쓰면 평범하지만, “delta time을 적용해 프레임 독립적인 이동을 구현했고, 벡터 정규화로 대각선 이동 속도 증가 문제를 해결했다”라고 쓰면 개발자의 사고 과정이 보입니다.
- 문제: 대각선 이동 시 속도가 빨라지는 현상이 있었습니다.
- 원인: x축과 y축 입력을 동시에 더하면서 벡터 길이가 1보다 커졌습니다.
- 해결: 입력 벡터를 정규화한 뒤 속도를 곱했습니다.
- 결과: 모든 방향에서 일정한 이동 속도를 유지했습니다.
이처럼 작은 기능도 원인과 해결을 함께 기록하면 좋은 기술 글이 됩니다. Will Perone 같은 개인 개발자 사이트의 강점은 단순한 작업물 목록이 아니라, 개발자가 어떤 수학적 판단과 구현 선택을 했는지 보여주는 데 있습니다. 블로그 글과 포트폴리오가 함께 쌓이면 검색 유입뿐 아니라 실력 증명에도 도움이 됩니다.
자주 묻는 질문과 실전 체크리스트
초보자가 가장 많이 막히는 질문
Q. 수학을 못해도 게임 프로그래밍을 시작할 수 있나요?
시작할 수 있습니다. 다만 게임 오브젝트의 위치, 방향, 속도를 다루는 순간 기초 수학은 반드시 필요합니다. 처음부터 고급 미적분을 공부하기보다 벡터 덧셈, 뺄셈, 길이, 정규화, 내적 순서로 익히면 충분히 따라갈 수 있습니다.
Q. Unity나 Unreal을 쓰면 벡터 수학을 몰라도 되나요?
엔진이 많은 기능을 대신 처리해 주지만, 원하는 움직임을 만들려면 결국 벡터를 이해해야 합니다. Transform, Rigidbody, CharacterController 같은 API도 내부적으로는 위치와 방향 데이터를 다룹니다. 엔진을 잘 쓰는 개발자일수록 수학 개념을 코드 설계에 자연스럽게 연결합니다.
Q. 2D부터 해야 하나요, 3D부터 해도 되나요?
입문자는 2D부터 권장합니다. 2D에서는 x, y 좌표만 다루므로 방향과 속도 개념에 집중하기 쉽습니다. 3D는 z축, 카메라 공간, 회전, 쿼터니언까지 함께 등장하기 때문에 기본기를 익힌 뒤 넘어가는 편이 안정적입니다.
프로젝트 시작 전 체크리스트
마지막으로 새 미니 게임을 시작하기 전에 아래 항목을 점검해 보세요. 이 목록은 초보자가 흔히 놓치는 부분을 줄이기 위한 실전 기준입니다. 모든 항목을 완벽히 만족할 필요는 없지만, 최소한 어떤 값을 어디서 관리할지 정해두면 디버깅 시간이 크게 줄어듭니다.
- 좌표계 확인: 화면의 위쪽이 y 증가인지 감소인지 먼저 확인합니다.
- 속도 단위 정의: 초당 픽셀, 초당 유닛처럼 기준을 정합니다.
- delta time 적용: 프레임률에 따라 움직임이 달라지지 않도록 합니다.
- 대각선 이동 보정: 입력 벡터 정규화로 속도 증가를 막습니다.
- 충돌 기준 통일: 원형, 사각형, 타일 중 어떤 방식으로 판정할지 정합니다.
- 디버그 표시: 방향 벡터나 충돌 범위를 화면에 그려 확인합니다.
게임 프로그래밍은 처음에는 낯선 용어가 많지만, 실제로는 작은 규칙을 쌓아 재미있는 움직임을 만드는 작업입니다. 벡터 하나로 이동을 만들고, 내적으로 시야를 판단하고, delta time으로 안정적인 물리를 만들 수 있습니다. 이 기초가 잡히면 math library를 읽는 눈도 생기고, 개인 포트폴리오에 담을 만한 기술 설명도 훨씬 풍부해집니다.

- 다음글게임 프로그래밍 실패 사례 총정리: 하지 말아야 할 실수 26.06.27
등록된 댓글이 없습니다.
