디스턴스 매칭

예시 워크플로 구현을 통해 언리얼 엔진의 디스턴스 매칭에 대해 자세히 알아봅니다.

Choose your operating system:

Windows

macOS

Linux

디스턴스 매칭(Distance Matching) 을 사용하면 애니메이션 시퀀스를 시간 기반 선형 재생 대신 계산된 거리 변수로 구동할 수 있습니다. 이 문서에서는 디스턴스 매칭에 대해 알아보고 구현 프로세스를 보여주는 워크플로 샘플을 간략히 살펴봅니다.

전제조건

  • 애니메이션 로코모션 라이브러리(Animation Locomotion Library) 플러그인을 활성화해야 합니다. 메뉴 바(Menu Bar) 로 이동하여 편집(Edit) > 플러그인(Plugins) 에서 애니메이션 로코모션 라이브러리애니메이션(Animation) 섹션에서 찾거나 검색 바(Search Bar) 를 사용합니다. 플러그인을 활성화하고 에디터를 재시작합니다.

애니메이션 로코모션 라이브러리 플러그인

개요

디스턴스 매칭을 사용하면 타깃에 대한 캐릭터의 거리를 바탕으로 애니메이션 시퀀스를 구동할 수 있습니다. 애니메이션 시퀀스 커브(Curve)는 애니메이션 블루프린트 로직 내에서 시간 디스플레이스먼트가 아니라 특정 거리 값에서 원하는 포즈를 바탕으로 애니메이션 키프레임을 그래프화 및 선택하는 데 사용됩니다.

아래는 타임라인에서 커브가 하이라이트된 애니메이션 시퀀스 에디터의 예시입니다.

시퀀스 에디터 창의 커브

커브 에디터(Curve Editor)에서 커브를 더블클릭하여 열 수 있습니다. 커브 에디터에서 커브에 대한 상세한 정보와 커브를 미세 조정 및 조정하기 위한 편집 툴에 액세스할 수 있습니다.

아래 예시는 x축에서 애니메이션 시퀀스의 포즈를, y축에서 수직 디스플레이스먼트의 단위를 그래프 처리하는 지상 거리(Ground Distance) 커브를 볼 수 있습니다. y=0은 레벨의 지면을 나타냅니다. 이 샘플 커브에서 키프레임을 나타내는 트라이앵글은 커브 탄도(녹색 선)를 따라 계속해서 디스플레이스됩니다. 하지만 포즈는 키프레임 교차점뿐만 아니라 탄도의 모든 포인트에서 선택할 수 있습니다. 디스턴스 매칭을 사용하면 애니메이션 블루프린트는 애니메이션 커브를 검색하여 인덱스가 적용된 값을 찾습니다. 이 값은 거리 변수로 표시되며 대응하는 애니메이션 포즈를 출력합니다.

애니메이션 디스턴스 커브

아래는 이 프로세스의 수동 데모입니다. 거리 값이 지면에서 -100유닛인 경우 포즈는 커브의 6번째 키프레임에 위치하며 재생을 위해 선택됩니다.

디스턴스 매칭 포즈 선택을 위한 수동 예시

디스턴스 매칭 노드는 애니메이션 디스턴스 커브를 사용하여 애니메이션 시퀀스 재생을 조정할 애니메이션 포즈를 선택합니다. 디스턴스 매칭을 사용하면 애니메이션 재생 속도를 캐릭터 무브먼트 속력에 맞춰 구동할 수 있으며, 이를 통해 애니메이션을 미세 조정할 필요성을 줄이면서 애니메이션 재생을 방해하지 않은 채로 캐릭터 속력을 변경할 수 있습니다.

아래는 실제 디스턴스 매칭 구현이 리라 샘플 프로젝트(Lyra sample project)에서 작동하는 모습입니다.

리라 샘플의 결과

디스턴스 매칭 워크플로

