마비노기영웅전
넥슨 데브캣 스튜디오가 2010년 출시한 온라인 액션 롤플레잉게임(RPG). 던전에서 부러진 나무를 휘두르거나 지붕을 받치는 기둥을 무너뜨려 몬스터를 공격하는 게임이다. 캐릭터의 액션에 따라 주변에 있는 물체가 파괴되면서 느껴지는 손맛이 짜릿하다. 물리 엔진인 ‘하복 엔진’에 자체 개발한 알고리즘을 더해 제작했다.
머리가 거대한 새가 날아가 벽돌을 부수고 연두색 돼지를 무찌르는 게임 ‘앵그리버드’는 스마트폰이 상용화되던 초기, PC게임 유저들이 모바일게임으로 넘어오는 데 지대한 역할을 했다.
새총에 걸린 새를 손가락으로 잡아 당겼다가 스크린에서 손을 떼면 새가 총알처럼 날아가 벽돌에 부딪힌다. 포물선을 그리며 날아가 떨어지게 하려면 빨간 새를, 총알처럼 빠르게 날아가려면 노란 새를, 폭탄처럼 터지려면 까만 새를, 날아가다가 중간에 알을 낳아 공격하려면 하얀 새를, 부메랑처럼 되돌아오듯 회전해 공격하려면 부리가 큰 새를 날리면 된다.
다른 게임과 마찬가지로 게임을 많이 할수록 실력이 늘지만, 이 게임은 특별하게 노하우를 알려주지 않아도 누구나 쉽게 습득할 수 있다. 손가락 힘을 조정해 튕겼을 때 새마다 날아가는 방향과 속도가 현실 세계의 물리 법칙과 닮았기 때문이다.
‘앵그리버드’ 외에도 대부분의 게임에는 사물이 위에서 아래로 떨어지는 ‘중력’, 움직이던 사물이 같은 방향으로 계속 운동하려는 ‘관성’, 사물끼리 ‘충돌’한 뒤에 일어나는 현상(부서지거나 튕겨나가거나), 움직이는 사물이 표면과 닿아 일어나는 ‘마찰’ 등 실제 세계에서의 물리 법칙이 그대로 적용됐다. 물론, 게임의 특성에 따라 중력의 방향 등이 다를 수 있지만, 한번 정해진 물리 법칙이 일정하게 유지된다는 점은 현실 세계와 비슷하다.
무기의 속도와 방향, 파편 위치까지 결정
6월 7일, 경기 성남시 판교에 있는 넥슨을 찾았다.
PC용 온라인 액션 롤플레잉게임(RPG)인 ‘마비노기영웅전(마영전)’의 소스코드를 제작하고 관리하는 개발자인 이재도 마영전클라이언트유닛 리더를 만났다. 마영전은 던전(게임에서 몬스터들이 대거 포진해 있는 소굴)에서 무기를 이용해 사물을 부수거나 몬스터를 직접 공격해 무찌르는 게임이다.
이 리더는 “게임 엔진의 라이브러리 중 하나인 ‘물리 엔진’ 덕분에 게임 세계에서도 일정한 물리법칙이 존재한다”며 “물리 엔진은 물체가 충돌했을때 부서지거나 튕겨 나가는 등 현실에서 눈에 보이는 거의 모든 물리 법칙을 컴퓨터가 표현할 수 있도록 돕는 프로그램”이라고 설명했다.
마영전은 개발 당시 물리 엔진 중 하나인 ‘하복엔진’에 자체 개발한 알고리즘을 더해 만들었다. 하복 엔진은 게임에 자주 등장하는 물체의 움직임이나 충돌을 계산하는 역할을 한다. 예를 들어, 무기를 던지면 충돌 방향과 속도를 환산해 무기에 부딪친 물체가 밀리거나 파괴되는 정도를 계산한 뒤 그 모습을 시각적으로 구현한다.
이 리더는 “실제로 유저가 갖고 있는 힘의 능력치에 따라 들 수 있는 무기의 질량이 달라지고, 무기를 던졌을 때 날아가는 거리도 결정된다”며 “공격을 받은 사물이 파괴될 때도 실제와 비슷한 느낌을 줄 수 있도록 파편이 날아가는 방향과 떨어지는 위치를 구현하는데, 여기에도 물리 엔진이 사용된다”고 말했다.
현실에서 정지해 있는 쇠구슬을 손가락으로 민다고 가정해보자. 손가락이 쇠구슬을 미는 방향으로 작용한 힘(작용), 쇠구슬의 질량과 중력, 표면의 마찰계수(반작용)에 따라 쇠구슬이 굴러가는 방향과 속도, 이동 거리가 달라진다. 마찬가지로 개발자가 물리 엔진에 쇠구슬을 미는 방향과 힘의 크기를 입력하면, 엔진이 구슬의 질량과 중력, 표면의 마찰력 등을 고려해 계산한 뒤 쇠구슬을 일정 지점까지 굴러가게 한다.
개발자가 ‘C언어’나 ‘파이선(Python)’ 등 컴퓨터 언어를 직접 소스코드로 입력해서 이를 구현할 수도 있다. 하지만 모든 현상을 일일이 소스코드로 만드는 데에는 시간이 많이 걸린다. 물리 엔진은여러 물리 현상에 대한 소스코드가 모여 있기 때문에, 물리적인 효과를 이용한 게임을 개발하는 시간을 단축시킬 수 있다. 정해진 포맷에 따라 질량이나 힘 같은 입력값을 넣어 이미지가 변하는 상태를 실시간으로도 볼 수 있다.
마영전 개발팀은 하복 엔진에 들어 있는 ‘랙돌(ragdoll) 시스템’과 ‘로프(rope) 시스템’을 이용해 적이 죽어가면서 널브러지는 모습이나, 계단에서 넘어지는 모습 등 일반 애니메이션 엔진으로 구현하기 어려운 장면을 만들었다.
"하복 엔진은 게임에 자주 등장하는 물체의 움직임이나 충돌을 계산한다. 무기를 던지면
충돌 방향과 속도를 환산해 무기에 부딪친 물체가 밀리거나 파괴되는 정도를 계산한 뒤
시각적으로 구현한다"
옷깃 펄럭이는 알고리즘 자체 개발
그렇다고 기존의 물리 엔진에 개발자들이 원하는 모든 기능이 다 들어 있는 것은 아니다. 마영전 개발자들은 게임 개발 당시 하복 엔진에서 지원하지 않았던 옷깃이나 깃발 등 천이 바람에 펄럭이는 모습을 구현하는 ‘천 물리 알고리즘’과 귀걸이 같은 물체가 달랑거리거나 댕겨지고 늘어나는 모습을 구현하는 ‘지글본(jigglebone) 시스템’을 자체 개발했다. 현재 물리 엔진들은 이 기능들도 대부분 포함하고 있다.
이 리더는 “물체의 이동이나 충돌 등 비교적 간단한 역학 법칙을 구현하는 함수는 그대로 사용할 수 있지만, 물 같은 액체는 그렇지 않다”면서 “물이 흐르는 현상을 나타내는 유체역학이나 옷이나 깃발이 나부끼는 현상을 표현하는 함수에는 미적분방정식 등 복잡한 수식이 들어 있다”고 말했다.
컴퓨터는 0과 1만 사용해 연산하는 만큼 수식에 곱셈과 나눗셈이 많이 들어 있을수록 연산 시간이 오래 걸린다. 특히 미적분방정식을 풀 때에는 사람처럼 간단한 공식을 외워서 푸는 게 아니라 미적분을 유도하는 공식부터 연산 과정에 포함시키는 만큼 시간이 매우 오래 걸린다. 이 리더는 “복잡한 수식이 필요한 경우, 물리 엔진은 실제 수식 대신 간소화한 수식을 사용한다”고 말했다.
숫자를 간소화하기도 한다. 실제 세계와 완벽하게 똑같지는 않더라도 유저가 보기에 위화감이 들지 않을 정도로 비슷한 이미지를 보여주기 위해서다. 가령 중력가속도는 지구에서 약 9.8m/s²이지만 게임 엔진에서는 편의상 1로 설정할 수 있다. 이를 테면 현실에서는 물체가 떨어질 때 중력의 영향과 함께 공기저항을 받지만, ‘마영전’ 세계에서는 공기저항이 없다. 물체의 밀도마다 공기저항이 달라져 연산과정이 복잡해지기 때문이다. 그 대신 떨어지는 물체가 중력가속도에 따라 증가하더라도 최대 크기 속도를 넘지 않도록 제한한다. 그래서 실제로 물체가 떨어지는 것처럼 보인다.
이와 마찬가지로 마영전에서는 포물선으로 날아가는 물체에 대해서 바람의 영향이 없다고 가정했다. 이 리더는 “양궁이나 골프 등 스포츠 게임에서는 바람의 영향까지 표현한다”며 “이 경우에는 바람이 게임 결과에 영향을 미쳐야 더욱 실감나기 때문”이라고 설명했다.
물리 엔진은 게임 외에도 다양하게 활용된다. 영화의 컴퓨터그래픽(CG)이나 애니메이션, 자동차 충돌 시뮬레이션, 건축 설계 시 지진이나 태풍, 해일에 견디는 정도를 테스트하는 시뮬레이션 등 실제와 비슷한 환경을 구현하는 데 사용된다.
영화나 애니메이션은 게임과 마찬가지로 실제와 비슷하게 구현한 가상 공간을 즐기는 것이 목적인 만큼 알고리즘을 간소화할 수 있다. 반면 시뮬레이션 시스템은 간소화한 수식을 사용하면 안 된다.
이 리더는 “자동차 추돌 사고나 자연재해가 발생했을 때 피해 정도를 예상하는 시뮬레이션 시스템은 사람의 안전을 책임지는 만큼 입력값에 대한 결과의 정확도가 높아야 한다”며 “이 경우 현실에서 사용하는 모든 수학적 함수를 다 포함시킨다”고 말했다.
[Interview]
넥슨 마영전클라이언트유닛 리더_이재도
넥슨에서 어떤 일을 하고 있나
‘마영전’ 클라이언트 프로그래밍을 맡고 있다. 쉽게 말해 게임 최적화 작업과 코드 안정성 확인, 게임에서 문제가 발생했을 때 해결하는 일을 하고 있다. 게임의 성능을 더 빠르고 정확하게 향상시키는 일이라고 보면 된다. 과거 개발자들이 만든 소스코드들이 게임을 정상적으로 재현하는지 확인하고, 게임 로직(게임을 실행시키는 프로그램)에 부하가 걸릴 경우 해결책을 마련한다. 게임이 개발되고 나면 시간이 지나면서 수 차례 업그레이드를 거치고, 이 과정에서 데이터가 점점 늘어나는 만큼 로직에 부하가 걸릴 가능성이 높다.
전공은 뭔가
대부분의 개발자와 마찬가지로 컴퓨터공학을 전공했다. 전공을 통해 게임 프로그래밍에 반드시 필요한 소스코드를 만들 때 사용하는 컴퓨터언어를 습득했고, 중앙연산처리장치(CPU)나 그래픽 처리장치(GPU) 등 하드웨어의 원리도 배웠다. 특히 게임은 프로그래밍 중에서도 난이도가 상당히 높은 축에 속하는 만큼, 하드웨어가 어떤 원리로 작동하는지 알고 있어야 실시간으로 빠르게 연산하는 프로그래밍을 할 수 있다.
어떻게 게임 개발자가 됐나
다른 개발자들도 그렇겠지만, 게임을 좋아해서였다(웃음). 게임을 좋아하니까 자주 하게 되고, 게임을 직접 개발하고 싶다는 생각을 했다. 특히 컴퓨터공학을 전공했기 때문에 게임을 직접 만들어보겠다는 생각을 할 수 있었던 것 같다. 하루에 3시간씩 자면서 게임 프로그래밍을 공부할 만큼 매달렸다.
게임 개발자가 되려면 어떤 소양이 필요한가
우선 게임을 좋아하고, 게임을 많이 알아야 한다. 또한 유저의 입장에서 내가 만드는 게임이 재미있고 즐거움을 주는지도 파악할 수 있어야 한다. 게임뿐만 아니라 일반적으로 프로그래머가 되려면 논리적인 사고가 필요하다. 컴퓨터에서 이뤄지는 연산은 A가 B를 통해서 C가 된다는 식의 논리적인 과정이기 때문이다. 실제로는 A에서 C까지 가는 데 필요한 연산과정이 B1, B2, B3… 등 복잡하고 많기 때문에 가장 최적화된 방법을 찾는 논리적인 사고가 필요하다.
▼관련기사를 계속 보시려면?