vault backup: 2023-08-09 15:29:13

This commit is contained in:
BlueRose 2023-08-09 15:29:13 +08:00
parent 656f24a986
commit 60bedd8df5

View File

@ -62,9 +62,10 @@ Epic网站上也有一篇文章作为参考[[1]](https://zhuanlan.zhihu.com/p/61
- EvaluateSkeletalControl_AnyThread在其他线程计算骨骼结果。 - EvaluateSkeletalControl_AnyThread在其他线程计算骨骼结果。
# VMC4UE # VMC4UE
1. 支持多端口(多台捕捉机器)一起工作。
***存在问题*** ***存在问题***
1. 只做了简单的BoneTransform与Morph适配。没有针对VMC协议的其他内容进行适配。 1. 只做了简单的BoneTransform与Morph适配。没有针对VMC协议的其他内容进行适配。
## AnimNode_ModifyVMC4UEBones ## AnimNode_ModifyVMC4UEBones
继承自FAnimNode_SkeletalControlBase。 继承自FAnimNode_SkeletalControlBase。
- Initialize_AnyThread调用InitializeBoneReferences() - Initialize_AnyThread调用InitializeBoneReferences()
@ -93,10 +94,20 @@ Epic网站上也有一篇文章作为参考[[1]](https://zhuanlan.zhihu.com/p/61
- `TArray<FTransform> InitialBones`:记录初始RefPose的骨骼形变找不到骨骼的情况会使用。 - `TArray<FTransform> InitialBones`:记录初始RefPose的骨骼形变找不到骨骼的情况会使用。
### VRMMaping的作用 ### VRMMaping的作用
存储VRM角色骨骼映射表与BlendShape信息。
VMC软件只用于驱动VRM角色或者与VRM骨骼结构相同的角色角色的骨骼数量、排序大概率不同会使得Index不同。所以需要搞一个BoneName映射表用来寻找驱动的骨骼。 VMC软件只用于驱动VRM角色或者与VRM骨骼结构相同的角色角色的骨骼数量、排序大概率不同会使得Index不同。所以需要搞一个BoneName映射表用来寻找驱动的骨骼。
## GetStreamingSkeletalMeshTransform ## GetStreamingSkeletalMeshTransform
Create部分的逻辑主要是创建NewStreamingSkeletalMeshTransform并且绑定一个UUEOSCReceiver对象。由对接受到数据进行处理。
端口与NewStreamingSkeletalMeshTransform的Map存储在OSCManager中。
### OnReceivedVMC
根据VMC Address其实是数据类型进行对应判断
- /VMC/Ext/Root/Pos
- /VMC/Ext/Bone/Pos
- /VMC/Ext/Blend/Val
- /VMC/Ext/Blend/Apply
按照VMC的协议格式将数据进行反序列化并且填充到UVMC4UEStreamingSkeletalMeshTransform中。
## FAnimNode_ModifyVMC4UEMorph ## FAnimNode_ModifyVMC4UEMorph
继承自FAnimNode_Base。大致逻辑与AnimNode_ModifyVMC4UEBones相似。 继承自FAnimNode_Base。大致逻辑与AnimNode_ModifyVMC4UEBones相似。
@ -105,4 +116,12 @@ VMC软件只用于驱动VRM角色或者与VRM骨骼结构相同的角色
2. 调用UVMC4UEBlueprintFunctionLibrary::GetStreamingSkeletalMeshTransform()。 2. 调用UVMC4UEBlueprintFunctionLibrary::GetStreamingSkeletalMeshTransform()。
3. 从AnimInstanceProxy取得Skeleton。 3. 从AnimInstanceProxy取得Skeleton。
4. 相关有效性判断。 4. 相关有效性判断。
5. 5. Reset所有MorphStates的值为0。
6. 开启StreamingSkeletalMeshTransform的线程读写锁。
7. StreamingSkeletalMeshTransform->CurrentBlendShapes获取所有BlendShape进行遍历。
1. 寻找名字匹配的BlendShape.Clips不匹配则直接进入下一次循环。
2. 寻找名字匹配的BlendShape.Meshs不匹配则直接进入下一次循环。
3. 修改对应MorphStates[MorphName]的数值。
8. 输出所有MorphState.Value。