내적과 외적의 정리
회사 생활을 하다 보면 개발자 면접을 자주 보게 되는데, 그때마다 꼭 물어보는 것이 벡터의 내적과 외적이다. 이 부분을 제대로 설명하지 못하는 지원자는 거의 떨어뜨린다. 기본적으로 내적과 외적은 게임 공간의 근본을 이루는 **점(Point)**과 **벡터(Vector)**의 개념이다. 이 둘을 명확히 이해하지 못하면, 게임 개발의 기초가 없는 것이다.
면접실에서 배우는 게임수학
십 년 이상 게임 프로그래머를 면접해오면서 느낀 것이 하나 있다. 기술 스택이나 최신 엔진에 대한 지식은 배워도 되고, 포트폴리오의 프로젝트 규모도 중요하지만, 가장 먼저 평가하는 것은 기초다. 그 기초 중 기초가 바로 점과 벡터의 구분이다.
면접에서 이를 모르면 탈락시키는 이유는 이것이 ‘알면 좋은’ 지식이 아니라, 게임을 만드는 모든 순간에 부딪히는 개념이기 때문이다. 물체의 위치를 계산할 때, 카메라를 움직일 때, 충돌 판정을 할 때, 심지어 UI 좌표를 배치할 때도 이 개념이 깔려 있다.
게임에서 점과 벡터는 다른 세계에 산다
수학 교과서에서 벡터는 크기와 방향을 가진 양이다. 게임에서도 벡터는 같은 정의를 쓴다. 하지만 게임 프로그래밍의 벡터 공간은 현실 공간과 다르게 구성된다.
게임 엔진은 물체를 표현하기 위해 벡터 공간을 한 차원 높게 확장한다. 예를 들어 2차원 평면에 직사각형이 있다면, 이 직사각형을 표현하는 데는 2차원 벡터로 충분하다. 하지만 여기에 움직임을 더하려면 차원이 올라간다. 2차원 물체를 2차원으로 움직이려면 실제로는 3차원 공간이 필요한 것이다.
같은 논리로, 게임에서 보이는 3차원 세계는 실제로는 4차원 공간으로 구성되어 있다.
이 4차원 공간에서 벡터 공간의 원소는 용도에 따라 두 가지로 나뉜다.
| 구분 | 정의 | 역할 | 예시 |
|---|---|---|---|
| 점(Point) | 위치를 표현하는 좌표 | 물체가 어디에 있는지 | 캐릭터의 현재 위치 (10, 5, 3) |
| 이동 벡터 | 크기와 방향을 가진 이동량 | 물체를 어느 방향으로 얼마나 움직일지 | 초당 2m 오른쪽으로 이동 (2, 0, 0) |
수식으로 나타내면 점에 벡터를 더하면 새로운 점이 된다.
새로운 점 = 원래 점 + 이동 벡터
P2 = P1 + V
점에서 점을 빼면 이동 벡터가 나온다.
이동 벡터 = 도착점 - 출발점
V = P2 - P1
이것이 게임 공간에서 벡터 공간이 작동하는 방식이다. 점은 절대적인 위치이고, 이동 벡터는 상대적인 변화다.
로컬 공간에서 월드 공간으로
게임에서 물체를 배치하는 과정은 표면적으로는 단순하다. 마우스로 드래그해서 맵 위에 놓으면 끝이다. 하지만 내부적으로는 두 개의 공간이 동시에 작동한다.
**월드 공간(World Space)**은 게임의 무대다. 모든 물체가 배치되는 절대적인 좌표계이며, 움직이지 않는다. 이것이 기준점이다.
**로컬 공간(Local Space)**은 각 물체가 가진 자신의 좌표계다. 물체를 구성하는 점들은 로컬 공간에서 정의된다. 캐릭터 모델을 만들 때, 캐릭터의 발을 원점(0, 0, 0)으로 설정하고 몸 전체를 로컬 좌표로 표현한다.
물체를 월드 공간에 배치한다는 것은, 물체의 점들을 월드 공간으로 이동시키는 게 아니다. 대신 로컬 공간 자체를 이동시킨다. 마치 투명한 좌표계 종이 위에 물체를 그려놓고, 그 종이 전체를 움직이는 것과 같다.
물체의 월드 좌표 = 로컬 좌표 + 로컬 공간의 오프셋(이동 벡터)
플레이어는 이 움직임을 보기만 한다. 내부적으로 점들이 이동했는지, 공간이 이동했는지는 알 수 없다. 결과는 같으니까.
실무에서 이 구분이 왜 중요한가
게임 개발에서 버그의 상당수는 점과 벡터를 헷갈릴 때 발생한다.
예 1: 캐릭터가 벽을 뚫고 지나간다
충돌 판정을 할 때, 캐릭터의 위치(점)를 이동량(벡터)과 더해야 한다. 만약 벡터끼리 더하면 어떻게 될까? 계산 결과는 여전히 벡터다. 벡터는 위치가 아니다. 충돌 판정이 엉망이 된다.
예 2: UI 요소가 제자리에 있지 않다
UI 버튼의 위치를 계산할 때, 부모 요소의 위치(점)와 오프셋(벡터)을 구분해야 한다. 이를 헷갈리면 해상도가 바뀔 때 UI가 뒤죽박죽 되거나, 앵커 포인트가 동작하지 않는다.
예 3: 카메라가 이상하게 움직인다
카메라의 위치는 점이다. 하지만 카메라의 회전축을 표현할 때는 벡터를 쓰고, 시선 방향도 벡터다. 이들을 섞어서 쓰면 카메라가 예상 밖으로 튀어다닌다.
이런 버그들은 보통 깊게 파고들어야 원인을 찾는다. 컴파일은 되고, 실행도 되는데, 결과만 이상할 뿐이기 때문이다.
게임 프로그래머라면 반드시 알아야 할 것
면접에서 이 개념을 설명하지 못했던 지원자들에게 나는 항상 같은 말을 한다. “이건 선택이 아니라 필수다.”
게임 엔진이 Unity든 Unreal이든 Godot이든 상관없다. 모든 게임 엔진은 이 원리를 기반으로 만들어진다. 엔진이 대신 계산해주기 때문에, 개발자는 의식하지 못하고 지나갈 수도 있다. 하지만 의식하지 못하는 것과 이해하지 못하는 것은 다르다.
점과 벡터의 개념을 명확히 이해하면, 코드를 읽을 때 훨씬 빠르게 이해한다. 버그를 찾을 때도, 기하학적 계산이 필요할 때도, 새로운 엔진을 배울 때도 이 기초가 든든하다.
내가 면접에서 이 질문을 하는 이유는, 일 때문만이 아니다. 이 개념을 설명할 수 있다는 것은 게임 공간이 어떻게 작동하는지를 이해한다는 증거다. 그리고 그것이 좋은 게임 프로그래머의 출발점이다.
마치며
게임의 내적은 위치를 나타내는 점, 외적은 이동을 나타내는 벡터다. 이 두 가지는 같은 수학적 구조에서 나오지만 완전히 다른 역할을 한다. 게임 엔진이 4차원 공간을 사용하는 이유는 3차원 물체를 3차원으로 움직이려면, 한 차원이 더 필요하기 때문이다. 이 구조를 이해하면, 게임 개발의 가장 기초적인 부분이 명확해진다.
자주 묻는 질문
Q. 게임에서 정말 4차원을 쓰나?
그렇다. 게임에서 보이는 3차원 공간은 내부적으로 4차원으로 구현된다. 나머지 1차원은 물체의 이동을 담당한다. 플레이어는 4차원을 인지할 수 없으므로 3차원처럼 보일 뿐이다.
Q. 그럼 2D 게임은 3차원을 쓰나?
맞다. 2D 게임도 마찬가지다. 2차원 평면에 2차원 움직임을 구현하려면 3차원 공간이 필요하다. 단, 높이 차원의 값을 사용하지 않을 뿐이다.
Q. 점과 벡터를 섞어 써도 대부분 작동하지 않나?
단기적으로는 우연히 작동할 수 있다. 하지만 복잡한 계산이 쌓이면, 축적된 오류가 버그로 나타난다. 특히 회전, 스케일, 연쇄 변환이 들어가면 금방 터진다.
Q. 실무에서 점과 벡터를 의식하고 코딩하나?
그렇다. 변수를 만들 때도 주석을 남길 때도 의식한다. 예를 들어 position은 점, direction은 벡터라고 명확히 구분한다. 이렇게 하면 코드 리뷰나 협업할 때 실수를 줄일 수 있다.