Game Development/Unreal Engine

[UE5] Motion Matching - 2 (Pose Search, 모션 매칭)

Dlaiml 2024. 7. 17. 16:45

저번 포스팅에 이어서 모션매칭을 이어 진행해보자.

 

[UE5] Motion Matching - 1 (모션매칭, UE 5.4)

언리얼 엔진에서 500개가 넘는 무료 애니메이션이 포함된 캐릭터를 포함하는 Unreal Engine Game Animation Sample Project을 공개하였다.  Motion Matching 을 사용한 애니메이션 시스템을 선보인다고 적혀있는

dlaiml.tistory.com

 

Motion Matching

Game Animation Sample Project의 애니메이션을 모두 직접 추가한 캐릭터에 Retargeting 하였고 Input이 작동하지 않던 문제도 해결하였다.

이제 애니메이션을 적용하려면 Animation Blueprint 에서 State Machine을 세팅하고 여러 애니메이션을 Blend Space를 사용하여 Blend하는 과정도 필요하다.

 

Blend Space / State Machine

 

모션매칭은 쿼리를 기반으로 애니메이션 포즈를 선택하는 시스템으로 위 State Machiine, Blend Space의 대안으로 사용이 가능하다.

 

모션매칭은 애니메이션 데이터 세트를 정하고 쿼리를 기반으로 적합한 포즈를 선택하기 때문에 State Transition, Blend 로직을 정의하지 않고도 여러 애니메이션을 동적으로 재생할 수 있게된다.

 

직접 사용해보면서 장점을 알아보겠다.

 

Plugin 세팅

 

모션 매칭 작업전에 추가해야 할 플러그인 들이 있다

  • Motion Trajectory
  • Pose Search
  • Chooser

모두 설치하고 활성화 해준다.

 

 

Pose Search Schema 

 

모션 매칭은 위에서 설명한 것과 같이 "쿼리를 기반으로 애니메이션 데이터 세트에서 포즈를 선택" 한다.

어떤 포즈를 선택할지 스키마를 정의하는 Pose Search Schema를 만들자

 

 

Skeleton은 모션 매칭 작업을 할 캐릭터의 Skeleton을 선택한다. (이전 포스팅에 이어 Paragon Yin 캐릭터의 Skeleton으로  설정하였다)

 

 

생성한 Pose Search Schema를 보면 Channels 이라는 항목이 있는데, 기본으로 Trajectory Channel과 Pose Channel 2개의 채널이 설정되어 있다. 

 

현재 캐릭터의 정보를 토대로 알맞은 포즈를 선택하기 위해서는 캐릭터의 정보로 어떤 것을 사용할 것인가를 정의하여야 하는데 Channel이 이를 담당한다.

 

Trajectory Channel은 캐릭터의 이동 궤적 정보와 관련된 채널로 Offset으로 정보를 사용할 시점, Flags로 사용할 정보, Weight로 가중치를 설정할 수 있다. 

Pose Channel은 글로벌 스페이스가 아닌 캐릭터 스페이스에서의 위치를 담당하며, Sampled Bones은 Bone을 지정하고 해당 Bone의 Velocity, Rotation 등의 정보를 사용할 수 있다. 

 

각 채널에 대한 자세한 정보는 아래 공식문서를 참고하는 것을 추천한다.

https://dev.epicgames.com/documentation/en-us/unreal-engine/motion-matching-in-unreal-engine

 

Pose Search Database

이제 쿼리를 통해 가져올 애니메이션 데이터 세트를 정의하여야 한다. Pose Search Schema를 만든 것처럼 Pose Search Database를 만들어보자.

 

최종적으로는 Idle / Walk / Run / Crouch / InAir 총 5개의 Pose Search Database를 만들 예정이다. 

우선 달리기 애니메이션들로 구성할 데이터베이스를 만들어보자.

 

 

방금 만든 Pose Search Schema를 연결한 뒤 열어보면 Asset List와 뷰포트로 구성된 화면이 나온다.

Asset List에 애니메이션을 추가해보자. 

 

UE Game Animation Sample Project에서 가져와서 Retarget 후 export한 애니메이션들 중 달리기 애니메이션을 모두 추가하자. "RUN"으로 검색해서 한 번에 추가해도 좋다.

 

 

Asset List에서 Ctrl+A로 모든 애니메이션을 선택하면 뷰포트에서 위처럼 모든 애니메이션이 재생되는 것을 볼 수 있다.

 

빨강, 파랑, 초록 색깔로 캐릭터의 경로, 위치 등이 표시되는 것을 볼 수 있는데 이는 Pose Search Schema에서 채널의 요소마다 설정한 Debug Color가 표시되는 것이다.

 

 

직접 확인해보기 위해 파란색으로 되어있던 Trajectory Channel의 index 2,3을 각각 분홍, 노랑색으로 변경하였다.

그리고 달리다가 180도 회전하는 애니메이션을 재생하였다.

 

 

[Offset = -0.4, Flags = FPosition XY]는 빨간색 사각형으로 캐릭터의 0.4초 전 위치를 표시하고있다.

[Offset = 0, Flags = Velocty XY | Facing Direction XY]인 파란색은 선분을 보면

