From a7da7c61f1957f3160aab7aa66b5ee56a87247db Mon Sep 17 00:00:00 2001 From: BlueRose <378100977@qq.com> Date: Tue, 5 Sep 2023 14:08:09 +0800 Subject: [PATCH] vault backup: 2023-09-05 14:08:09 --- .../Animation/UE5商城动画重定向插件笔记.md | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 03-UnrealEngine/Animation/UE5商城动画重定向插件笔记.md diff --git a/03-UnrealEngine/Animation/UE5商城动画重定向插件笔记.md b/03-UnrealEngine/Animation/UE5商城动画重定向插件笔记.md new file mode 100644 index 0000000..8ea35ad --- /dev/null +++ b/03-UnrealEngine/Animation/UE5商城动画重定向插件笔记.md @@ -0,0 +1,37 @@ +--- +title: UE5商城动画重定向插件笔记 +date: 2023-09-05 12:02:29 +excerpt: +tags: + - AnimationRetargeting +rating: ⭐ +--- +# MixamoAnimationRetargeting +主要逻辑位于:FMixamoSkeletonRetargeter +- UE4MannequinToMixamo_BoneNamesMapping +- UE4MannequinToMixamo_ChainNamesMapping +- UE5MannequinToMixamo_BoneNamesMapping +- UE5MannequinToMixamo_ChainNamesMapping + +重定向逻辑位于:FMixamoSkeletonRetargeter::Retarget() + +## 判断骨骼格式 +```c++ +bool FSkeletonMatcher::IsMatching(const USkeleton* Skeleton) const +{ + // No Skeleton, No matching... + if (Skeleton == nullptr) + { return false; + } + const int32 NumExpectedBones = BoneNames.Num(); + int32 nMatchingBones = 0; + const FReferenceSkeleton & SkeletonRefSkeleton = Skeleton->GetReferenceSkeleton(); + for (int32 i = 0; i < NumExpectedBones; ++i) + { const int32 BoneIndex = SkeletonRefSkeleton.FindBoneIndex(BoneNames[i]); + if (BoneIndex != INDEX_NONE) + { ++nMatchingBones; + } } const float MatchedPercentage = float(nMatchingBones) / float(NumExpectedBones); + + return MatchedPercentage >= MinimumMatchingPerc; +} +```