vault backup: 2023-08-08 20:21:14

This commit is contained in:
BlueRose 2023-08-08 20:21:14 +08:00
parent 40bed23a56
commit 656f24a986

View File

@ -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<FBoneReference> BoneReferences`获取BoneName。
- 根据BoneName判断BoneMappingSkeletonToVMC是否
- 容错处理,
- 根据BoneName判断BoneMappingSkeletonToVMC是否包含该骨骼。如包含该骨骼则提取对应的骨骼数据不包则从InitialBones中取对应骨骼的值RefPose
- 获取ParentBoneIndex并将父骨骼的Transform乘上如果父骨骼是根骨骼则乘以之前计算的RootTransform。
- 因为骨骼Index是从Root开始算的这样相当将之前整个骨骼链的数据都乘上了。
- 将计算完成的新值替换OutBoneTransforms中的。
- IsValidToEvaluate
- BuildMapping
成员变量作用:
- `TArray<FBoneReference> BoneReferences`
- `TMap<FName, FName> BoneMappingSkeletonToVMC`:
- `TArray<FBoneReference> BoneReferences`存储BoneIndex、BoneName、CachedCompactPoseIndex。
- `TMap<FName, FName> BoneMappingSkeletonToVMC`:VRM角色骨骼映射表。VRM4U可以生成不确定
- `UVMC4UEVRMMapping* PrevVRMMapping`:上一个VRMMaping用来检测是否需要重新驱动VRMMaping。
- `UVMC4UEVRMMapping* VRMMapping`:用于指定VRMMaping资源。
- `TArray<FTransform> InitialBones`:记录初始RefPose的骨骼形变找不到骨骼的情况会使用。
### VRMMaping的作用
VMC软件只用于驱动VRM角色或者与VRM骨骼结构相同的角色角色的骨骼数量、排序大概率不同会使得Index不同。所以需要搞一个BoneName映射表用来寻找驱动的骨骼。
## GetStreamingSkeletalMeshTransform
## FAnimNode_ModifyVMC4UEMorph
继承自FAnimNode_Base。大致逻辑与AnimNode_ModifyVMC4UEBones相似。
主要逻辑位于Evaluate_AnyThread():
1. 判断是否需要重新构建VRMMaping如有需要调用BuildMapping()进行构建。
2. 调用UVMC4UEBlueprintFunctionLibrary::GetStreamingSkeletalMeshTransform()。
3. 从AnimInstanceProxy取得Skeleton。
4. 相关有效性判断。
5.