로그인

회원가입 | ID/PW 찾기

연재

샤이아에 적용된 망토 시뮬레이션은 어떻게 구현했을까?

게임 프로그래머 문기영의 ‘게임 프로그래머 이야기’ ⑩

ProgC 2014-04-18 11:10:04
<샤이아>(Shaiya)라는 게임을 들어본 적이 있나 모르겠다. 이 게임은 소노브이에서 개발했는데, 추후에 넥슨에 인수됐다. 필자가 작업할 때는 2006년 즈음으로 기억한다.


이 회사는 필자가 군대에 가기 전에 초기 구성원으로 입사해서 일을 조금 하다가 군대를 전역하고, 다시 회사로 복귀해서 본격적으로 일했다. 물론, 이때는 게임의 많은 부분이 완성되어 있었다. 총 4~5명(클라이언트, 서버 포함)의 프로그래머가 이 게임을 개발했고, 3년 정도의 시간이 걸린 것으로 기억한다.

필자는 클라이언트, 서버 구분 없이 테크니컬 프로그래머로 근무했었는데, 당시에는 업무가 정해져 있지 않았고 그냥 필자 스스로 재미있는 것들, 흥미로운 것들, 도전적인 것들을 프로그램으로 구현해서 게임에 넣어보는 일을 했다.

가장 먼저 만들었던 것은 망토 시뮬레이션이었다. 당시에 출시되는 MMORPG의 99%는 망토 시뮬레이션이 존재하지 않았다. 왜냐하면, 컴퓨터 성능도 좋지 않았고 굳이(?) 그런 것을 만들어서 넣을 필요가 없었다. 하지만 필자는 그런 것들은 별로 개의치 않았고, 하고 싶은 걸 하는 성격이라 굳이(?) 데모를 만들었었다.


데모동영상. 오래된 영상이라 구하기가 힘들었다. 바람의 세기를 조절하고 마지막에 R키를 눌러 중력에 의해 바닥에 떨어지도록 했다.


망토 시뮬레이션이 반드시 필요했을까? 그렇다면 망토시뮬레이션을 하지 않는다면 다른 게임들은 망토를 어떻게 구현했을까? 3D 게임에서 캐릭터 및 애니메이션을 구현하기 위해서는 모델러(Modeler)와 애니메이터(Animator)의 도움이 필요하다.

 

그림은 에픽게임즈에서 개발한 기어즈오브워(Gears of War)의 주인공 캐릭터인 마커스의 모델과 그 뼈대의 모습이다. 이러한 뼈대를 애니메이터가 움직여 주면 캐릭터의 원하는 자세를 얻을 수 있다. 그리고 게임엔진에서는 애니메이터가 만든 이러한 뼈대 정보를 저장해 놓았다가 게임에서 보여줄 때 원활한 프레임으로 차례차례 보여주는 것이다.

캐릭터에게는 걷기, 뛰기, 공격하기, 쓰러지기 등등 아주 다양한 애니메이션이 존재한다. 보통은 이러한 애니메이션들을 그대로 사용하지 않고, 다른 애니메이션들과 블랜딩해서 새로운 애니메이션을 얻는다.

※ 노트: 예전에 캐릭터 애니메이션의 블랜딩이 어떻게 동작하는지 간략하게 배워보았다. 이전 연재를 참고하시길.

이렇게 우리가 게임에서 보는 거의 대부분의 애니메이션들은 애니메이터가 미리 만들어놓은 것들을 보는 것이다. 이제 이러한 캐릭터가 총을 들고 있다고 생각해보자.

총은 예상외로 쉽게 구현할 수 있다. 왜냐하면, 뼈대 시스템(Bone animation system)을 사용하면 원하는 뼈대의 정보를 언제나 얻을 수 있고 총, 검과 같은 것들을 원하는 뼈대에 붙이기만 하면 새로운 애니메이션을 얻을 수 있기 때문이다.

 

그림에서 알 수 있듯이 마커스가 사용하는 무기 ‘렌서’에 달려있는 Root부분을 캐릭터의 Weapon 뼈대에 붙이기만 하면 그 이후에 캐릭터가 행동하는 모든 애니메이션에 총이 붙어있는 자연스러운 모습을 연출할 수 있다. 이것의 장점은 캐릭터가 다른 총을 들고 있을 때도 같은 캐릭터 애니메이션을 이용할 수 있다는 점이다.

요즘 대부분의 3D게임은 이러한 뼈대 애니메이션으로 게임 캐릭터의 애니메이션을 구현한다. 이제 본격적인 예로, 망토의 경우는 어떨까?

망토의 경우는 총의 간단한 예와는 다르다. 망토는 캐릭터의 움직임에 맞게 펄럭거리는 애니메이션을 표현해야 하고, 이 애니메이션을 구현하려면 애니메이터가 엄청나게 고생해야 한다. 펄럭거리는 애니메이션을 자연스럽게 만드는 작업은 많은 노력이 필요한 부분이다. 

문제는 이뿐만이 아닌데, 캐릭터의 크기가 달라진다거나 캐릭터 종류마다 공격 애니메이션의 동작이 다르다면 각각의 애니메이션에 맞게 모든 망토 애니메이션을 제작해야 한다.

