3D Video Production/Unreal Engine (5.6.1)

UE 5.6 Animation: Mixamo 애니메이션 블렌딩과 Constraints, C4D Pose Morph로 캐릭터 애니메이션 만들기

보별 2026. 9. 15. 16:58
반응형

지난 스켈레탈 메시 포스트에 이어 이번에는 Mixamo에서 가져온 여러 애니메이션을 언리얼 엔진의 Sequencer에서 연결하고, 총과 수류탄의 부모를 애니메이션 도중 변경하는 방법을 실습했다.

후반부에는 직접 준비한 캐릭터를 Mixamo로 Auto-Rig한 뒤 Cinema 4D의 Pose Morph를 이용해 얼굴 표정을 만들고, 이를 언리얼 엔진의 Morph Target과 FK Control Rig까지 연결했다.

이번 작업에서 특히 중요한 것은 애니메이션을 단순히 순서대로 배치하는 것이 아니다.
걷기에서 사격으로 넘어갈 때 캐릭터가 순간이동하지 않도록 위치를 유지하고, 서로 다른 애니메이션의 자세를 맞추고, 총의 부모를 오른손과 왼손 사이에서 전환하는 것처럼 각각의 데이터를 하나의 연속된 동작으로 연결하는 과정이 핵심이었다.

 

Mixamo에서 캐릭터와 Animation 준비하기

먼저 Mixamo에서 사용할 캐릭터 하나를 T-Pose 상태로 다운로드했다.

T-Pose는 양팔을 좌우로 펼친 기본 자세로, 캐릭터의 Skeleton을 확인하거나 이후 Animation을 적용할 기준 자세로 사용하기 편하다.

Mixamo의 Animation 항목에서 Pack을 검색하면 여러 동작이 하나의 묶음으로 제공되는 Animation Pack을 찾을 수 있다.

Pack 썸네일 옆에 작은 숫자가 표시되는데, 이 숫자는 Pack 안에 포함된 Animation 개수를 의미한다.
예를 들어 16이라고 표시돼 있다면 16개의 동작이 포함되어 있으며, 미리보기 화면에서는 해당 Animation들이 순서대로 재생된다.

필요한 Animation을 다운로드할 때에는 Skeleton Animation 데이터만 가져오면 되기에, 이번 작업에서는 Character를 포함하지 않는 No Character로 다운로드했다.

 

캐릭터와 Animation을 언리얼 엔진으로 Import하기

먼저 T-Pose 캐릭터를 언리얼 엔진으로 Import하고 Skeletal Mesh와 Skeleton을 생성했다.

그다음 Mixamo에서 받은 Animation 파일을 Import할 때에는 Animation만 가져오도록 Import Only Animation으로 설정하고 위에서 Import해둔 캐릭터의 Skeleton을 지정했다.

Import가 끝나면 Animation Sequence를 직접 열어 동작이 정상적으로 재생되는지 확인했다.

Animation Viewport 상단의 눈 모양 메뉴에서 Bones 관련 표시 옵션을 변경할 수 있다.
All Hierarchy로 설정하면 Skeleton의 전체 Bone 구조를 화면에서 확인할 수 있기 때문에 리깅 상태나 애니메이션 움직임을 확인할 때 유용하다.

언리얼 엔진의 Skeletal Mesh는 하나의 Skeleton Hierarchy를 사용하며 FBX Importer는 Mesh 하나당 하나의 Root만 지원한다.

다만 최상위 Bone의 이름이 반드시 문자 그대로 root여야 한다는 의미는 아니다.
Root Motion을 적극적으로 사용할 경우에는 별도의 Root Bone을 원점에 두는 구조가 특히 편리하다.

 

Sequencer에 Walking Animation 배치하기

캐릭터를 Level에 배치한 뒤 Level Sequence에 SWAT 캐릭터를 추가했다.

Animation Track을 만들고 Walking Animation을 배치하면 캐릭터가 걷기 시작한다.

Animation Section의 길이를 원본 Animation보다 길게 늘리면 동일한 Walking Animation이 반복되기 때문에 계속 걷는 것처럼 만들 수 있다.

다만 실제 이동 값이 포함된 Animation에서는 한 사이클이 끝난 뒤 다음 반복이 다시 Animation의 기준 위치에서 시작하면서 캐릭터가 원점으로 되돌아가거나 이동 위치가 끊기는 문제가 발생할 수 있다.

이 문제를 해결하기 위해 이번 실습에서는 동일한 Walking Animation을 복사해 서로 이어 붙이고 Motion Blending을 사용했다.

우선 walking Animation을 복사하여 두 개가 Sequencer에서 서로 이어져 재생되도록 했다.

