diff --git a/.obsidian/plugins/various-complements/data.json b/.obsidian/plugins/various-complements/data.json index 8031886..f6d4ee2 100644 --- a/.obsidian/plugins/various-complements/data.json +++ b/.obsidian/plugins/various-complements/data.json @@ -102,6 +102,14 @@ "lastUpdated": 1699350988289 } } + }, + "c++17带来的代码变化": { + "c++17带来的代码变化": { + "internalLink": { + "count": 1, + "lastUpdated": 1699369392809 + } + } } } } \ No newline at end of file diff --git a/03-UnrealEngine/Animation/UE5动画重定向核心逻辑笔记.md b/03-UnrealEngine/Animation/UE5动画重定向核心逻辑笔记.md index bef6f56..5757268 100644 --- a/03-UnrealEngine/Animation/UE5动画重定向核心逻辑笔记.md +++ b/03-UnrealEngine/Animation/UE5动画重定向核心逻辑笔记.md @@ -103,5 +103,61 @@ FChainDecoderFK::DecodePose(): 2. 从根骨骼开始重定向,以保证最后结果不会发生偏差。计算了Source/Target InitialDelta、Target 根骨骼 Transform后,将两者相乘,最后应用给所有Source骨骼链。 3. 如果禁用FK重定向,则返回当前WorldSpace Transform并且return。 4. 计算Source & Target 骨骼链开始Index。 -5. 开始遍历 +5. 开始遍历所有骨骼。 + 1. 取得Target骨骼Index以及InitialTransform。 + 2. 根据设置的FK的旋转模式执行对应逻辑(默认为插值模式,也就是他实现了骨骼链的不同数量骨骼间的重定向匹配)。计算SourceCurrentTransform与SourceInitialTransform。 + 1. 使用Target的Params(骨骼长度百分比)来插值计算出Source的Transform。参考[[#插值计算]]。 + 2. Params的计算在FChainFK::CalculateBoneParameters(),可以看得出就是根据**当前骨骼长度/总长度**计算百分比,最后加入Params。该函数的调用堆栈为:UIKRetargetProcessor::Initialize() => UIKRetargetProcessor::InitializeBoneChainPairs() => FRetargetChainPairFK::Initialize() => FChainFK::Initialize() + 3. 计算旋转值SourceCurrentRotation、SourceInitialRotation => RotationDelta TargetInitialRotation => **OutRotation**。 + 4. 计算当前TargetBone的父骨骼 ParentGlobalTransform。 + 5. 根绝设置的FK TranslationMode,计算出 **OutPosition**。 + 6. 计算OutScale = SourceCurrentScale + (TargetInitialScale - SourceInitialScale),计算出**OutScale**。 + 7. 对应index的`CurrentGlobalTransforms[ChainIndex]`/`InOutGlobalPose[BoneIndex]`赋值。 +6. 进行一些后处理计算,默认状态下跳过。 +## 插值计算 +```c++ +FTransform FChainDecoderFK::GetTransformAtParam( + const TArray& Transforms, + const TArray& InParams, + const float& Param) const +{ + if (InParams.Num() == 1) + { + return Transforms[0]; + } + + if (Param < KINDA_SMALL_NUMBER) + { + return Transforms[0]; + } + + if (Param > 1.0f - KINDA_SMALL_NUMBER) + { + return Transforms.Last(); + } + + for (int32 ChainIndex=1; ChainIndex