실제 사람과 구별하기 힘든 왁스 인형을 만드는 것에서부터, 나의 의지를 반영하여 움직이는 꼭두각시 인형, 스스로 움직이는 로봇에 이르기까지 인간은 현실 세계에서 인간을 만들기 위한 다양한 노력을 해왔습니다.
하지만 현실 세계에서 사람을 만드는 작업은 아직 요원하기만 합니다. 가까운 미래에 실현될 것만 같았던 터미네이터 T-800이 과거로 보내지기까지 이제 15년 밖에 남지 않았습니다.
어찌보면 아이로봇, 터미네이터, 트랜스포머등과 같이 인공 지능을 가지면서 사람처럼 움직이는 기계를 다루는 영화들은 인간이 이러한 꿈을 영상으로나마 충족시켜주기 때문에 흥행에 성공하는 것이지 않나 싶습니다.
하지만 필자는 게임 기술이야 말로 새로운 형태의 인간을 창조할 수 있는 가장 진보된 기술이라고 생각합니다. 게임은 영상과 다르게 사람의 의지(컨트롤)를 게임패드라는 매개체에 담아 우리가 창조한 인간과 실시간으로 소통할 수 있기 때문입니다.
■ 사람을 빚는 기술 현실 세계에서 사람의 모형을 만드는 과정을 살펴보면 이렇습니다. 안정성을 위해 먼저 뼈대를 세워서 튼튼히 지지한 다음, 그 위에 살에 해당하는 재료인 점토를 붙이는 방법을 사용합니다.
게임 세계에서의 사람도 이와 유사하게 뼈대와 살로 구성됩니다. 다만 게임 세계에서 사람의 뼈대는 스켈레톤(Skeleton), 살은 메시(Mesh)라고 부릅니다.
스켈레톤과 메시가 만들어지면, 서로 붙여야 합니다. 이를 '가중치'라고도 하는데, 가중치를 통해 스켈레톤과 메시가 연결되면 게임 엔진은 스켈레톤의 움직임에 따라 메시가 부드럽게 변형시켜서 부드러운 사람을 만들어내게 됩니다.
이러한 기술을 스키닝(Skinning)이라고 하는데, 상당히 오래전에 개발되었는데도 불구하고, 아직도 게임 세계에서 캐릭터를 표현하는 기본으로 사용되고 있습니다.
유니티 엔진과 언리얼 엔진 4 모두 스켈레톤과 메시로 구성된 게임 세계의 사람을 만들기 위한 전문 솔루션을 제공합니다.
특별히 유니티에서는 이를 메카님(Mecanim), 언리얼 엔진 4에서는 페르소나(Persona)라고 하는데, 두 솔루션은 모두 스켈레톤의 설정에서부터 시작합니다.
사람을 포함해 물체가 행동할 다양한 움직임들을 만들 수 있도록 스켈레톤을 설계하는 것을 리깅(Rigging)이라고도 하는데, 유니티 메카님에서는 사람에 한해 유니티의 다양한 기능을 사용할 수 있도록 점검해주는 기능을 아래와 같이 제공합니다.
언리얼 엔진은 우측 상단에 스켈레톤 → 메시 → 애니메이션의 순서로 차례대로 캐릭터를 구성하도록 명확한 가이드라인을 제시해줍니다. 스켈레톤을 이루는 각 본들을 어떻게 사용할 것인지 설정하는 화면이 제공됩니다.
두 엔진 모두 오토데스크사의 FBX 포맷을 지원하기 때문에 유니티에서 사용하던 캐릭터 및 애니메이션 데이터를 언리얼 엔진에서도 문제없이 사용할 수 있습니다.
이렇게 뼈대가 완성되면 뼈대와 연결되는 메시로 캐릭터의 외관을 제작한 후, 표면에 재질을 입혀서 실제 사람의 모습을 만들어냅니다.
사람의 피부는 반투명한 성질을 가지고 있고, 피부 아래에는 다양한 인체의 조직들로 채워져 있습니다. 빛이 피부에 닿으면 피부의 반투명한 성질로 인해 빛의 일부가 내부로 침투되고, 피부 내에 있는 조직에 부딪히면서 여러 방향으로 산란되어 퍼지게 됩니다.
이러한 피부와 빛의 성질을 반영하기 위해서 컴퓨터 그래픽에서는 SSS(Subsurface Scattering)라 불리는 셰이더 기술을 고안했습니다.
하지만 이런 셰이더는 계산량이 많습니다. 때문에 움직이지 않는 사람 모형에 사용한다면 모르겠지만 많은 수의 캐릭터가 실시간으로 움직이는 게임에서 이 셰이더를 그대로 사용하기에는 무리가 있습니다.
언리얼 엔진 4에서는 실용적으로 피부를 표현하도록 별도로 스킨 모델(Preintegrated Skin)을 제공합니다. 이를 사용하면 앞서 설명한 SSS 셰이더보다 더 적은 계산으로 SSS와 유사한 피부를 표현할 수 있게 됩니다.
■ 사람을 움직이는 기술 스켈레톤과 메시를 설정하여 사람의 형태를 빚었다면, 이제 살아 움직이게 만들어야 합니다.
게임 세계 사람을 리얼하게 움직이도록 게임 엔진에서는 키 프레임으로 구성된 데이터를 재생하여 애니메이션을 구성합니다.
애니메이션의 특정 시각에 스켈레톤을 이루는 각 본들의 위치와 회전을 지정한 데이터를 '키 프레임'이라 하는데, 게임 엔진은 키 프레임별로 각 본의 위치와 회전 값의 차이의 분석하여 전체적으로 부드러운 움직임을 만들어줍니다.
이론적으로는 키 프레임이라는 기술 자체는 복잡한 것은 아니지만, 자연스러운 캐릭터의 움직임을 구현한다는 것은 기술보다는 많은 노하우를 요하는 일이기에 캐릭터의 애니메이션 작업은 많은 시간이 소요됩니다.
애니메이션 제작 작업이 어렵다보니 배우가 수트를 입고 직접 모션을 연기하면 이를 감지하여 애니메이션 데이터를 자동으로 만들어주는 '모션 캡쳐'와 같은 방법도 게임에서 종종 사용되어 왔습니다. 그리고 애니메이션 작업의 효율성을 높이기 위해 한 번 만들어진 모션을 체형이 다른 캐릭터들에게 재활용하여 사용하는 기술이 고안되었습니다. 이를 리타겟팅(Retargeting)이라고 합니다.
유니티와 언리얼 엔진 모두 이러한 리타겟팅 기능을 제공합니다.
리타겟팅을 사용하면 작업 속도 단축과 예산 절감등 많은 장점이 있기 때문에, 애니메이션이 많이 사용되는 프로젝트는 이를 적극적으로 도입하고 있습니다.
■ 애니메이션들의 혼합 우리는 무의식적으로 리듬에 맞춰 좌우 다리를 번갈아 앞으로 내놓으면서 원하는 위치까지 걸어가면서 이동합니다. 그리고 이동 중에 방향을 변경하거나 특정 물체를 바라봐야 하는 경우가 생기면, 추가적인 허리를 틀거나, 고개를 돌리는 데 필요한 근육을 사용해 걷는 동작과 혼합합니다.
이렇게 미세하면서도 복잡한 인간의 움직임을 게임 세계에서 그대로 구현하려면, 단순히 걷는 애니메이션 하나만 사용하는 것에는 한계가 있습니다.
게임 엔진들은 기본 동작과 다른 동작을 혼합하는 새로운 애니메이션을 구현하는 기능을 제공합니다.
유니티는 상황에 따라 애니메이션들이 다양하게 혼합할 수 있도록 블렌드트리(Blend Tree)라는 기능을 제공합니다. 이 기능은 프로그래밍적으로 깊은 지식이 없어도 사용 가능한 것이 특징입니다.
언리얼 엔진도 유사하게 블렌드스페이스(BlendSpace)라는 기능을 제공하며, 직관적인 인터페이스와 미리보기 기능으로 캐릭터의 움직임을 섬세하게 제작해줍니다.
이렇게 이동에 대해 섬세한 동작을 구현했다면 점프, 구르기, 공격과 같은 다른 다양한 동작도 게임 내 상황에 따라 구현되어야 합니다.
게임 엔진에서는 이를 위해 캐릭터의 현재 정보를 파악하고 이에 맞게 적절한 애니메이션을 재생하도록 설계하는 기능을 제공합니다.
예를 들어, 현재 캐릭터가 가지고 있는 이동속도 정보를 계속 측정하고 이 수치에 따라 걷기나 뛰기 같은 애니메이션을 자동으로 재생한다던가, 캐릭터가 지면 위에 있는지를 체크하고 지면에서 떨어지면 점프 애니메이션을 재생하게 하는 등의 시스템입니다.
유니티 엔진과 언리얼 엔진은 유한상태기계(Finite State Machine)라 불리는 기법을 사용하여 상황에 따른 움직임을 설계할 수 있게 인터페이스를 제공합니다.
게임의 성격에 따라 틀리겠지만, 대작으로 갈 수록 이러한 직관적인 인터페이스를 사용하여 복잡한 애니메이션 시스템을 편집하는 것이 필요합니다. 아래 그림은 배틀필드에서 움직임에만 사용되는 애니메이션 시스템의 구성 예입니다.
■ 물리 법칙과의 조화 살아있는 인간은 근육을 조절하여 중력을 이겨내면서 원하는 동작을 만들어냅니다. 하지만 영혼이 빠진 죽은 사람은 중력을 이겨내지 못하고 바닥에 털썩 주저 앉습니다.
지금까지 설명한 애니메이션 기술은 살아있는 인간이 만들어내는 동작을 데이터화하여 이를 재생하는 시스템입니다.
하지만 게임 엔진이 제공하는 물리 엔진을 사용하면, 굳이 죽는 애니메이션 동작을 별도로 만들지 않아도 자연스럽게 주위 환경에 반응하면서 쓰러지게 만들 수 있습니다. 이를 랙돌(RagDoll) 시스템이라고 합니다.
랙돌 시스템은 각 본들에 강체(Rigidbody)와 충돌체(Collider)라 불리는 물리 기능을 설정하여 물리 엔진 시스템이 제공하는 중력의 영향을 받고 주위 물체와 충돌 상호작용이 일어나도록 만들어주는 기술입니다. 각 본들이 연결된 관절 부위는 물리 엔진이 제공하는 조인트(Joint)기능을 부착하여 관절이 서로 떨어지지 않고 부드럽게 흐느적 거리도록 설정할 수 있습니다.
사실 유니티에서는 랙돌 시스템을 만들어주는 기능을 제공하지만 기능적으로는 많이 미흡합니다. 반면 언리얼 엔진에서는 PhAT라는 전문적인 물리 시스템을 제공합니다.
아래는 언리얼 엔진이 제공하는 물리 기능과 애니메이션 기능이 결합된 예시입니다. 스켈레톤을 구성하는 본에 물리적인 타격을 주어 생동감있게 타격을 받는 움직임을 만들어줍니다.
물리 엔진과 애니메이션 시스템을 둘 다 게임에서 사용하려면, 애니메이션 시스템만큼 정교한 물리 엔진을 가지는 것이 중요합니다. 그래서 대부분의 시스템을 자체 개발하는 것으로 알려진 언리얼 엔진이라도 물리 엔진은 엔비디아(NVidia)의 피직스 엔진을 사용합니다.
유니티도 동일한 피직스 엔진을 사용하지만 예전 버전인 2.8버전을 사용한다는 점에서 최신 버전을 사용하는 언리얼 엔진과 많은 차이가 있습니다. 하지만 유니티5에서도 피직스 엔진의 최신 버전(3.3)을 도입한다고 발표하였기 때문에 많은 개선이 이루어질 것으로 예상됩니다.
필자가 물리 엔진의 버전을 강조하는 이유는, 이로 인해 표현할 수 있는 효과의 차이가 크기 때문입니다. 최신 버전의 피직스 엔진에는 APEX라 불리는 프레임웍이 있는데, 사실적인 폭파 효과와 빠르면서도 리얼한 천(Cloth)의 움직임을 구현할 수 있습니다. 찰랑찰랑한 머리결로 큰 화제가 되었던 툼레이더의 사례에도 볼 수 있듯이, 작지만 캐릭터에 부착된 부가 요소들은 게임 세계에서 현실적인 사람을 만드는데 큰 역할을 담당합니다.
지금까지 게임 세계에서 리얼한 사람을 만드는 기술에 대해 살펴봤습니다.
GDC에서 언리얼 엔진이 발표한 영상의 끝 부분을 보면, 지금까지 설명된 모든 기능이 조화를 이루어 한 편의 영화와도 같은 격투장면이 실시간으로 표현되는 것을 볼 수 있습니다.
이번 기고에서는 각 엔진들이 제공하는 모든 기능을 설명하지는 않았지만, 중요한 개념에 대해 전반적으로 살펴보았습니다. 점점 더 많은 사람들을 게임 제작의 세계로 이끌기 위해 유니티와 언리얼 엔진은 모두 진화하고 있습니다.