뒤쪽 Walking Clip의 시작 프레임으로 Playhead를 이동한 뒤 해당 Animation Section을 우클릭하고 Match With This Bone In Previous Clip - Hips를 선택했다.

Motion Blending은 선택한 Bone의 위치를 이전 Animation의 같은 Bone과 비교한 뒤 필요한 Offset을 계산한다. 따라서 두 번째 Walking Animation이 자기 원점으로 돌아가지 않고 첫 번째 Animation이 끝난 위치에서 이어질 수 있다.

이렇게 Match가 적용된 Animation Section을 다시 복사해 뒤에 이어 붙이면 해당 Section에 저장된 Match Offset도 함께 복사되기 때문에 연속해서 앞으로 걷는 시퀀스를 빠르게 구성할 수 있다.

실제로 반복 이동 애니메이션을 만들 때에는 단순 Loop보다 각 Clip이 어디에서 시작해야 하는지까지 관리해야 화면에서 캐릭터가 제대로 전진한다는 점이 중요하다.

Hips가 항상 Match Bone의 정답은 아님

이번 작업에서는 Hips를 사용했지만 모든 Animation에서 Hips를 사용하는 것이 정답은 아니다.

이번에 사용한 SWAT Skeleton에서는 Hips가 최상위 Bone이기 때문에 Hips를 기준 Bone으로 지정했다.

Root나 Pelvis처럼 이동 정보를 가진 Bone을 이용할 수 있고, Walk와 Run을 연결하는 예제에서는 l_foot을 사용한다.

예를 들어 발이 지면에 닿아 있는 순간을 정확하게 유지해야 한다면 Foot Bone을 기준으로 맞추는 편이 자연스러울 수 있다.

반대로 전체 캐릭터의 이동 중심을 유지하는 것이 더 중요하다면 Root나 Pelvis/Hips가 좋은 기준이 될 수 있다.

따라서 Match Bone은 이름을 외우기보다 두 Animation 사이에서 어떤 위치를 가장 유지하고 싶은지를 기준으로 선택하는 것이 좋다.

 

Walking에서 Firing Animation으로 자연스럽게 연결하기

Walking Animation 뒤에는 Firing Animation을 추가했다.

이때 Walking이 완전히 끝난 다음 Firing을 시작하도록 딱 붙여놓는 것이 아니라 두 Animation Section을 어느 정도 겹쳐 Blend 구간을 만든다.

단순히 Animation Section을 겹치면 포즈는 보간되지만 두 Animation의 시작 위치가 서로 다르면 캐릭터가 미끄러지거나 튀는 것처럼 보일 수 있다.

이를 확인하기 위해 Animation Section을 우클릭한 뒤 Show Skeleton을 활성화했다.

메뉴 하단의 Show Skeleton을 체크하면 선택한 Animation Clip의 Skeleton을 Viewport에서 직접 볼 수 있다.

Viewport에서는 서로 다른 Animation의 Skeleton이 각각 다른 색으로 표시된다.
한 Skeleton은 초록색, 현재 캐릭터의 Skeleton은 자홍색으로 표시되어 있고, 두 Animation 사이의 위치 차이도 확인할 수 있다.

이 상태에서 Firing Animation의 Bone 위치가 Walking Animation이 끝나는 위치와 최대한 맞도록 Animation의 시작 Offset과 위치를 조정했다.

Blend가 자연스러우려면 비슷한 자세끼리 연결하는 것이 좋음

두 Animation을 자연스럽게 연결하려면 위치뿐만 아니라 캐릭터의 자세도 비슷한 프레임을 선택하는 것이 중요하다.

이번 Firing Animation은 왼발을 앞으로 내민 자세로 사격한다.

따라서 Walking Animation에서 오른발을 앞으로 내민 순간과 연결하면 Blend 구간에서 다리가 급격하게 바뀌어 어색할 가능성이 높다.

대신 Walking Animation 중 왼발이 앞으로 나오는 순간을 찾아 그 지점에 Firing Animation을 겹쳤다.

두 Animation의 Skeleton을 표시해 Bone 위치를 확인한 뒤 서로 최대한 비슷한 자세가 되는 시점을 맞췄다.

Blend 영역도 너무 짧으면 한 Animation에서 다른 Animation으로 급하게 넘어가면서 움직임이 튈 수 있으므로 일정한 길이를 확보해야 한다.

다만 “Blend 구간은 길수록 좋다”라고 생각할 필요는 없다.
지나치게 길면 두 동작이 오랫동안 섞이면서 발이 미끄러지거나 동작의 힘이 약해질 수도 있다.