이 워크플로 예시는 디스턴스 매칭의 기본적인 구현을 보여줍니다. 시퀀스 이밸류에이터(Sequence Evaluator) 노드를 사용하여 착지 모션을 평가하는 디스턴스 매칭 로직은 애니메이션 디스턴스 커브(Animation Distance Curve) 를 사용하여 캐릭터의 위치에서 지면까지 남은 거리를 바탕으로 애니메이션 포즈를 선택합니다.

커브 생성

디스턴스 매칭에는 애니메이션 포즈를 타깃과의 거리와 함께 그래프 처리하는 애니메이션 커브가 필요합니다. 이 커브를 레퍼런스하여 다이내믹 디스턴스 변수에 따라 애니메이션 재생 포즈를 조정할 수 있습니다.

예를 들어 시간 유닛 한계치를 바탕으로 9번째 키프레임을 10번째 키프레임으로 트랜지션하는 대신, 거리 유닛 한계치를 바탕으로 트랜지션이 일어나게 할 수 있습니다.

이 커브는 루트 모션(Root Motion)이 활성화된 애니메이션 시퀀스에서 생성할 수 있습니다.

커브를 생성하려면 애니메이션 시퀀스 에디터에서 애니메이션 시퀀스를 엽니다. 메뉴 바(Menu Bar) > 창(Windows) 으로 이동하여 에셋 에디터(Asset Editor) 섹션에서 애니메이션 데이터 모디파이어(Animation Data Modifiers) 를 선택하여 창을 엽니다.

애니메이션 데이터 창 열기

모디파이어 추가(Add Modifier) 를 선택하고 디스턴스 커브 모디파이어(Distance Curve Modifier) 옵션을 드롭다운 메뉴에서 선택합니다.

디스턴스 커브 모디파이어 추가

디스턴스 커브 모디파이어 세팅 에서 커브 생성을 위한 파라미터를 설정합니다.

디스턴스 커브 모디파이어 프로퍼티(Distance Curve Modifier Properties) 및 그 기능의 목록은 다음과 같습니다.

프로퍼티

설명

샘플 레이트(Sample Rate)

시퀀스에 대해 얼마나 많은 커브 샘플을 생성할지 결정합니다. 값이 높으면 샘플과 디스턴스 커브 정확도가 증가합니다. 값이 30이면 대부분의 사용 사례에 적합합니다.

커브 이름(Curve Name)

생성된 커브의 이름을 정의합니다.

정지 속력 한계치(Stop Speed Threshold)

캐릭터가 움직임을 멈추거나 애니메이션 엔드 포인트에 도달하는 한계치를 정의합니다. 기본값은 0이지만 애니메이션이 끝나기 전에 캐릭터가 항상 0에 도달하는 것은 아닙니다. 이 프로퍼티는 더 부드러운 트랜지션을 위해 끝 한계치를 미세 조정하는 데 쓸 수 있습니다.

예를 들어 피벗 애니메이션에서 캐릭터가 방향을 바꾸지만 완전히 멈추지는 않을 수도 있습니다. 이 한계치를 미세 조정하여 캐릭터가 얼마나 느려져야 '정지' 상태가 되는지 지정합니다.

축(Axis)

고려할 축 및 모션 축을 결정합니다. 'Z'는 착지 애니메이션에 유용합니다. 'XY'는 로코모션 트랜지션에 유용합니다(정지, 시작, 피벗).

끝에서 정지(Stop at End)

활성화하면 커브는 캐릭터가 애니메이션 시퀀스의 마지막 프레임에서만 멈추도록 선언합니다. 캐릭터가 애니메이션 시퀀스의 마지막 프레임 이전에 멈췄거나 멈출 수 있다면 이 프로퍼티를 활성화합니다.

시연을 위해 축 프로퍼티(Axis property)Z 축으로 변경합니다. 애니메이션이 높이 변화에 따라 디스턴스 매칭되기 때문입니다.

끝에서 정지 세팅을 활성화합니다.

향후 레퍼런스를 위해 커브 이름 프로퍼티를 사용하여 커브의 이름을 설정합니다.

디스턴스 커브 모디파이어 프로퍼티

