애니메이션 리깅(animation rigging)
캐릭터 애니메이션의 뼈대(스켈레톤)를 설정하고 조작하는 과정이다. 이를 통해 캐릭터의 움직임을 자연스럽고 유기적으로 만들 수 있다.
먼저 패키지 매니저에 있는 Animation Rigging을 Install 해준다. Animation Rigging을 설치하면 애니메이션과 관련된 여러가지 컴포넌트들을 사용할 수 있다.
정상적으로 설치되었다면 왼쪽 상단 탭에 Animation Rigging이라는 항목이 추가로 생길 것 이다.
Animation Rigging을 눌러보면 아래의 항목이 나온다. 각각 설명하자면
Align Position - 두 트랜스폼의 위치를 일치시킴, 두 객체의 위치를 정확히 맞추어야 할 때 사용(물체를 잡는 등)
Align Rotation - 두 트랜스폼의 회전을 일치시킴, 첫 번째 트랜스폼의 회전을 두 번째 트랜스폼의 회전으로 설정하여 두 회전을 일치시킴
Align Transform - 두 트랜스폼의 위치와 회전을 일치시킴, 두 객체의 위치와 회전을 동시에 맞추어야 할 때 사용
Restore Bind Pose - 리깅된 캐릭터를 초기 바인드 포즈로 복원(T-pose)
Rig Setup - 리깅 설정을 관리하고 구성하는 데 사용, 리깅할 오브젝트를 클릭 후 Rig Setup을 해줌
Bone Renderer Setup- 캐릭터의 뼈대를 시각적으로 표시
원하는 오브젝트를 리깅하기 위해서는 먼저 오브젝트를 클릭하고 Rig Setup을 통해서 세팅을 해준다. 그러면 자신의 컴포넌트에 Rig Bulider가 생기고 자식 오브젝트로 Rig Layer가 생성된다. Rig Bulider 컴포넌트 안에는 이미 Rig Layer가 할당 되어있을 것이다.
그 전에 먼저 IK(Inverse Kinematics)라고 부르는 '역운동학'에 대해서 알 필요가 있다.
IK(Inverse Kinematics)
손, 발 등의 목표 위치와 방향을 지정했을 때, 이 목표를 달성하기 위해 각 관절의 각도를 계산하는 방법이다.캐릭터의 팔을 구성하는 어깨, 팔꿈치, 손목 각도를 지정하여 손의 위치를 결정한다.
IK를 이용해서 캐릭터의 손, 발이 특정 위치에 닿아있어야 할 때, IK를 사용하여 자연스러운 움직임을 생성할 수 있다. 그래서 움직이는 물체를 잡거나 장애물을 넘을 때 IK를 유용하게 사용할 수 있다.
IK에 사용되는 알고리즘은 총 세 가지가 있다.
1. CCD (Cyclic Coordinate Descent)
각 관절을 순차적으로 조정하여 목표 위치에 도달하도록 하는 방법이다. 반복적인 계산을 통해 점진적으로 목표에 접근한다.
2. FABRIK (Forward And Backward Reaching Inverse Kinematics)
정방향과 역방향으로 계산을 반복하여 목표 위치에 도달한다. 각 관절의 위치를 점진적으로 조정하여 목표에 근접하게 한다.
3. Jacobian Inverse수학적 행렬 계산을 이용하여 각 관절의 각도를 계산하는 방법이다. 정확하고 빠른 계산이 가능하지만, 수학적 복잡성이 크다.
그 중에서 파브릭 알고리즘을 사용하는 컴포넌트를 이용해서 애니메이션을 리깅할 예정이다. Two Bone IK Constraint 컴포넌트는 앞서말한 파브릭 알고리즘을 사용하였다. 끝 뼈의 위치에 따라서 중간 뼈와 처음 뼈의 위치, 방향, 회전 등이 달라진다.
Root - IK 체인의 시작 뼈에 해당한다. 팔의 경우 어깨 뼈, 다리의 경우 골반이나 허벅지 뼈에 해당한다.
Mid - IK 체인의 중간 뼈에 해당한다. 팔의 경우 팔꿈치, 다리의 경우 무릎 뼈에 해당한다.
Tip - IK 체인의 끝 뼈에 해당한다. 팔의 경우 손목, 다리의 경우 발목 뼈에 해당한다.
Target - IK 목표 위치이다. Tip 뼈가 이 위치로 이동한다.
Hint - 중간 뼈(Mid)의 방향을 제어하기 위한 추가적인 트랜스폼이다.
자식 오브젝트로 생성된 Rig Layer의 하위 오브젝트를 추가하여 Right Hand IK로 설정한다. 오른쪽 손을 리깅함으로 Tow Bone IK Constraint 컴포넌트를 추가하여 Root, Mid, Tip을 설정한다.
Root는 어깨, Mid는 팔꿈치, Tip은 손을 필드에 할당하였고 무기가 손에 닿아야 하기 때문에 Target 필드에는 무기를 할당하였다.
위의 상태에서 실행을 해보면 무기에 맞게 팔의 각도가 휘어져 있고 캐릭터를 움직여보면 무기 위치에 맞게 팔이 회전하는 것을 확인할 수 있다. 하지만 너무 부자연스럽기 때문에 각도와 방향을 잘 맞춰주어야 한다.
손으로 잡는 부분을 무기의 자식 오브젝트에 Right Hand Grip을 생성하고 손으로 자연스럽게 잡을 수 있는 부분에 트랜스폼을 잘 맞춰준다.
트랜스 폼을 잘 맞춰주었다면 어느정도 손의 위치가 크게 벗어나지 않는 모습을 볼 수 있다. 하지만 아직까지는 손바닥과 팔꿈치의 회전이 부자연스럽기 때문에 런타임 환경에서 Tip으로 설정한 손 오브젝트의 트랜스폼을 조정하여 값을 Copy한다. 또한, 손목이 너무 꺾이지 않도록 하기 위해서 검의 각도도 살짝 더 낮춰주었다.
트랜스 폼을 맞게 설정해주었다면 자연스럽게 손으로 검을 잡고있도록 리깅이 되어있을 것이다. 하지만 캐릭터를 움직여보면 무기는 그대로 있고 캐릭터만 움직이는 현상이 일어난다.
캐릭터가 움직일 때 Target도 따라가려면 Target으로 설정한 최상위 오브젝트에 Rig Transform 컴포넌트를 추가한다.
또한, 아직 Hint를 설정하지 않았기 때문에 움직일 때마다 리깅 애니메이션이 정상적으로 작동되지 않을 것이다. 따라서 팔꿈치에 해당하는 오브젝트의 자식으로 빈오브젝트를 추가하여 Right Hand IK Hint를 설정하고 팔꿈치의 약간 뒤에 트랜스폼을 위치해준다.
최종적으로 캐릭터가 움직여도 정상적으로 애니메이션이 리깅되면서 자연스럽게 움직이며, 어떤 방향으로 움직이든 검은 자연스럽게 회전하는 모습을 볼 수 있다. 이렇게 간단하게 애니메이션 리깅을 해보았다.