결국 중요한 것은 충분한 Blend 시간과 비슷한 Pose를 함께 맞추는 것이다.

 

Firing → Reload → Firing 연결하기

사격 다음에는 Reload Animation을 추가하고 Firing Animation의 마지막 부분과 Reload Animation의 시작 부분을 약간 겹쳐 Blend 구간을 만들었다.

여기서도 Show Skeleton으로 두 Animation의 Bone 위치를 비교해 Reload Animation의 위치를 조정한 뒤, Reload가 끝나는 지점에는 Firing Animation을 다시 복사해 같은 방식으로 연결했다.

결과적으로 Sequencer에는 다음과 같은 연속적인 동작이 만들어진다.

Walking → Firing → Reload → Firing

각각 별개의 Animation Sequence이지만, Timeline의 위치와 Bone 위치를 조정하면 하나의 연속된 연기처럼 보이게 만들 수 있다.

 

Grenade Throw Animation 추가하기

다음으로 기존 Firing Animation 뒤에 Grenade Throw Animation을 추가하고, Show Skeleton으로 Bone 위치를 확인하면서 두 동작이 자연스럽게 이어지도록 위치를 맞췄다.
수류탄 투척이 끝난 뒤에는 다시 Firing Animation을 배치해 연결했다.

따라서 최종 Character Animation은 대략 다음 흐름이 된다.

Walking → Firing → Reload → Firing → Grenade Throw → Firing

여기까지는 캐릭터의 Animation을 연결하는 작업이지만, 수류탄 투척 동작에서는 새로운 문제가 발생한다.

캐릭터가 평소에는 오른손으로 총을 들고 있는데 Grenade Throw Animation 역시 오른손을 이용하기 때문이다.

따라서 수류탄을 던지는 순간에는 총을 오른손에서 빼거나 다른 손으로 옮겨야 한다.

 

Constraint

Attach 대신 Parent Constraint를 사용한 이유

일반적인 Attach는 오브젝트를 특정 부모 아래에 두는 데 적합하다.

하지만 이번 작업처럼 시네마틱 중간에 RightHand → LeftHand → RightHand 순서로 총의 부모를 바꿔야 하는 경우에는 Sequencer에서 상태를 키프레임으로 관리할 수 있는 Constraint가 훨씬 편하다.

Constraint는 Outliner나 Control Hierarchy 자체를 바꾸지 않고 다른 오브젝트의 Transform을 따라가도록 만들 수 있다.
Parent Constraint는 Translation과 Rotation 등 부모 Transform을 따라가는 방식이다.

총을 RightHand에 Constraint하기

먼저 총을 Level에 배치하고 Level Sequence에 추가한 뒤, 0 Frame으로 이동한 다음 총을 선택하고 Animation Mode의 Constraints에서 Parent Constraint를 추가했다.

Parent로 캐릭터의 RightHand를 선택했다.

Constraints 패널에 RightHand <-- SM_AR4 형태로 Parent Constraint가 생성된 것을 확인할 수 있다.

총이 RightHand를 따라가게 된 이후에는 캐릭터의 손에 자연스럽게 잡히도록 총의 위치와 회전을 세밀하게 조정했다.

Sequencer의 SM_AR4 아래에도 별도의 Constraints Track이 생성된 것을 확인할 수 있다.

Constraint를 만들면 Sequencer에서 해당 Constraint의 Active 상태 역시 키프레임으로 관리할 수 있기 때문에 시간에 따라 부모 관계를 바꿀 수 있다.

수류탄을 던질 때 총을 LeftHand로 옮기기

Grenade Throw Animation이 시작되기 직전 Playhead를 이동했다.

총을 선택한 상태에서 다시 Parent Constraint를 추가하고 이번에는 캐릭터의 LeftHand를 Parent로 지정했다.

Constraints 목록에 RightHand와 LeftHand 두 개의 Parent Constraint가 존재하는 것을 확인할 수 있다.

이 시점에서는 두 Constraint 자체가 모두 존재하기 때문에, 어느 시점에서 어떤 Constraint가 Active인지 관리해야 한다.

RightHand Constraint 옆의 Key 버튼을 이용해 수류탄을 던지는 시점부터 RightHand Constraint를 비활성화하는 Key를 추가했다.

Sequencer를 보면 앞부분에는 RightHand, 뒤에는 LeftHand Constraint 영역이 보인다.

이렇게 구성하면 평소에는 총이 오른손을 따라가다가 수류탄을 던지는 순간부터 왼손을 따라간다.

참고로 Parent Constraint는 여러 개가 동시에 Active일 경우에도 우선순위가 존재하며, 새로 만들어진 Constraint가 기본적으로 더 높은 우선순위를 가진다.