망토 애니메이션이라고 하는 것은 결국 펄럭거리는 것을 표현하는 것이다. 이것을 애니메이터가 일일이 만들지 않고, 물리 시뮬레이션을 이용해 납득할 만큼의 애니메이션 결과물이 나온다면 애니메이터가 직접 만들지 않아도 된다. 

그래서 필자는 샤이아에 망토 물리 시뮬레이션을 적용했다. 그렇게 해서 얻은 결과는 애니메이터가 모든 망토 애니메이션을 만들지 않아도 되었고, 이후에 캐릭터 애니메이션이 추가되더라도(공격 동작이 추가된다거나 하는 등) 망토에 관한 애니메이션 문제는 물리를 이용하면 되었기 때문에 추가 작업이 필요하지 않았다.

그렇다면 이것은 어떻게 구현했을까?

먼저 3D 게임에서 캐릭터나 배경을 어떻게 표현하는지 알아보자. 3D 컴퓨터 그래픽스에서 캐릭터나 배경을 표현하기 위해서는 삼각형을 이용한다. 이전에 보았던 무기 ‘렌서’의 그림을 보면, 아주 많은 삼각형을 이용해서 무기를 표현하고 있음을 알 수 있다. 3D 게임에서 나타나는 모든 것들은 이처럼 삼각형을 이용해서 표현할 수 있다. 

망토 역시 마찬가지다. 최종적으로 우리에게 보여지는 망토는 아주 멋지게 펄럭거리고 있지만, 내부적으로는 아주 많은 수의 삼각형들이 서로 연결되어 있고, 이러한 것들이 올바르게 움직일 경우에 펄럭거린다는 환상을 주는 것이다.

이제 필자가 이전에 고등학교에서 강의했었을 때 예제로 만들었던 옷감 시뮬레이션의 영상을 보도록 하자.



영상에서 알 수 있듯 보통 게임에서 우리가 보는 장면은 오른쪽에 있는 태극기의 모습이며, 실제 내부적으로는 왼쪽처럼 수많은 삼각형들이 연결된다. 이 삼각형들이 가진 각각의 정점(Vertex)들이 움직여 최종적으로 옷감 혹은 망토와 같은 효과가 나타나는 것이다.

하나의 삼각형은 3개의 정점을 가지고 있고, 이러한 정점들을 실제와 같이 움직여 주면 옷감 시뮬레이션을 누구나 할 수 있다. 문제는 ‘실제와 같이’다. 이전에 물리 프로그래머가 하는 일에 대해서 간략하게나마 알아보았었다. 이 ‘실제와 같이’를 해결해 주는 것이 바로 물리 프로그래머가 하는 일이다.

빨간색으로 표현된 것이 정점이다.

필자는 지금까지 연재에서 수학의 중요성에 대해 여러 번 강조했었는데, 그 이유를 이제 알 수 있을 것이다. 물체의 운동을 표현하기 위해서는 운동역학에 대해 알아야 하고, 이 운동역학이라는 것은 물체의 운동과 힘에 관한 학문이다. 이 운동과 힘의 관계를 기술한 방정식을 운동 방정식이라고 하고, 우리가 고등학교에서 배웠던 뉴턴의 운동 법칙이 바로 그것이다.

속도는 위치를 시간으로 미분하면 얻을 수 있고, 이것은 ‘단위 시간당 움직인 위치의 변화량’이라고 이해할 수 있다. 그리고 이 속도를 시간으로 또 미분하면 가속도를 얻는데, 이것은 ‘단위 시간당 속도의 변화율’로 이해할 수 있다.

이제 뉴턴의 운동법칙을 살펴보도록 하자. 뉴턴의 운동법칙 중에서 두 번째 법칙이 바로 힘에 관한 법칙인데, 바로

F = m * a

라는 식이다. 이 식은 물체에 가해지는 힘 F는 질량이 m인 물체가 a라는 가속도로 움직일 때 그 물체에는 현재 m*a만큼의 힘 F가 가해지고 있다고 말할 수 있다. 이것으로 가속도와 힘의 관계를 알 수 있다. 이 식을 가속도에 관한 식으로 정리하면,

a = F / m

으로 나타낼 수 있다. 이것은 힘 F와 질량 m을 알고 있으면 가속도 a를 구할 수 있다는 뜻이다.

앞서 옷감을 표현할 때 내부적으로 삼각형으로 표현되고, 이 삼각형들은 정점들로 표현되었다. 이 정점을 하나의 질점(파티클)으로 표현하면 운동을 더 쉽게 표현할 수 있는데, 이 때 질점의 질량만 알고 있으면 질점에 가해지는 힘 F를 이용해 가속도를 구할 수 있고 이것으로 속도를 계산 할 수 있다. 그리고 이 속도를 질점들의 위치에 적용하면 위치를 얻게 된다.

실제로 옷감을 구현하기 위해서는 고등학교 때 배웠던 후크의 법칙도 알아야 하는데, 후크의 법칙은 다음과 같다.

F = -k * (L - L0)

