2018년 10월 11일 목요일

[2013. 2. 26] HumanIK Illustrated... HumanIK의 기본적인 기능이해를 돕는 영상...

2012년 5월에 youtube 올라온 영상이군요... 
이것은 게임쪽과 연관된 HumanIK이긴 합니다만... 일단 Maya 쪽에 포스팅합니다.
Maya에서 HumanIK툴을 찾아볼 수 있지만, 이것은 마야의 캐릭터 리그 셋업을 돕고 애니메이팅을 쉽게 하기위한 툴만은 아닙니다... HumanIK는 Maya뿐만 아니라, MotionBuilder 그리고 Autodesk의 Gameware중에 HumanIK 등...
 
HumanIK는 어찌보면, 기본적으로는 게임쪽에서 프로그래머와 애니매이터사이에 이러한 2족 캐릭터 Rig표준을 제시해서 애니메이터로서 CG패키지에서 애니메이션을 제작, 수정(모션캡쳐를 포합해서)하기가 쉬우면서도 이것이 C++ 같은 프로그래밍과 게임엔진에서 연계되어 다루어질 수 있는 Compatibility를 제공하기도 하는 것입니다.
 
이 영상에선 두가지 주요한 기능을 이야기 하고 있는데요...
하나는 Fullbody IK 이고, 다른 하나는 Retargeting입니다.
영상은 Fullbody IK를 먼저 다루고 있지만, 간단히 Retargeting을 얘기해보자면, 서로 스켈레튼 구조는 거의 비슷하나 비율이 상당히 다른 캐릭터 사이의 애니메이션키가 서로 전환될 수 있도록하는 기능입니다.
기본적인 비율의 사람을 이용한 모션캡쳐 데이터가 기괴한 비율을 가진 생물체, 드워프, 호빗 같은 다른 비율의 캐릭터에게도 그대로 정확히 전달되어 매우 자연스러운 동작을 만들어낼 수 있는 것도 이 기능으로 인한 것이죠.
 
사실 중요한 것은 Fullbody IK인데, 이것은 대단히 흥미롭습니다.
기본적으로 FK 키프레임애니로 캐릭터를 구현시키면서도 특정순간, 특정위치 등에서 특정부위 (손목, 발목, 머리 등 IK컨트롤러가 있는) 를 구속시켜 IK를 따르게 만들 수 있는 것인데, 즉 게임에서는 게이머나 컨트롤이나 상황에 따라서, 실시간으로 구현될 수 있는 것이죠.
이정도는 Maya에서 그저 FK/IK전환과 비슷하다고 할 수도 있습니다... 사실은 FullBody IK가 게임기술을 크게 진보시켰다고도 볼 수 있는데요.
IK컨트롤에 따라 적절하게 몸 전체적으로 움직임이 영향받는 것입니다... 영상을 보시면 알 수 있고, Maya에서 Fullbody 옵션켜고 한 번 움직여 보면 쉽게 이해할 수 있습니다.(어떻게 하는지는 아래 포스트들을 보시고 해보시고 여기서 다시 설명하진 않습니다.)
이 기능은 이 자체로도 용도가 많지만, 게임에서는 획기적으로 이용할 수 있습니다.
영상에서 어쎄신 크리드를 예로 보여주는 장면이 있습니다... 실제로 게임을 해보면, 정말 자연스럽게 플레이어가 컨트롤하는 캐릭터가 잡을 수 있는 것을 정확히 잡고, 짚을 수 있는 것은 짚고 올라서는 등. 게임환경과 캐릭터가 정말 정교하게 맞물려있습니다...
 