하지만 이번처럼 손 교체 시점을 명확하게 보여주려면 Active Key를 직접 나누는 편이 관리하기 쉽다.

수류탄 투척이 끝나면 다시 RightHand로 변경하기

Grenade Throw Animation이 끝나고 다시 Firing Animation으로 돌아오면 총을 오른손으로 돌려놓아야 한다.

이번 작업에서는 다시 RightHand를 Parent로 하는 Constraint를 만든 뒤, 해당 시점에서 LeftHand Constraint의 Active Key를 꺼주는 방식으로 작업했다.

기존 Constraint를 재정리하는 방식도 가능하지만, 이번 작업처럼 새 Constraint와 Active Key를 이용해 구간을 명확하게 나누면 Timeline만 봐도 어느 시점에 어느 손을 사용하고 있는지 이해하기 쉽다.

총이나 수류탄 같은 소품을 다루는 장면이 복잡해질수록 Parent를 단순한 고정 설정이 아니라 Animation 상태의 일부로 생각하는 것이 편하다.

 

마지막 Animation의 자세를 유지하기

Animation Section이 끝나면 기본적으로 Sequencer가 Animation 이전 상태로 돌아갈 수 있다.

하지만 마지막 Firing Pose를 그대로 유지해야 한다면 Animation Section을 우클릭한 뒤, Properties - When Finished - Keep State로 변경한다.

이렇게 하면 Animation Section이 끝난 뒤 Timeline에 별도의 Animation이 없는 구간으로 이동해도 마지막 상태가 유지된다.

 

실제 수류탄 오브젝트 추가하기

캐릭터가 수류탄을 던지는 Animation만 재생하면 손동작만 있을 뿐 실제 수류탄 Mesh가 존재하지 않는다.

따라서 수류탄 Mesh를 Level에 배치하고 Level Sequence에도 추가했다.

투척 전에는 수류탄이 캐릭터의 오른손을 따라가야 하므로 총과 같은 방식으로 Parent Constraint를 만들고 캐릭터의 RightHand를 Parent로 지정했다.

그다음 손 안에 자연스럽게 보이도록 수류탄의 위치와 회전을 조정했다.

Actor Hidden In Game으로 수류탄 등장 시점 만들기

수류탄은 장면 시작부터 손에 보이면 안 된다.

따라서 수류탄 Track에서 Actor Hidden In Game Property를 추가했다.

Actor Hidden In Game을 추가했지만 Sequencer에서는 반대 의미의 Visibility Track으로 표시되기 때문에 이름을 혼동하지 않도록 주의한다.

그러면 Visibility가 아래 이미지와 같이 추가되고, Visibility로 수류탄의 가시 여부를 조절할 수 있다.

따라서 수류탄 투척 직전까지는 Visibility 값을 False로 두고, 손에 수류탄이 나타나는 순간 True로 변경하면 된다.

수류탄을 손에서 분리하고 날리기

수류탄이 손에 있는 동안에는 RightHand Constraint를 따라가지만 실제로 던지는 순간부터는 손과 독립적으로 움직여야 한다.

이번 작업에서는 이 시점에서 수류탄의 Parent를 Plane 같은 별도 오브젝트로 변경했다.

여기서 중요한 것은 꼭 Plane이어야 한다는 것이 아니다.

목적은 캐릭터의 손 움직임을 더 이상 상속하지 않는 World 기준을 만드는 것이다.
따라서 움직이지 않는 Helper Object나 Constraint를 비활성화한 뒤 World Transform으로 직접 움직이는 방식도 사용할 수 있다.

반대로 움직이는 Actor를 Parent로 잡으면 수류탄이 그 Actor의 Transform까지 상속하므로 원하는 포물선과 달라질 수 있다.

Curve Editor로 수류탄 포물선 만들기

수류탄이 손에서 떨어진 이후에는 Transform Key를 추가해 직접 이동시켰다.

수평 방향으로는 계속 앞으로 이동하면서 Z축 높이가 낮음 → 높음 → 낮음 형태로 변하도록 Key를 만든다.

이 작업은 Sequencer Timeline보다 Curve Editor에서 확인하는 것이 훨씬 직관적이다.

실제 물리 시뮬레이션을 사용한 것은 아니지만, Curve를 이용해 높이 변화를 조절하면 화면상 자연스러운 포물선 투척을 연출할 수 있다.

곡선을 직접 보면 수류탄이 최고점에 도달하는 시점이나 낙하 속도가 눈에 바로 보여 수정하기도 훨씬 편하다.

 

