가상 3d world에서 손을 뻗는 자세를 취하고 있는 캐릭터와 같은 동작을 옆 캐릭터에게 시키려면 어떻게 해야할까요? 단순히 같은 애니메이션을 적용시키면 되지 않을까 하고 생각할 수 있습니다.
애니메이션을 적용한다는 것은 joint 를 제어한다는 것과 같습니다. 실제 사람의 뼈처럼 캐릭터에는 가상 뼈가 존재합니다. 이 가상 뼈 즉, bone의 사이사이는 회전을 제어할 수 있는 joint가 존재하며, 이 joint의 회전을 통해 뼈의 움직임을 조작할 수 있습니다.
이미지에서 볼 수 있듯 어깨로부터 팔꿈치, 팔꿈치로부터 손목처럼 가상 뼈는 parent-child 관계로 계층적으로 이루어져 있습니다. 이를 통해 우측 이미지와 같이 어깨를 회전하면 아래 자식 뼈들도 함께 회전하게 됩니다. 이런 식으로 joint의 변형을 통해 애니메이션을 동작할 수 있습니다.
그러면 이 가상 뼈를 통한 애니메이션 적용을 상상해봅시다. 아래와 같이 애니메이션을 공유고자 하는 캐릭터가 표준 캐릭터, 작고 다부진 캐릭터, 크고 홀쭉한 캐릭터로 세 버전이 있다고 가정해 봅시다. 세 캐릭터가 총을 들고 전진하고 있는 모습을 취한다고 하면 대충 어떤 식으로 자세를 잡을지 상상할 수 있습니다.
만약 표준 캐릭터의 애니메이션을 그대로 다른 두 캐릭터에 적용한다면 다음과 같은 모습으로 적용됩니다.
머릿 속으로 상상했던 모습과 달리 원치않은 변형이 일어난 것처럼 보입니다.
애니메이션 리타겟팅은 이런 기존의 어떤 캐릭터로부터 다른 캐릭터에 동일한 애니메이션을 재생하려는 시도로부터 시작합니다. 이런 불필요한 변형을 방지하기 위해 리타겟팅을 사용하는 것입니다. 애니메이션 리타겟팅은 스켈레톤, 즉 가상 뼈대를 사용하는 캐릭터 간에 애니메이션을 공유할 수 있도록 해주는 기능입니다.
캐릭터에 리타기팅을 적용한 결과, 방정식을 통해 비율 차이를 계산하여 캐릭터에 애니메이션이 제대로 적용된 것을 확인할 수 있습니다. 살색 표시는 원래 스켈레톤을, 흰색은 현재 스켈레톤으로 두 리타겟팅 전 스켈레톤과의 차이를 확인할 수 있습니다. 표준 캐릭터는 리타기팅되지 않은 bone과 스켈레톤에 완벽히 일치하는 것으로 보입니다. 이렇게 리타겟팅을 사용하면, 캐릭터 사이에 애니메이션 애셋을 공유하여 애니메이션을 완전히 새로 만들 필요가 없어져 메모리를 효율적으로 사용할 수 있습니다.
캐릭터들은 크기, 비율, 모양이 제각각이기 때문에 캐릭터마다 본 개수, 본 이름, 오리엔테이션 등의 다양한 유형의 뼈를 가집니다. 따라서 언리얼 엔진에서는 하나의 캐릭터에서 다른 캐릭터로 애니메이션을 리타기팅하는 유연한 툴을 제공합니다. 이러한 방법 중 하나가 바로 IK Rig 및 IK Retargeter를 함께 사용하는 것입니다. 이를 사용하면 스켈레톤 계층구조 및 비율이 현저히 차이나는 캐릭터들을 리타기팅할 수 있습니다.
IK Rig를 사용하여 다양한 스켈레탈 메시 간에 애니메이션을 공유하는 IK Retargeter를 구성할 수 있습니다. 서로 다른 스켈레톤은 각기 다른 bone 개수, bone 이름, orientation 등으로 정의되어 있는데 이는 IK rig을 통해 제어할 수 있습니다. 예를 들어 서로 다른 캐릭터의 팔을 구성하고 있는 bone이 각각 3개, 5개로 구성되어 있는 상황을 가정해봅시다. 조인트와 본의 개수가 달라 1대 1로 바로 매핑시킬 수 없는 상황에 IK Rig은 이를 리타겟 체인을 통해 매핑합니다.
팔을 조인트와 본으로 구성된 스켈레톤이 아닌 조인트 체인으로 정의하여 매우 차이가 큰 본 구조체를 가진 캐릭터들을 한층 유연하게 리타기팅할 수 있습니다. 리타기팅할 모든 주요 팔다리에 대해 체인을 생성해야 합니다.
Using Unreal engine market place
Using Mixamo
리타겟팅된 애니메이션을 내보낼 수 있습니다.