k는 스프링의 탄성계수이며, L은 현재 스프링의 길이 L0은 스프링의 평행상태에서 길이이다. 이것을 이해하기 위해서 현재 스프링의 길이 L이 10이라고 생각해보자. 그리고 평행상태에 있는 스프링의 길이 L0도 역시 10이라고 생각하자. 그렇다면,

F = -k * ( 10 - 10 )

이므로 k값이 무엇이 되던 F는 0이 되어 평행상태를 유지한다. 이제 스프링을 잡고 오른쪽으로 당겨본다고 생각해보자. (이 때 좌표계는 일반적인 2D 좌표계이며, 양의 x가 오른쪽, 음의 x가 왼쪽으로 향한다고 생각하자.) 그러면 L은 값이 커질 것이며 10보다 큰 값이 된다. 그렇게 스프링을 당겨서 L이 15가 되었다고 생각해보자.

이제 식에 값을 넣어서 다시 생각하면

F = -k * (15 - 10)

F = -k * 5

가 된다. 탄성계수k가 1이라면 F는 -5가 된다. 즉, 오른쪽으로 스프링을 당겼을 때 스프링의 힘은 왼쪽으로 향한다. (음수이기 때문에)

이제 반대로 스프링이 길이 10일 때 왼쪽으로 당겨보자. 즉, 길이를 5로 축소해 보는 것이다.

F = -k * (5 - 10)

왼쪽으로 당겼더니 F는

F = -k * (-5)

F는 -k * -5가 되어 F = 5k가 된다. k가 1이라면 F는 단순히 5가 된다. 즉, 양의 x축인 오른쪽이 된다. 이것으로 스프링을 표현할 수 있다.

질점은 서로 스프링으로 연결되어있다.

옷감 시뮬레이션을 위해서는 정점들이 서로 스프링으로 연결되어 있어야 한다. 스프링이 연결되어 있으면 질량과 탄성계수를 조절해서 천의 종류에 따라 다르게 표현할 수 있다. 하지만 무조건 스프링을 많이 쓰는 것은 좋지 않다. 당연히 성능 문제가 생길 수 있기 때문에 필요에 따라 스프링을 연결하거나, 연결하지 않는 것으로 천을 표현하면 된다.

이제 실제로 <샤이아>에 적용된 망토의 모습을 살펴보도록 하자.


<샤이아>에 적용된 망토.

캐릭터가 바닥에 앉거나 서 있을 때 캐릭터와 충돌하는 것을 막기 위해서 가상의 구를 허리 부분과 등 부분에 추가해서 망토와 캐릭터가 겹치지 않게 했다. 영상에서 알 수 있듯 캐릭터가 어떤 동작을 하더라도 망토의 움직임은 애니메이터의 추가 작업이 필요 없게 되었다.

※ 노트: 천, 옷감시뮬레이션에 대한 더 자세한 이야기는 필자보다 자세히 설명한 책들이 많이 있다. 필자가 공동저자로 저술했던 <게임개발테크닉>에 장원석 님이 쓴 <게임프로그래밍을 위한 물리학 용어>, 김성완 님이 쓴 <물리학을 이용한 게임프로그래밍>을 읽어보면 많은 도움이 될 것이다. 더불어서 David Conger가 쓴 <게임 프로그래머를 위한 물리모델링>, 데이비드 버그가 쓴 <생생한 게임 개발에 꼭 필요한 기본 물리>도 참고하도록 하자.

※ 노트: 필자가 만든 옷감 시뮬레이션은 거의 장난감 수준이고, 한국 기업인 FXgear에서 개발한 미들웨어는 정말 실제와 같은 옷감을 시뮬레이션해준다. <아이온>도 이 기술을 사용했고, 우리가 보았던 다양한 CG 애니메이션에도 이 기술들이 사용되었다. 더 자세한 부분은 //www.fxgear.net/ 참고하도록 하자.

최근의 게임은 더 실제와 같은 장면을 연출하기 위해 고등학교 수학 수준으로는 해결하기 힘든 것들도 많다. 특히 물과 같은 유체를 표현하는 것은 더욱 어려운데, 필자의 지인인 신효종씨가 개발했던 옥타브(Octave)엔진이 대표적이다. 옥타브 엔진은 유체를 시뮬레이션해주며, <철권 6>에 사용되기도 했다.


※노트: 옥타브엔진 영상 참고.

망토 시뮬레이션에 필요한 기술은 개발했지만, 실제로 게임에 적용하기 위해서는 추가작업이 필요했다. 망토를 부착할 캐릭터의 크기가 다르거나 망토의 특성마다 질량값 혹은 스프링의 개수가 다를 수 있기 때문이다. 이 작업을 위해서 툴이 필요했는데, 다음 연재에서 이러한 게임툴(도구)에 대한 이야기를 해보도록 하겠다.
  • 게임 프로그래머가 되려면 무엇을 공부해야 할까?

  • 게임은 혼자 만드는 것이 아니다

  • 샤이아에 적용된 망토 시뮬레이션은 어떻게 구현했을까?

  • 게임 개발에 사용되는 도구들 ①

  • 게임 개발에 사용되는 도구들 ②