Gimbal Lock

이번에는 Cube를 이용해 회전 문제를 확인했다.

Cube를 Level에 배치한 뒤 X, Y, Z Rotation이 모두 애매하게 틀어진 상태를 만든 다음, Cube의 Local Z축을 중심으로 회전하도록 여러 Key를 추가했다.

개별 Key만 보면 원하는 방향으로 설정되어 있지만 Sequencer를 재생하면 Cube가 예상하지 않은 방향으로 휘거나 뒤집히면서 회전하는 현상이 발생할 수 있다.

이와 관련해 이해해야 할 개념이 Gimbal Lock이다.

Gimbal Lock이 발생하는 이유

Euler Rotation은 X, Y, Z 세 축의 각도로 회전을 표현한다.

문제는 세 축의 회전이 완전히 독립적으로 계산되는 것이 아니라 정해진 Rotation Order에 따라 차례로 적용된다는 점이다.

특정 자세에서 두 회전축이 같은 방향으로 겹치면 서로 다른 두 축이 사실상 같은 회전을 담당하게 되고, 사용할 수 있는 회전 자유도 하나가 사라진다.

그 결과 Curve상의 X/Y/Z 값 자체는 자연스럽게 보이더라도 실제 3D 회전에서는 예상하지 않은 방향으로 돌아갈 수 있다.

Gimbal Lock 문제 줄이기

이번 작업에서는 언리얼에서는 X축, Cinema 4D에서는 Z축을 중심으로 회전을 단순하게 구성하는 방법도 확인했다.

Gimbal Lock은 Euler Rotation의 Rotation Order와 회전 상태에 따라 발생하므로, 가능한 한 회전을 단순하게 구성하거나 적절한 Rotation Order와 Quaternion Interpolation 등을 활용해 문제를 줄이는 방식으로 접근해야 한다.

따라서 특정 축을 사용하면 Gimbal Lock이 발생하지 않는다고 일반화해서는 안 된다.

Rotation Curve를 Linear로 변경하기

Rotation Curve를 Linear로 변경하면 Key 사이의 값이 일정하게 계산되어 회전 변화를 분석하기 쉽다.

특히 Curve Editor에서 값이 예상치 못하게 Ease In/Out되면서 회전 방향까지 이해하기 어려운 경우 Linear 상태로 확인하면 문제를 찾기 편하다.

다만 Linear는 Interpolation Curve를 단순화하는 방법일 뿐 Gimbal Lock 자체를 제거하는 기능은 아니다.

Use Quaternion Interpolation 사용하기

Transform Section을 우클릭해 Properties로 이동하면 Use Quaternion Interpolation을 활성화할 수 있다.

Quaternion은 X/Y/Z Euler 값을 독립적으로 보간하는 대신 하나의 회전 상태에서 다음 회전 상태로 Orientation을 보간한다.

따라서 Euler 기반 Gimbal Lock이나 회전 Flip 문제를 줄이는 데 유리하다.

하지만 한 가지 중요한 단점도 있다.

언리얼의 Quaternion Slerp는 두 회전 상태 사이의 가장 짧은 회전 경로를 사용하며 over-rotation을 지원하지 않는다.

예를 들어 의도적으로 270도를 회전시키고 싶어도 최종 Orientation만 비교하면 반대 방향 90도가 더 짧기 때문에 예상보다 적게 회전한 것처럼 보일 수 있다.

따라서 짧고 자연스러운 방향 전환에는 Quaternion이 유용하지만, 여러 바퀴 회전하는 물체처럼 회전한 총량 자체가 중요한 Animation은 Euler Curve와 중간 Key를 직접 사용하는 편이 더 적합할 수 있다.

 

C4D Pose Morph로 캐릭터에 Facial Animation 추가하기

다음으로 준비된 캐릭터 C4D 파일을 열어 Mixamo Rig와 Facial Animation을 만드는 작업을 진행했다.

Cinema 4D에서 Mixamo용 캐릭터 준비하기

캐릭터의 원본 Mesh는 Facial Morph를 만들기에 Point 밀도가 다소 부족했기 때문에 Subdivision Surface를 적용해 폴리곤과 Point 밀도를 높였다.

Subdivision을 한 단계 적용해 얼굴을 변형할 수 있는 Point 밀도를 어느 정도 확보한 뒤 FBX로 Export했다.

이 FBX를 Mixamo에 업로드해 Auto-Rig을 진행하고, Rig이 완료된 캐릭터를 다시 T-Pose로 다운로드했다.

해당 FBX를 C4D에서 열면 기존 Mesh에 Mixamo Skeleton이 추가된 것을 확인할 수 있다.