나머지 세팅은 디폴트로 둡니다.

창 상단에서 모든 모디파이어 적용(Apply All Modifiers) 를 클릭하여 새 커브를 생성합니다.

이제 애니메이션 디스턴스 커브가 생겼으니 커브 에디터 창에서 플레이헤드를 사용하여 커브를 따라 앞뒤로 움직이면서 애니메이션 포즈 출력을 타깃과의 여러 거리 값에서 볼 수 있습니다. 이 데모에서는 캐릭터가 다가오는 지면에 닿기 위해 다리를 뻗습니다.

커브 스크러빙의 예시

압축

애니메이션 시퀀스를 디스턴스 매칭하려면 디폴트 압축 메서드 자리에 디스턴스 커브를 런타임에서 읽을 유니폼 인덱스 가능 애니메이션 압축 세팅(Uniform Indexable Animation Compression Setting) 에셋이 필요합니다.

이 압축을 적용하려면 새 애니메이션 압축 세팅 에셋(Animation Compression Settings Asset) 을 생성합니다. 콘텐츠 브라우저 에서 우클릭하여 고급 에셋 생성(Create Advanced Asset) 아래의 애니메이션 드롭다운 메뉴로 이동한 다음 커브 압축 세팅(Curve Compression Settings) 을 선택합니다.

압축 에셋 을 더블클릭하여 디테일 패널을 엽니다. 압축 아래의 코덱(Codec) 옵션에서 유니폼 인덱스 가능(Uniform Indexable) 을 선택합니다.

압축 코덱 옵션 정의

디스턴스 매칭을 하는 애니메이션 시퀀스 내에서 디테일 패널의 압축(Compression) 으로 이동하여 새 커브 압축 세팅 에셋을 할당합니다.

압축 에셋을 애니메이션 시퀀스에 추가

애니메이션 블루프린트

캐릭터의 애니메이션 블루프린트 AnimGraph 에서 시퀀스 이밸류에이터 노드를 생성하고 출력 포즈(Output Pose) 노드에 연결합니다.

시퀀스 이밸류에이터 노드를 추가하여 출력 포즈에 연결

시퀀스 이밸류에이터 노드의 디테일 패널을 열고 디스턴스 매칭을 위한 애니메이션을 정의합니다.

다음으로 명시적 시간(Explicit Time) 프로퍼티에서 핀의 드롭다운 메뉴 를 열고 다이내믹 값(Dynamic Value) 옵션을 핀(Pin) 카테고리에서 토글합니다. 다이내믹 값 옵션을 토글하면 애님 노드 함수를 사용하여 값을 설정할 수 있습니다. 블루프린트에서 이 핀을 숨겨도 안전합니다.

루프 여부(Should Loop)명시적 시간으로 텔레포트(Teleport to Explicit Time) 를 비활성화합니다.

시작 위치(Start Position) 을 0으로 설정하고 행동 재초기화(Reinitialization Behavior) 가 **명시적 시간**에 의존하게 합니다.

시퀀스 이밸류에이터 프로퍼티 및 컨텍스트

시퀀스 이밸류에이터 노드의 프로퍼티를 정의한 다음 시퀀스 이밸류에이터 노드에서 애니메이션 노드 함수(Animation Node Function)를 생성하여 로직을 구동합니다. 이 내부 함수를 생성하려면 시퀀스 이밸류에이터 노드의 디테일 패널에서 함수(Functions) 섹션으로 이동합니다. 업데이트 시(On Update) 프로퍼티에서 드롭다운 메뉴 를 열고 + 바인딩 생성(Create Binding) 을 선택합니다.

애님 노드 함수 바인딩 생성

디테일 패널에서 함수의 이름을 변경할 수 있습니다. 이 예시에서 함수는 'Distance Matching'으로 명명됩니다.

함수가 블루프린트 에디터 뷰포트(Blueprint Editor Viewport) 창의 새 탭에서 열립니다.

함수의 InOut 노드 사이에 타깃에 디스턴스 매치(Distance Match to Target) 노드를 생성합니다.

