게임 프로그래밍을 배우다 보면 '수학을 얼마나 알아야 하나요'라는 질문을 자주 하게 됩니다. 모든 수학이 필요한 것은 아니지만, 벡터와 행렬은 캐릭터 이동부터 카메라, 조명까지 거의 모든 곳에 쓰이므로 꼭 알아 두어야 합니다. 이 글은 공식보다 '게임에서 무엇을 할 때 쓰는가'를 중심으로 게임 수학의 기초를 설명합니다.
벡터란 무엇인가: 위치와 방향
벡터는 크기와 방향을 함께 가진 값입니다. 2D 게임에서는 (x, y), 3D 게임에서는 (x, y, z)처럼 숫자 묶음으로 나타냅니다. 같은 벡터라도 쓰임에 따라 위치를 뜻하기도 하고, 이동 방향이나 속도를 뜻하기도 합니다.
- 위치: 캐릭터가 맵의 어디에 있는가
- 속도: 1초에 어느 방향으로 얼마나 움직이는가
- 방향: 캐릭터가 바라보는 쪽, 총알이 날아가는 쪽
- 힘: 점프나 넉백처럼 물체를 미는 값
벡터의 기본 연산
두 벡터를 더하면 이동이 됩니다. 현재 위치에 '속도 × 델타 타임'을 더하면 다음 위치가 나옵니다. 목표 위치에서 내 위치를 빼면 목표를 향하는 벡터가 나오고, 그 길이가 곧 거리입니다.
정규화는 벡터의 길이를 1로 맞추는 작업입니다. 방향만 필요하고 크기는 필요 없을 때 씁니다. 대각선으로 움직일 때 속도가 더 빨라지는 버그는 입력 벡터를 정규화하지 않아서 생기는 대표적인 사례입니다. 거리 비교만 할 때는 제곱근 계산을 생략하고 거리의 제곱끼리 비교하면 계산이 가벼워집니다.
내적과 외적: 각도와 좌우 판단
| 연산 | 결과 | 게임에서의 쓰임 |
|---|---|---|
| 내적(Dot) | 숫자 하나 | 적이 내 앞에 있는지 뒤에 있는지, 시야각 안에 있는지 판단 |
| 외적(Cross) | 두 벡터에 수직인 벡터 | 목표가 왼쪽인지 오른쪽인지 판단, 면의 법선 구하기 |
정규화한 두 벡터의 내적은 사이 각도의 코사인 값과 같습니다. 결과가 1에 가까우면 같은 방향, 0이면 직각, -1에 가까우면 반대 방향입니다. 이를 이용하면 '경비병의 시야 60도 안에 플레이어가 들어왔는가'를 간단히 계산할 수 있습니다. 백스탭 판정도 같은 원리입니다.
행렬: 이동·회전·크기를 한 번에
행렬은 숫자를 가로세로로 배열한 표입니다. 게임에서는 물체를 옮기고(이동), 돌리고(회전), 키우는(크기 변경) 변환을 행렬로 표현합니다. 3D 게임에서는 보통 4×4 행렬을 씁니다.
행렬의 장점은 여러 변환을 곱해서 하나로 합칠 수 있다는 점입니다. 다만 곱하는 순서에 따라 결과가 달라집니다. 제자리에서 돈 다음 이동하는 것과, 이동한 다음 원점을 기준으로 도는 것은 결과 위치가 다릅니다. 엔진마다 곱셈 순서 규칙이 있으니 문서를 확인해야 합니다.
좌표 공간과 카메라
- 로컬 공간: 모델 자신을 기준으로 한 좌표
- 월드 공간: 게임 세계 전체를 기준으로 한 좌표
- 뷰 공간: 카메라를 기준으로 한 좌표
- 투영 후 화면 공간: 실제 모니터 픽셀 위치
3D 모델은 이 공간들을 차례로 거치며 화면에 그려집니다. 각 단계 사이를 오가는 데 행렬이 쓰입니다. 마우스로 클릭한 화면 위치를 게임 세계의 위치로 바꾸는 기능도 이 과정을 거꾸로 따라가는 계산입니다.
회전은 오일러 각(x, y, z축 각도) 대신 쿼터니언으로 다루는 경우가 많습니다. 오일러 각은 특정 각도에서 축이 겹쳐 회전이 꼬이는 짐벌 락 문제가 있기 때문입니다. 쿼터니언의 내부 공식을 다 외울 필요는 없고, 엔진이 제공하는 함수로 회전을 합치고 보간하는 법을 익히면 됩니다.
공부 방법
공식을 외우기보다 그림을 그려 보는 것이 효과적입니다. 종이에 화살표를 그려 더하고 빼 보고, 엔진에서 디버그 선을 그려 벡터 방향을 눈으로 확인해 보세요. 시야각 판정, 목표 추적 미사일, 카메라 따라가기를 직접 만들어 보면 벡터 연산이 자연스럽게 익숙해집니다.
SBS아카데미게임학원 게임프로그래밍 과정은 캐릭터 컨트롤과 물리 엔진 적용을 실습으로 다루어 게임 수학을 실제 기능에 써 볼 수 있습니다.
자주 묻는 질문
고등학교 수학을 잘 못했는데 괜찮을까요?
벡터와 행렬은 게임 예시와 함께 배우면 이해가 빠른 편입니다. 필요한 부분부터 하나씩 직접 써 보며 익히면 충분히 따라갈 수 있습니다.
엔진이 다 계산해 주는데 수학을 알아야 하나요?
함수는 엔진이 주지만 어떤 함수를 어떤 순서로 써야 하는지는 개발자가 판단해야 합니다. 원리를 알아야 버그도 빨리 찾습니다.
쿼터니언도 공부해야 하나요?
공식 유도까지는 필요하지 않은 경우가 많습니다. 왜 쓰는지와 엔진 함수 사용법을 알아 두는 것으로 시작하면 됩니다.