Facial Animation 만들기: Pose Morph

Mixamo는 기본적으로 몸의 Skeleton Animation을 빠르게 만들기에는 좋지만 이번 캐릭터에는 별도의 얼굴 표정 데이터가 없었다.

따라서 C4D의 Pose Morph를 이용해 직접 얼굴 표정을 만들었다.

캐릭터 Mesh를 우클릭하고 Rigging Tags - Pose Morph를 추가한다.

Pose Morph의 Basic 탭에서는 Morph에 사용할 데이터 타입을 선택할 수 있는데 이번에는 Points를 활성화했다.

Points를 활성화하면 각 표정 상태에서 Mesh Point의 위치 변화를 Morph 데이터로 저장할 수 있다.

Base Pose와 입 표정 만들기

Pose Morph에는 기본 상태인 Base Pose가 존재한다.

Base Pose는 캐릭터의 원래 얼굴이며 새 Pose에서는 해당 얼굴의 Point를 직접 변형해 다른 표정을 만든다.

이번 작업에서는 입 모양을 만드는 Pose를 만든 뒤 이름을 mouth로 변경했다.

Brush의 Smear와 Surface 옵션 차이

입을 벌리는 Morph를 만들기 위해 Brush를 사용했다.

M ~ C로 Brush Tool을 실행하고 Mode를 Smear로 변경했다.

Smear는 마우스를 드래그하는 방향으로 Mesh Point를 밀어 변형시키는 기능이다.

처음에는 아래 입술을 아래쪽으로 드래그했다.

Surface 옵션을 사용하지 않을 경우 View 방향으로 Brush 효과가 Mesh 안쪽까지 투영될 수 있다.

즉, 카메라에서 아래 입술 뒤에 있는 Point나 매우 가까운 윗입술 Point까지 영향을 받을 수 있어서 의도하지 않은 영역도 같이 변형될 수 있다.

Surface를 활성화했을 때의 차이

Surface를 활성화한 뒤 같은 방식으로 아래 입술을 드래그하면 View에서 실제로 보이는 표면을 중심으로 Brush가 작동한다.

전후 이미지를 비교하면 아래 입술을 윗입술에서 분리하면서도 주변 Geometry가 이전보다 덜 끌려오는 것을 확인할 수 있다.

따라서 입술처럼 앞뒤 Geometry가 매우 가까이 붙어 있는 영역에서는 Surface를 켜는 것이 유용하다.

이번 작업을 해보면 Brush Size만 줄이는 것보다 Brush가 표면을 통과할 것인지부터 정하는 것이 얼굴 같은 얇은 부위를 수정할 때 훨씬 중요하다.

주변 Point까지 자연스럽게 움직이기: Soft Selection

Brush 외에도 Move Tool의 Soft Selection을 사용했다.

Soft Selection을 켜면 선택한 Point 하나만 딱 움직이는 것이 아니라 Radius 안에 있는 주변 Point도 거리에 따른 가중치를 받아 함께 움직인다.

따라서 입 주변을 한 Point씩 움직여 각진 변형을 만드는 것보다 자연스럽게 얼굴 전체가 따라 움직인다.

마찬가지로 Surface를 활성화해서 아래 입술 주변처럼 가까이 붙어 있는 반대쪽 영역이 불필요하게 영향을 받지 않도록 수정했다.

입 모양이 벌어지면서 턱수염이 원래 위치에 남아 있으면 얼굴과 수염의 움직임이 분리되어 보이기 때문에 턱수염도 약간 아래쪽으로 함께 조정했다.

Pose Morph Strength로 표정 확인하기

Pose를 만든 뒤 Strength 값을 움직이면 Base Pose ↔ 만든 표정 사이를 실시간으로 확인할 수 있다.

0%에서는 원래 얼굴에 가깝고 100%에서는 작업한 입 모양이 완전히 적용된다.

실제 Animation에서는 이 Strength 값이 시간에 따라 변화하면서 표정이 만들어진다고 이해하면 쉽다.

오른쪽 눈 Pose 만들기

입 표정 다음에는 새로운 Pose를 추가하고 이름을 eye_r로 지정했다.

눈 주변의 Polygon을 세밀하게 수정해야 하므로 Brush Size를 눈 크기에 맞게 줄였다.

눈꺼풀을 내려 오른쪽 눈이 감기는 형태를 만들고, 필요하면 Brush Size를 더 작게 조정해 눈꺼풀을 수정하는 과정에서 눈동자 주변 Geometry가 튀어나오지 않도록 정리했다.

