2008년 06월 13일
게임을 만들려면 수학을 잘 해야 하나요?

얼마전 비슷한 질문을 던질 기회가 있었습니다. 결론부터 말하면 수학과 프로그래밍과의 연관 관계, 분명히 있습니다. 예를 들어 3D 프로그래밍(대개 클라이언트의 엔진 프로그래밍)은 행렬과 벡터 개념 없이는 아무 것도 설명할 수 없습니다. 그런데 기획 쪽에서 생각하는 프로그래밍의 개념에도 수학이 필요할까... 라는 질문이라면 수학 보다는 논리의 문제라고 설명드리고 싶습니다.
이런 문제를 한번 생각해봅시다. 몹 스폰과 관련하여 기획서에는,
"모든 몹은 x, z 좌표의 스폰 포인트를 가지고, 스폰 포인트를 중심으로 반경 10m 내에서 고르게 스폰된다"
라고 적혀 있었습니다. 이에 대해 스폰 포인트를 서버 프로그래머는 이런 식으로 코딩했습니다. (슈도 코드이니 대강 읽어주세요)
/* 랜덤한 반경(r)과 각도(theta) 생성 */
r = rand(10);
theta = rand(2 * pi);
/* 실제 스폰 포인트에 적용 */
x = mob.spawn_x + (r * cos(theta));
x = mob.spawn_y + (r * sin(theta));
mob.spawn();
/* 스폰된 몹 데이터를 클라이언트와 sync */
mob.sync();
프로그래밍에 관련된 지식이 있으시다면 쉽게 읽으실 수 있겠습니다. 원형 스폰 포인트이므로 원점에서의 거리 r 과 각도 theta를 랜덤 생성해서 실제 스폰 포인트에 적용한 후, 실제로 몹을 스폰시키는 것입니다. 일단 이 과정에도 삼각함수는 쓰입니다. 그러나 중학교 수준 수학이라 여기까지는 누구나 생각할 수 있지요.
하지만 이 코드, 언뜻 보아서는 별 문제 없이 돌아갈 것 같은 이 코드는 실제로 원하는 대로 동작하지 않습니다. 이 코드를 실행시키면, 원형 스폰포인트 안에 몹들이 스폰되기는 하지만, 원점 부근에만 몹들이 바글바글 모이게 됩니다. 왜 그럴까요?
간단하게 이 문제는 지구본을 펼쳐서 그렸을 때 그린란드가 어마어마하게 크게 그려지는 원리와 같습니다. r 과 theta가 랜덤하게 생성되면 스폰 포인트 안에 고루 몹이 펼쳐지는 것이 아니라, 면적 밀도가 높은 원점 부근에 몹들이 더 많이 스폰됩니다. 반지름 3인 도넛과 반지름 2인 도넛의 크기가 같지 않기 때문에, r 을 기준으로 그 원을 잘랐을 때 스폰되는 몹들의 갯수는 같지만 잘라진 면적은 바깥쪽이 더 큽니다. 원의 넓이를 구하는 공식이 1차식이 아니라 2ㅠr^2, 즉 2차 식이기 때문이지요.
그래서 고루 몹을 스폰시키기 위해서는 r 이 커질 수록 더 많은 몹들이 스폰되게 공식을 수정해야 합니다. 정답은 이렇게 생겼습니다.
/* 랜덤한 반경(r)과 각도(theta) 생성 */
r = sqrt(random(100));
theta = rand(2 * pi);
/* 실제 스폰 포인트에 적용 */
x = mob.spawn_x + (r * cos(theta));
x = mob.spawn_y + (r * sin(theta));
mob.spawn();
MAX radius인 10의 제곱을 생성한 후, 거기에 루트를 씌우는 것입니다. 이렇게 하면 랜덤 값은 10으로 갈 수록 더 많이 생성되고, 그 결과 반지름 10m의 원형 스폰 포인트 안에 고루 몬스터가 팝 되게 되었습니다.
이 글을 읽고 어느정도 감을 잡으셨겠지만, 수학은 분명히 필요합니다. 하지만 수학 그 자체는 중학교 수준을 벗어나지 않습니다. 게임 기획이나 게임 프로그래밍을 하면서 테일러 급수나 미분 방정식을 쓰는 것은 본적이 없습니다. (여담이지만 푸리에 급수는 경제 시스템에 가끔 사용되는 것 같기는 합니다)
문제는 "논리적인 사고"입니다. 애초에 우리가 예상한 것 처럼 몬스터가 스폰되지 않고 원점 근처에 몹들이 바글바글 몰렸을 때, "왜 이런 현상이 벌어지는가"에 대해 프로그래머나 기획자는 직관적으로 이유를 댈 수 있어야 합니다. 그렇지 않으면 스폰 테이블이 잘못된 것인지, 스폰은 제대로 됐는데 맵의 axis나 좌표가 꼬였는지. 어디가 문제인지 찾을 수가 없게 됩니다.
물리 엔진등을 제작하는 엔진 프로그래머라면 얘기가 많이 다릅니다만, 일반적인 프로그래머의 수학 소양이라는 것은 이런 관점에서 접근하는 것이 옳다고 생각합니다. 그리고 여담이지만, 이러한 논리성과 직관성을 더 많이 필요로 하는 직군은 기획파트가 아닐까 합니다. 기획자가 문서를 작성할 때, "원형 스폰 포인트를 갖는다"라고 쓰지 않았다면 저 문제는 발생하지 않았을테니까요.
---------------------------------------------------------
아침에 일찍 출근해서 개인 문서를 정리하다 문득 찾아낸 글. 예전에 게임 기획자 카페에서 누군가 "게임을 만들려면 수학을 잘해야 하나요?" 라는 질문을 올렸다. 이 글은 그 질문에 대한 나의 답변이다. 요약하자면 수학 그 자체보다는 논리적 사고가 필요하다, 라는 것이었다.
게임 만들기 카테고리가 썰렁해서 하나 올려둔다.
# by | 2008/06/13 07:47 | 게임 만들기 | 트랙백 | 덧글(5)







☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
매지/ 기획자가 문서를 작성할 때, "원형 스폰 포인트를 갖는다"라고 쓰지 않았다면 저 문제는 발생하지 않았을테니까요. --> 그래서 저도 이렇게 썼습니다. 'ㅂ')
windsinger+노래/ 그러네요. 벌써 2008년이 반이나 지나갔어요. (이게 아닌가;)
근데,, 이 글 쓰신지 거의 1년이 되어가느군요...ㄷㄷ;
언제나 화이팅입니다.!