타깃에 디스턴스 매치 함수 노드 생성

다음으로 타깃에 디스턴스 매치 노드의 노드 출력 핀 에서 드래그하여 시퀀스 이밸류에이터로 변환(Convert to Sequence Evaluator) float 함수(녹색) 노드를 생성합니다.

시퀀스 이밸류에이터로 변환 함수 노드 생성

시퀀스 이밸류에이터변환 노드의 시퀀스 이밸류에이터 출력 핀**을 타깃에디스턴스 매치시퀀스 이밸류에이터 입력 핀** 에 연결합니다.

타깃으로부터의 거리를 계산하는 float 변수 의 인스턴스를 호출합니다. 이 예시에서 캐릭터와 지면 간의 거리를 측정하는 변수는 지면까지의 거리(Distance to Ground) 라고 합니다.

타깃에 디스턴스 매치 노드에서 디스턴스 커브 이름 을 정의합니다.

블루프린트를 저장(Save) 하고 컴파일(Compile) 하면 애니메이션 프리뷰 뷰포트(Animation Preview Viewport) 에서 디스턴스 매칭의 결과를 볼 수 있습니다.

결과

애니메이션을 실행하는 동안 뷰포트 세팅(Viewport Settings)씬 구성(Scene Setup) 섹션에서 바닥 높이 오프셋(Floor Height Offset) 프로퍼티를 조정하여 디스턴스 매칭이 작동하는 것을 볼 수 있습니다. 디스턴스 매칭이 활성화되고 구현되면 캐릭터와 지면 사이의 거리가 변할 때 시퀀스 이밸류에이터 노드가 애니메이션 포즈를 커브에서 선택합니다. 이는 캐릭터가 가까워지는 지면에 동적으로 반응하면서 보다 자연스러운 착지 애니메이션을 보입니다. 디스턴스 매칭을 통해 애니메이션 시퀀스는 조정된 낙하 속력에 맞게 시퀀스를 다시 애니메이팅할 필요 없이 캐릭터의 낙하 속력을 조정할 수도 있습니다.

애니메이션 프리뷰 창에서 수행되는 수동 데모

아래는 예시 워크플로에서 시퀀스 이밸류에이터 노드의 디스턴스 매칭을 구현하는 데 사용된 전체 애님 노드 함수 블루프린트입니다.

전체 예시 함수 블루프린트

디스턴스 매칭 노드 레퍼런스

다음은 애님 노드 함수에서 작동하는 디스턴스 매칭 노드의 목록입니다.

타깃에 디스턴스 매치

타깃에 디스턴스 매치 노드는 애니메이션 커브와 디스턴스 변수를 사용하여 애니메이션 포즈를 선택하고 캐릭터의 속력에 맞게 애니메이션 재생 속도를 스케일링합니다.

타깃에 디스턴스 매치 함수 노드

워크플로 데모의 애니메이션 블루프린트 섹션을 보면 애님 노드 함수에 타깃에 디스턴스 매치 노드가 구현되어 있습니다.

디스턴스 매칭으로 시간 진행

디스턴스 매칭으로 시간 진행(Advance Time By Distance Matching) 노드는 연결된 시퀀스 이밸류에이터 노드를 캐릭터가 매 프레임 이동한 거리만큼 진행하게 합니다.

디스턴스 매칭으로 시간 진행 함수 노드

이 노드는 애니메이션 포즈를 선택하기 위해 루트 본이 이동한 거리를 그래프 처리하는 애니메이션 디스턴스 커브와 이동한 거리를 측정하는 변수가 필요합니다.

속력에 일치하게 재생 속도 설정

속력에 일치하게 재생 속도 설정(Set Playrate to Match Speed) 노드는 애니메이션 시퀀스 플레이어 노드의 재생 속도를 설정하여 캐릭터의 이동 속력이 일정하다는 전제 하에 애니메이션 속도를 캐릭터의 이동 속력과 일치시킵니다.

속력에 일치하게 재생 속도 설정 함수 노드