모션 워핑

김혁·2025년 11월 6일

기술연구

목록 보기
10/10

모션 워핑

파쿠르 애니메이션의 문제점

  • 위의 영상을 보았을 때, 일정한 파쿠르 애니메이션을 그냥 실행하다보니 뛰어넘는 동작에서는 손을 짚는 위치가 이상하게 설정이 되고, 올라가는 동작에서는 벽을 관통하면서 손을 짚는 위치가 이상하게 설정이 된다는 것을 볼 수 있다.
  • 이를 해결하기 위해서 언리얼 엔진의 모션 워핑 기술을 사용하기로 했다.

모션 워핑이란?

  • 공식 문서에서는 "모션 워핑은 캐릭터의 루트 모션이 타깃과 일치하도록 동적으로 정렬하는 기능"이라고 설명하고 있다.
  • 전체적으로 내용을 봤을 때, 모션 워핑은 루트 모션 애니메이션을 런타임에 실시간으로 수정하여, 애니메이션의 특정 부분이 게임 내의 원하는 지점과 정확하게 일치하도록 만드는 시스템이라고 할 수 있을 것이다.

핵심 원리

  • 애니메이션 내의 특정 노티파이 지점(예 : 손을 짚는 프레임)을 미리 정의된 게임 내의 위치에 강제로 맞추게 된다.
  • 파쿠르 예시
    • 목표 지점 : 장애물 감지 로직을 통해 얻은 손을 짚어야 할 벽의 정확한 위치
    • 애니메이션 지점 : 파쿠르 애니메이션에서 손이 펴지는 프레임에 설정된 노티파이
    • 워핑 결과 : 애니메이션이 재생되면서, 손이 펴지는 프레임에 도달하면 애니메이션의 루트 모션을 수정하여 캐릭터가 정확히 목표 지점에 손을 짚도록 이동시키게 된다.
  • 그렇다고 한다면 워핑을 사용하면, 루트가 순간적으로 이동하면서 팔이 어색해보이거나 하지 않을까?
    -> 이를 해결하기 위해 IK를 기반으로 보간을 수행한다고 한다.

모션 워핑 사용법

  1. 모션 워핑 플러그인 활성화
  • 먼저 플러그인에서 Motion Warping을 활성화해준다.
  1. 애니메이션 몽타주에서 Motion Warping 노티파이 추가
  • 특정 노티파이 지점에서 실행되는 것이기 때문에 애니메이션 몽타주에서 Motion Warping 노티파이를 추가해준다.
  • [Add Notify State]->[Motion Warping]을 통해 노티파이를 추가할 수 있다.
  • 나는 파쿠르를 기준으로 노티파이를 생성했는데, 15~21 프레임까지가 손을 짚는 부분이고, 25~30 프레임까지가 바닥에 착지하는 부분이기 때문에 해당 부분에 대해 추가했다.
  • 모션 워핑 노티파이에 대해서 다양한 설정을 할 수 있다.
  • 아래는 공식 문서의 일부인데, 아래와 같은 설정을 진행할 수 있다. 워프 타깃 이름은 무조건 지정해서 모션 워핑을 진행하는 부분에서 설정을 해줘야 하기 때문에 파쿠르할 앞 부분, FrontLedge로 할당되어 있는 것을 볼 수 있다.
  1. 모션 워핑 컴포넌트 추가
  • 모션 워핑을 진행할 캐릭터에 Motion Warping 컴포넌트를 추가해준다.
  1. 몽타주를 실행시키기 전에 Add or Update Warp Target 노드 실행
  • 아래의 사진에는 Add or Update Warp Target from Location and Rotation 노드를 활용했지만, Warp Target 구조체를 받는 노드, Transform을 받는 노드, Component를 받는 노드 등 다양한 노드가 있으니 상황에 맞는 노드를 통해 워핑시킬 위치를 지정해준다.


파쿠르 몽타주 실행 전에 모션 워핑 실행

  • 기존의 몽타주 실행 이전에 Update Warp Targets를 통해 모션 워핑을 통해 애니메이션의 위치를 지정해준다.