속도를 나타내는 선은 캐릭터가 달리는 방향으로 속도가 빠를수록 길어지는 것을 확인할 수 있다. 

Facing Direction도 캐릭터가 180도 회전하면서 반대 방향으로 선분이 바뀐 것을 볼 수 있다 (방향 벡터로 길이는 일정)

[Offset = 0.35, Flags = Poistion XY | Facing Direction XY]인 분홍색 점을 보면 캐릭터의 0.35초 뒤의 위치를 표시하며 선분은 0.35초 뒤의 Facing Direction을 나타낸다.

[Offset = 0.7, Flags = Poistion XY | Facing Direction XY | VelocityXY]인 노란색은 점으로 0.7초 뒤 캐릭터의 위치, 선분의 길이와 방향으로 0.7초 뒤 Velocity, 길이가 일정한 선분으로 0.7초 뒤 Facing Direction을 표시하고 있다.

 

 

Motion Matching

다음으로 Character 클래스에 추가 가능한 모션 매칭을 위한 Trajectory를 담당하는 Component인 Character Trajectory Component를 캐릭터에 추가해준다.

 

이제 Animation Blueprint를 새로 만들고 모션 매칭 설정을 진행하면 된다.

Content Drawer에서 Skeletal Mesh를 우클릭 후 Anim Blueprint를 클릭하자.

 

 

EventGraph에서는 애니메이션 블루프린트의 Owner인 캐릭터의 Character Trajectory와 Character Movement를 받아와서 변수로 Set 한다.

 

AnimGraph에는 복잡한 State Machine 없이 아래처럼 Motion Matching 노드를 만들고 Pose Search Dataset을 지정 (달리기 Dataset으로 지정하였다), Pose History 노드를 만들고 Trajectory를 우클릭하여 Character Trajectory의 Trajectory로 Bind 한다. 

 

이후 캐릭터 블루프린트에서 Animation > Anim Class를 방금 만든 Animation Blueprint로 변경해준다. (ABP_MotionMatchingYin 이라는 이름으로 저장하였다)

 

 

레벨에서 테스트해보기 전 달리기 데이터셋인(PSD_Run)만 사용하고 있기 때문에 아무 입력이 없을 때 애니메이션이 없어 가만히 있어도 달리는 애니메이션이 재생되는 문제가 있다. 이를 해결하기 위해 Idle 애니메이션 하나를 PSD_Run에 추가하였다.

 

 

에디터에서 게임을 실행 후 `키를 누르면 명령어 입력이 가능하다.

a.CharacterTrajectory.Debug 1을 입력하여 시각적으로 Trajectory를 확인해보자.

 

기존 애니메이션 + State Machine / 리타게팅 애니메이션 + Motion Maching

 

기존 Paragon Yin 캐릭터의 애니메이션(좌)보다 더 많은 애니메이션들이 추가되면서 더 역동적이고 자연스러운 달리기 애니메이션이 적용되었다. 복잡한 State Machine 없이 간단한 모션 매칭만 적용하였는데도 속도, 방향에 맞게 자연스러운 포즈가 선택되는 것을 볼 수 있다.

 

방향전환과 같이 로직을 직접 입력하기 까다로운 포즈의 선택도 Trajectory, Bone을 기반으로 한 쿼리로 알맞은 애니메이션 포즈를 잘 가져온다.

 

캐릭터의 상태에 따라 여러 Pose Search Database를 만들었기 때문에 (Run, Crouch, Walk, Jump) 현재 캐릭터에 상태에 따라 다른 Database의 교체가 필요하다.

 

Switch Pose Variable 

Animation Blueprint의 Event Graph에서 Database 선택을 위한 변수들을 세팅하자.

 

Character 클래스의 Movement Component는 Velocity, IsFalling, IsCrouched, IsSwimming 등의 정보를 가지고 있다.

이를 사용하여 Idle, Walk, Run을 나누기 위한 Speed와 Jump 데이터베이스 사용 여부 파악을 위한 IsFalling을 애니메이션 블루프린트의 멤버변수로 세팅하였다.

 

Crouch의 경우 캐릭터가 웅크리도록 하는 키가 따로 없기 때문에 캐릭터 블루프린트에서 간단하게 세팅해준다.

 

이후 애니메이션 블루프린트에서 자신이 사용할 캐릭터에서 Is Crouching 변수를 받아와 Promote to Variable로 멤버 변수로 Set 해준다.

 

이제 Idle, Walk, Run, Crouch, Jump를 정의할 수 있는 변수들이 모두 애니메이션 블루프린트에 세팅 되었다.

 

다음 포스팅은 마지막으로 Chooser 를 사용한 Pose DB 교체 및 직접 정의한 채널로 더 자연스러운 모션매칭을 완료까지 다루려 한다.

 

 

Reference

[0] https://dev.epicgames.com/documentation/en-us/unreal-engine/motion-matching-in-unreal-engine

[1] https://dev.epicgames.com/community/learning/tutorials/1JMK/motion-matching-in-unreal-engine-5-4-step-by-step-tutorial?content_review=true&locale=ko-kr

[2] https://www.youtube.com/watch?v=j8RgsganqRU&list=PLLuramE9fKBmdbmg_FKtqxr2J5JT5Ei4o&index=5