얼굴 작업은 아주 작은 Point 이동도 형태 차이가 크게 보이기 때문에 큰 Brush 하나만 사용하는 것보다 전체 형태와 세부 형태에서 Brush 크기를 나눠 사용하는 편이 안정적이다.

반대쪽 눈 Morph 만들기: Flip X

오른쪽 눈 Pose가 완성되면 같은 작업을 왼쪽 눈에 처음부터 다시 할 필요가 없다.

eye_r을 Copy/Paste한 뒤 Flip X를 사용했다.

따라서 모델이 X축을 좌우 기준으로 사용하고 좌우 Geometry가 충분히 대칭이라면 오른쪽 눈 Morph를 왼쪽 눈 Morph의 출발점으로 빠르게 만들 수 있다.

모델 자체가 비대칭이라면 Mirror 결과를 그대로 끝내기보다 반대쪽 눈 형태에 맞게 추가 수정하는 것이 좋다.

Mixamo Bone 이름의 mixamorig: 제거하기

Mixamo에서 Rig된 FBX를 C4D로 가져오면 Bone 이름에 다음과 같은 Prefix가 붙어 있는 경우가 있다.

mixamorig:Hips
mixamorig:Spine
mixamorig:RightArm

문제는 이 캐릭터를 다시 C4D에서 FBX로 Export한 뒤 언리얼에서 기존 Mixamo Animation Skeleton과 직접 연결하려 할 때 Bone 이름이 달라질 수 있다는 점이다.

언리얼은 기존 Skeleton에 Animation을 연결할 때 Bone Name과 Hierarchy를 기반으로 대응시킨다.

따라서 이번 파이프라인에서는 Bone 이름을 정리했다.

모든 Joint를 선택한 뒤 Shift + C에서 Naming을 검색해 Naming Tool을 실행한다.

Naming Tool의 Replace 기능으로 Bone 이름 앞의 mixamorig: 부분을 제거했다.

Naming Tool은 선택한 Object Hierarchy의 이름 일부를 일괄적으로 Replace할 수 있도록 만들어진 기능이다.

이번 작업에서는 C4D에서 작업한 캐릭터 Skeleton과 Mixamo에서 다시 받은 Animation을 같은 Skeleton처럼 직접 사용하려고 했기 때문에 이름을 통일한 것이라고 이해하는 편이 정확하다.

Morph Target을 포함해 언리얼 엔진으로 Import하기

Bone 이름을 정리한 캐릭터를 FBX로 Export하고 언리얼 엔진에 Import했다.

이때 Import Morph Target을 활성화해야 C4D Pose Morph로 만든 표정 데이터가 함께 들어온다.

Import가 끝난 뒤 Skeletal Mesh를 열고 Morph Target 목록을 확인하면 C4D에서 만든 입·눈 등의 표정을 찾을 수 있다.

각 Morph Target의 값을 조절하면 얼굴이 Base Pose → C4D에서 만든 표정 사이로 변형되는지 확인할 수 있다.

같은 캐릭터용 Mixamo Animation 가져오기

이제 다시 Mixamo에서 위 캐릭터를 대상으로 사용할 Animation을 다운로드했다.

언리얼 엔진으로 Animation만 Import하고 앞서 만든 캐릭터가 사용하는 Skeleton Asset을 지정했다.

캐릭터를 Level에 배치해 Level Sequence에 추가한 뒤 Import한 Animation Sequence를 Animation Track에 넣었다.

Bone 이름과 Hierarchy가 제대로 맞아 있다면 Animation이 정상적으로 재생된다.

만약 움직임이 적용되지 않거나 Skeleton 호환 오류가 발생한다면 가장 먼저 C4D에서 mixamorig: 제거가 모두 제대로 되었는지, Bone Hierarchy가 변경되지 않았는지를 확인하는 것이 좋다.

Animation을 FK Control Rig로 Bake하기

Animation Sequence를 재생하는 것만으로 끝내지 않고 언리얼 내부에서 직접 Bone과 표정을 수정하기 위해 Animation을 FK Control Rig로 Bake했다.

Sequencer에서 캐릭터를 우클릭해 Bake To Control Rig - FK Control Rig를 선택한 뒤 Create 하였다.

FK Control Rig는 별도의 전용 Control Rig Asset을 만들지 않아도 Skeletal Mesh의 Bone을 Sequencer에서 직접 조작할 수 있는 Procedural Control Rig이다.

Bake가 완료되면 원래 Animation의 결과가 FK Control Rig Key로 변환되어 개별 Bone을 직접 수정할 수 있게 된다.

Pose Morph로 만든 얼굴 표정은 Bone이 아니라 Mesh Vertex의 변화량이다.