Update Warp Targets

  • 먼저 파쿠르를 실행하게 되면 모든 파쿠르 동작에 Front Ledge는 필수로 있어야 하기 때문에 Front Ledge 워프 타겟을 Front Ledge Location과 Normal 값을 통해 업데이트해준다.
  • 다음으로 파쿠르 액션이 hurdle, vault인 경우에만 BackLedge 워프 타겟이 필요하기 때문에, 아닌 경우에는 제거해준다.
  • 선택한 애니메이션에 BackLedge 워프 타겟이 없는 경우에는 BackLedge 워프 타겟을 제거해준다.
  • 애니메이션마다 다른 파쿠르 거리를 가지기 때문에, 정확하게 워핑하기 위해서는 애니메이션에서 FrontLedge부터 BackLedge까지 이동하는 거리가 필요하기 때문에 해당 부분을 캐싱해놓는다.
  • BackLedge 워프 타겟을 업데이트해준다.
  • 다음으로 파쿠르 액션이 hurdle인 경우에만 BackFloor 워프 타겟이 필요하기 때문에, 아닌 경우에는 제거해준다.
  • 선택한 애니메이션에 BackFloor 워프 타겟이 없는 경우에는 BackFloor 워프 타겟을 제거해준다.
  • 아까와 같은 이유로 FrontLedge부터 BackFloor까지의 거리를 계산해서 캐싱해놓는다.
  • 아까 캐싱해놓은 값을 기반으로, BackFloor 워프 타겟을 업데이트해준다.


결과

  • 모션 워핑을 넣은 결과, 어느 정도 손의 위치 같은 것은 맞는 것으로 보인다.

문제점

  • 하지만 아래처럼 정확하게 프레임 단위로 분석해봤을 때, 상당히 공중에 뜨는 것을 볼 수가 있다.
Hurdle 액션Mantle 액션
  • 아래는 GASP의 파쿠르 액션인데, 상당히 손의 위치가 알맞은 것으로 보인다.
Hurdle 액션Mantle 액션

원인 예상

  1. 모션 워핑되는 위치가 너무 높게 설정이 되어있는 것인가?
    -> 손 짚는 위치, 즉 Ledge Location에서 z축으로 0.5정도 떨어진 지점으로 워핑하는 게 맞지 않나라는 생각을 했다.
  2. 나는 모션 워핑을 사용할 때, 손의 뼈를 Warp Target으로 지정해서 이를 맞추는 줄 알았는데, attach라는 뼈를 기준으로 모션 워핑을 진행하고 있었다. 그렇다면 attach라는 뼈는 어디에 있는 걸까?
GASP의 캐릭터 본에서 attach의 위치파쿠르 애님 몽타주에서의 attach의 위치
  • 위와 같은 모습을 보았는데, 지금 우측 사진을 보면 초반 모션 워핑이 상당히 짧은 것으로 보인다. GASP에서는 최대한 부드러운 연출을 위해 모션 워핑을 통해 손 위치만 attach 본을 통해 지정을 하고, 액션이 실행되게끔 하는 구조로 보인다. 모든 파쿠르 Anim Montage는 별도로 손을 짚을 위치를 attach를 통해 지정을 해주고 있다.
  • 나는 리타겟팅을 통해 파쿠르 애니메이션들을 사용하고 있었는데, 충격적이게도 기본 SK_Mannequin 뼈 구조에는 attach가 존재하지 않아서, Anim Montage 내에서도 attach 본이 없었다.
  • 위에서 모션 워핑을 통해 어느 정도 맞췄나 했지만, 실행이 안 되고 있었던 것이다. 물론 BackLedge, BackFloor는 본 기반 워핑이 아니기 때문에 이를 통해 높이는 어느정도 위로 가긴 했지만, 이 부분이 문제로 보인다.
  • Anim Montage 별로 attach 위치를 지정해서 파쿠르 액션에 맞는 위치를 잡는 방식이 상당히 새로웠고, 이 부분에 대해서 처음 봤을 때 감이 잘 안 왔지만, 가상 본 구조에 대해 사용법이 흥미로웠다.

해결법

  • 리타겟팅을 통해 생성한 파쿠르 Anim Montage들의 attach 위치를 별도로 지정하기에는 너무 과한 시간을 들이는 것으로 보여서 기술 연구 단계에서는 GASP의 파쿠르 Anim Montage를 그대로 사용해보았다.
Mantle 액션Hurdle 액션
  • 아무래도 리타겟팅을 하지 않고, 그대로 사용하다보니 정확한 위치를 짚는 것으로 보이지는 않는다. 본의 크기를 봤을 때, 지금 사용하는 캐릭터가 팔이 좀 더 길어서 상대적으로 위를 잡을 때는 더 높게, 아래로 짚을 때는 더 낮게 손이 되는 것으로 보인다.
  • 또한, 올라갈 때는 다리가 뚫리기도 하는데, 이는 추후에 Foot Placement와 IK Leg 노드를 통해 다리를 보정하면 될 것으로 보인다. 이에 대해는 팀 프로젝트에서 파쿠르를 구현할 시에 공부해서 추가할 것이다.

최종 결과





개인 샘플 프로젝트 : Github - Motion Matching

참고

Fab 샘플 프로젝트 : Epic Games - Game Animation Sample
공식 문서 : 모션 워핑

profile
게임 개발자를 향해..

0개의 댓글