만일 이 Fullbody IK가 없다면 이를 어떻게 구현할까요? 단순히 애니메이션 모션만 입혀놓은 캐릭터를 가지고 이렇게 복잡한 게임속에서 컨트롤을 하다보면, 허공을 짚고 올라가기도 하고(물론 어느정도는 그럴 듯하게 보이도록 만들 수는 있습니다. 과거에 게임들은 그렇게 만들었구요) 어색해 보일 수 밖에 없습니다...
이 기능 이전의 과거의 게임들 중에는 제가 지금 기억나는 것은 바이오해저드 같은 경우인데, 캐릭터가 현장에서 어떤 핸들을 돌리는 이벤트같은 것이 있으면, 캐릭터가 손을 뻗어 그 핸들을 잡고 돌린다는 애니메이션은 있지만, 이게 캐릭터가 그 핸들에 다가간 위치에 따라서 핸들이 아닌 허공을 잡고 돌리는 상황이 나올 수밖에 없죠...
 어떤 게임은 그냥 이런정도 대로 두기도 하고,  어떤 게임은 캐릭터가 핸들을 잡을 수 있도록 특정위치와 방향으로 강제로 보내는데 이것도 좀 괜찮은 게임은 자연스럽게 그 위치로 걸어가서 그 방향으로 돌아서는 동작을 강제로 넣지만, 좀 부족하게 만든 게임의 경우는 그냥 갑자기 캐릭터가 튕기듯이 순간이동시켜 놓는 경우도 많았습니다... 물론 해당위치에 최대한 가깝게 도착했을 때, 이벤트가 실행되도록 해놨기 때문에 순간이동하는 느낌은 아니고, 캐릭터의 동작이 갑자기 튀는 느낌이죠...
 
그러나 영상이 보여주듯이 이렇게 동작이 부드럽고, 실제처럼 맞아떨어지게 만들기는 거의 불가능합니다...
 
또한 MotionBuilder에 관한 얘기가 나오는데, 이것은 Motionbuilder가 C++를 이용해서 실제 게임엔진에서 runtime되어 작동할 때, 디버깅하기도 하고, 세팅작업을 해야 할 것 등을 매우 유용하게 해줄 수있다는 것입니다... 이럴려고 개발된 툴이니만큼 강력하죠...
 
마지막으로 실제 사용된 예를 보여주는데, 니드포스피드 같은 경우도 캐릭터 끼리의 격투장면에서 이렇게 서로 잡고, 때리고, 맞는 포인트가 합이 딱딱 맞도록 Fullbody IK의 효과적인 사용을 잘 보여줍니다... 그 뒤의 다른 예도 마찬가지구요.
 
마지막의 글들은 구체적으로 어떤 경우 HumanIK가 유용한가를 써넣은 것입니다.
 
1. 메모리공간을 줄이기위해, 캐릭터들 사이에 애니메이션 데이터를 공유시킬 수 있다. (Retargeting)
2. 캐릭터의 두 발을 정확히 땅에 붙여놓을 필요가 있을 때. (Floor Contact) (이건 계단이나 바위투성이의 길을 오른다거나 할 때를 생각하면 되겠죠.)
3. 프로그래머가 요구하는 바를 애니메이터에게 정확히 이해시킬 필요가 있을 때, (그 반대의 경우도 마찬가지) (Motion builder interop') (직관적으로 모션빌더같은 툴상에서 구현해 보여주면 되니까요)
4. 캐릭터가 손으로 어떤 물체들을 정확히 잡을 수 있도록 만들 필요가 있을 때.(바닥에 떨어진 어떤 물체나 자동차핸들 등...) (BodyPart IK 나 FullBody IK)
5. 캐릭터가 그 3D 주변환경(기어오르기, 매달리기 등등)과 강력하게 상호작용할 필요가 있을 때. (BodyPart IK 나 FullBody IK)
6. 캐릭터들 끼리 강력하게 서로 상호작용할 필요가 있을 때(붙어 서로 싸우기, 펀치, 발차기)(BodyPart IK 나 FullBody IK)
7. 쉽게 통합되고 이해할 수 있는 IK솔루션이 필요할 때. (하나의 lib(정적 라이브러리 파일), 5개 헤더파일, 10개 함수들 : 프로그래밍시 쉽게 배워 사용할 수 있음을 예시하기 위한 것)
8. 멀티플랫폼을 위한 IK솔루션이 필요할 때 (Xbox360, PS3, Wii, iOS, Linux, Windows)



댓글 없음:

댓글 쓰기