diff --git a/03-UnrealEngine/Gameplay/Animation/AnimNode.md b/03-UnrealEngine/Gameplay/Animation/AnimNode.md index 74f3396..e399f02 100644 --- a/03-UnrealEngine/Gameplay/Animation/AnimNode.md +++ b/03-UnrealEngine/Gameplay/Animation/AnimNode.md @@ -58,11 +58,15 @@ Epic网站上也有一篇文章作为参考[[1]](https://zhuanlan.zhihu.com/p/61 - Initialize_AnyThread:用于初始化数据,初始化ComponentPose、AlphaBoolBlend、AlphaScaleBiasClamp。 - CacheBones_AnyThread:用于缓存Pose。 - GatherDebugData:获取Debug数据。 -- Evaluate: -- EvaluateSkeletalControl_AnyThread -- IsValidToEvaluate +- Evaluate:计算动画结果。 +- EvaluateSkeletalControl_AnyThread:在其他线程计算骨骼结果。 # VMC4UE +***存在问题***: +1. 只做了简单的BoneTransform与Morph适配。没有针对VMC协议的其他内容进行适配。 + +## AnimNode_ModifyVMC4UEBones +继承自FAnimNode_SkeletalControlBase。 - Initialize_AnyThread:调用InitializeBoneReferences() - InitializeBoneReferences:初始化了之后需要用到BoneReferences、InitialBones。 - CacheBones_AnyThread:**重写函数**,ComponentPose.CacheBones()。 @@ -74,17 +78,31 @@ Epic网站上也有一篇文章作为参考[[1]](https://zhuanlan.zhihu.com/p/61 - 计算根骨骼Transform。 - 获取FComponentSpacePoseContext.Pose与BoneContainer的引用,开始遍历所有骨骼(使用BoneIndex)。 - 根据BoneIndex,从`TArray BoneReferences`获取BoneName。 - - 根据BoneName,判断BoneMappingSkeletonToVMC是否 - - 容错处理, + - 根据BoneName,判断BoneMappingSkeletonToVMC是否包含该骨骼。如包含该骨骼则提取对应的骨骼数据;不包则从InitialBones中取对应骨骼的值(RefPose)。 + - 获取ParentBoneIndex,并将父骨骼的Transform乘上;如果父骨骼是根骨骼则乘以之前计算的RootTransform。 + - 因为骨骼Index是从Root开始算的,这样相当将之前整个骨骼链的数据都乘上了。 + - 将计算完成的新值替换OutBoneTransforms中的。 - IsValidToEvaluate - BuildMapping: 成员变量作用: -- `TArray BoneReferences`: -- `TMap BoneMappingSkeletonToVMC`: - +- `TArray BoneReferences`:存储BoneIndex、BoneName、CachedCompactPoseIndex。 +- `TMap BoneMappingSkeletonToVMC`:VRM角色骨骼映射表。VRM4U可以生成(不确定)。 +- `UVMC4UEVRMMapping* PrevVRMMapping`:上一个VRMMaping,用来检测是否需要重新驱动VRMMaping。 +- `UVMC4UEVRMMapping* VRMMapping`:用于指定VRMMaping资源。 +- `TArray InitialBones`:记录初始RefPose的骨骼形变,找不到骨骼的情况会使用。 ### VRMMaping的作用 +VMC软件只用于驱动VRM角色或者与VRM骨骼结构相同的角色,角色的骨骼数量、排序大概率不同,会使得Index不同。所以需要搞一个BoneName映射表,用来寻找驱动的骨骼。 + +## GetStreamingSkeletalMeshTransform -## GetStreamingSkeletalMeshTransform \ No newline at end of file +## FAnimNode_ModifyVMC4UEMorph +继承自FAnimNode_Base。大致逻辑与AnimNode_ModifyVMC4UEBones相似。 +主要逻辑位于Evaluate_AnyThread(): +1. 判断是否需要重新构建VRMMaping,如有需要调用BuildMapping()进行构建。 +2. 调用UVMC4UEBlueprintFunctionLibrary::GetStreamingSkeletalMeshTransform()。 +3. 从AnimInstanceProxy取得Skeleton。 +4. 相关有效性判断。 +5.