언리얼에서는 이것이 Morph Target으로 Import되고 Animation과 연결되는 Morph 데이터는 Curve를 통해 접근할 수 있다.

이번 작업에서 Control Rig 항목 하단에 표시된 C4D 표정 이름들은 Bone이 아니라 mouth, eye_r 같은 Morph Target 값을 애니메이션하기 위한 Curve 채널로 이해하면 된다.

얼굴 표정 Key를 직접 다시 만들기

Bake가 완료된 뒤에는 모든 FK Bone Key를 삭제하는 것이 아니다.

입·눈 등 표정과 관련된 Morph Curve에 자동으로 생성된 Key만 정리한 뒤, Animation의 동작에 맞춰 필요한 프레임에서 직접 Strength Key를 추가한다.

예를 들어, 사격 직전 눈을 살짝 감거나, 동작에 힘이 들어갈 때 입 모양을 변화시키거나, 특정 프레임에서 한쪽 눈을 감게 만드는 식으로 Body Animation과 Facial Animation을 별도로 조절할 수 있다.

이렇게 하면 Mixamo에는 얼굴 Animation이 없어도 몸동작에 맞는 간단한 표정을 직접 추가할 수 있다.

살짝 웃으며 왼쪽 눈을 감도록 함

비율이 다른 캐릭터의 Animation 보정하기

Mixamo Animation은 일반적인 인간형 체형을 기준으로 만들어져 있기 때문에 캐릭터의 팔·다리 길이, 머리 크기, 몸통 비율이 크게 다르면 같은 Animation을 적용해도 동작이 어색해질 수 있다.

예를 들어 팔이 짧은 캐릭터가 일반적인 사람의 사격 Animation을 사용하면 손이 총 위치와 맞지 않거나 팔꿈치가 비정상적으로 벌어질 수 있다.

손이 귀까지 닿지 않는 모습

이 경우 원본 Animation을 다시 C4D에서 수정하지 않고 언리얼 엔진의 FK Control Rig를 이용해 보정할 수 있다.

Animation Mode 또는 FK Control Rig의 Layer 기능에서 Additive 방식의 레이어를 사용하면 기존 Animation을 그대로 유지한 채 Bone 수정값만 추가할 수 있다.

예를 들어 원본 Animation에서 팔의 위치가 약간 낮다면 Additive Layer에서는 팔을 조금 올리는 값만 Key로 만들면 된다.

그러면 최종 결과는 원본 Mixamo Animation + Additive 보정으로 계산된다.

원본 Animation을 직접 덮어쓰지 않기 때문에 나중에 보정이 마음에 들지 않으면 Additive Layer만 수정하거나 제거하면 된다.

이 방식은 캐릭터의 비율이 일반적인 사람과 다른 경우뿐 아니라 손 위치, 발 위치, 시선처럼 작은 Animation 오류를 수정할 때에도 유용하다.

 

이번 포스트는 Mixamo Animation을 언리얼 엔진에 가져오는 단순한 Import 과정에서 한 단계 더 나아가 여러 Animation을 하나의 연속된 시네마틱 연기로 구성하는 방법을 다뤘다.

Walking Animation은 Motion Blending으로 이동 위치를 이어주고, Firing·Reload·Grenade Animation은 Skeleton을 직접 표시해 비슷한 Pose에서 연결했다.

총과 수류탄처럼 캐릭터와 함께 움직이는 소품은 Parent Constraint를 이용해 시간에 따라 부모를 전환했으며, 수류탄이 손에서 떨어진 뒤에는 Transform Curve를 이용해 포물선 움직임을 만들었다.

회전 과정에서는 Gimbal Lock과 Quaternion Interpolation의 차이를 확인했고, Quaternion이 무조건적인 해결책이 아니라 shortest path라는 특성을 가진다는 점도 중요했다.

후반부에는 C4D Pose Morph로 입과 눈 표정을 만들고, Mixamo Skeleton의 이름을 정리해 Unreal Engine Morph Target으로 가져왔다.
마지막에는 FK Control Rig와 Additive 보정을 이용해 Mixamo Animation에 표정과 체형 보정까지 추가했다.

이번 포스트를 정리하면서 가장 중요한 부분은 각각의 기능 이름보다 Animation Clip의 위치, Pose, 부모 공간, 얼굴 Curve를 서로 다른 데이터로 보고 필요한 순간에 연결하는 사고방식이라고 느껴졌다.
이 구조를 이해해두면 앞으로 캐릭터가 소품을 집거나 내려놓고, 여러 동작을 이어가며 표정까지 변화하는 장면을 Sequencer에서 구성할 때 훨씬 수월해질 것 같다.