UE4 루트 모션에 대한 메모
3796 단어 위 4UnrealEngine4UnrealC++
개요
UnrealEngine 애니메이션의 루트 모션에 대한 메모입니다.
업데이트 내역
날짜
내용
2020/10/23
URO시 문제에 대해 추가
환경
Windows10
Visual Studio 2017
UnrealEngine 4.22
참고
다음을 참고로 해 주셔서 감사합니다.
UnrealEngine:루트 모션
루트 모션 정보
애니메이션의 루트의 이동치이며, 이동하는 애니메이션의 이동한 값을 액터에 적용하기 위한 구조입니다.
UE에서는 스켈레톤 트리의 상단에 있는 본에서 얻는 것 같습니다. (Root라는 이름이 아니어도 좋다)
관련 소스
"Engine\Source\Runtime\Engine\Classes\GameFramework\RootMotionSource.h"
"Engine\Source\Runtime\Engine\Private\GameFramework\RootMotionSource.cpp"
루트 모션 처리
캐릭터에 적용하는 방법입니다.
적용 방법
애니메이션 시퀀스의 자산 세부 정보 -> RootMotion에서 EnableRootMotion을 선택합니다.
애니메이션 BP의 [고급] -> [RootMotion]에서 [Root Motion from Everthing] 또는 [Root Motion from Montage Only]를 선택합니다.
# [Root Motion from Montage Only]는 애니메이션 몽타주에서 재생할 때만 됩니다.
적용되지 않는 경우 문제 해결
애니메이션 데이터가 지원되지 않는 경우
루트 본이 움직이지 않으면 적용되지 않습니다.
상단 뼈를 지정하여 미리보기하면 오렌지 선이 나타납니다.
이 상태에서 [EnableRootMotion]을 체크하고 미리보기하면 이동이 내보내므로 미리보기에서 이동하지 않습니다. (오렌지 선이 없어집니다)
MovementComponent가 대응하지 않는 경우
기본적으로 이동 구성 요소에 CharacterMovementComponent를 사용하지 않으면 적용되지 않습니다.
이 경우 애니메이션 인스턴스에서 이동 값을 가져 와서 액터에 직접 적용하지 않습니다.
아래 코드 예:
AMyActor.cppvoid AMyActor::Tick(float DeltaTime){
// アクターのアニメ―ションインスタンスクラスから移動値を取得
FRootMotionMovementParams _Params = GetAnimInstance()->ConsumeExtractedRootMotion(1.0f);
if( _Params.bHasRootMotion){
// アクターのローカルトランスフォームへ適用
AddActorLocalTransform(_Params.GetRootMotionTransform());
}
}
sweep 처리가 필요한 경우는 AddActorLocalTransform
의 제 2 인수를 true
로 하면 OK입니다.
기타
URO(Update Rate Optimizations) 등을 사용하여 애니메이션 프레임을 날리는 처리를 했을 경우, 당연히 변환값이 의도한 것과 어긋나 옵니다. (날아간 프레임의 데이터를 얻을 수 없습니다)
이 경우 루트 모션을 사용하는 것은 피할 수밖에 없다고 생각됩니다.
요약
루트 모션이 잘 움직이지 않았기 때문에 원인을 메모 작성으로 남겼습니다.
Reference
이 문제에 관하여(UE4 루트 모션에 대한 메모), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/unknown_ds/items/d3d802415c16101d47f1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
애니메이션의 루트의 이동치이며, 이동하는 애니메이션의 이동한 값을 액터에 적용하기 위한 구조입니다.
UE에서는 스켈레톤 트리의 상단에 있는 본에서 얻는 것 같습니다. (Root라는 이름이 아니어도 좋다)
관련 소스
"Engine\Source\Runtime\Engine\Classes\GameFramework\RootMotionSource.h"
"Engine\Source\Runtime\Engine\Private\GameFramework\RootMotionSource.cpp"
루트 모션 처리
캐릭터에 적용하는 방법입니다.
적용 방법
애니메이션 시퀀스의 자산 세부 정보 -> RootMotion에서 EnableRootMotion을 선택합니다.
애니메이션 BP의 [고급] -> [RootMotion]에서 [Root Motion from Everthing] 또는 [Root Motion from Montage Only]를 선택합니다.
# [Root Motion from Montage Only]는 애니메이션 몽타주에서 재생할 때만 됩니다.
적용되지 않는 경우 문제 해결
애니메이션 데이터가 지원되지 않는 경우
루트 본이 움직이지 않으면 적용되지 않습니다.
상단 뼈를 지정하여 미리보기하면 오렌지 선이 나타납니다.
이 상태에서 [EnableRootMotion]을 체크하고 미리보기하면 이동이 내보내므로 미리보기에서 이동하지 않습니다. (오렌지 선이 없어집니다)
MovementComponent가 대응하지 않는 경우
기본적으로 이동 구성 요소에 CharacterMovementComponent를 사용하지 않으면 적용되지 않습니다.
이 경우 애니메이션 인스턴스에서 이동 값을 가져 와서 액터에 직접 적용하지 않습니다.
아래 코드 예:
AMyActor.cppvoid AMyActor::Tick(float DeltaTime){
// アクターのアニメ―ションインスタンスクラスから移動値を取得
FRootMotionMovementParams _Params = GetAnimInstance()->ConsumeExtractedRootMotion(1.0f);
if( _Params.bHasRootMotion){
// アクターのローカルトランスフォームへ適用
AddActorLocalTransform(_Params.GetRootMotionTransform());
}
}
sweep 처리가 필요한 경우는 AddActorLocalTransform
의 제 2 인수를 true
로 하면 OK입니다.
기타
URO(Update Rate Optimizations) 등을 사용하여 애니메이션 프레임을 날리는 처리를 했을 경우, 당연히 변환값이 의도한 것과 어긋나 옵니다. (날아간 프레임의 데이터를 얻을 수 없습니다)
이 경우 루트 모션을 사용하는 것은 피할 수밖에 없다고 생각됩니다.
요약
루트 모션이 잘 움직이지 않았기 때문에 원인을 메모 작성으로 남겼습니다.
Reference
이 문제에 관하여(UE4 루트 모션에 대한 메모), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/unknown_ds/items/d3d802415c16101d47f1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
void AMyActor::Tick(float DeltaTime){
// アクターのアニメ―ションインスタンスクラスから移動値を取得
FRootMotionMovementParams _Params = GetAnimInstance()->ConsumeExtractedRootMotion(1.0f);
if( _Params.bHasRootMotion){
// アクターのローカルトランスフォームへ適用
AddActorLocalTransform(_Params.GetRootMotionTransform());
}
}
루트 모션이 잘 움직이지 않았기 때문에 원인을 메모 작성으로 남겼습니다.
Reference
이 문제에 관하여(UE4 루트 모션에 대한 메모), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/unknown_ds/items/d3d802415c16101d47f1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)