From 60bedd8df53f86829fee4924361be1c637fbcff9 Mon Sep 17 00:00:00 2001 From: BlueRose <378100977@qq.com> Date: Wed, 9 Aug 2023 15:29:13 +0800 Subject: [PATCH] vault backup: 2023-08-09 15:29:13 --- .../Gameplay/Animation/AnimNode.md | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/03-UnrealEngine/Gameplay/Animation/AnimNode.md b/03-UnrealEngine/Gameplay/Animation/AnimNode.md index e399f02..56a4bf8 100644 --- a/03-UnrealEngine/Gameplay/Animation/AnimNode.md +++ b/03-UnrealEngine/Gameplay/Animation/AnimNode.md @@ -62,9 +62,10 @@ Epic网站上也有一篇文章作为参考[[1]](https://zhuanlan.zhihu.com/p/61 - EvaluateSkeletalControl_AnyThread:在其他线程计算骨骼结果。 # VMC4UE +1. 支持多端口(多台捕捉机器)一起工作。 + ***存在问题***: 1. 只做了简单的BoneTransform与Morph适配。没有针对VMC协议的其他内容进行适配。 - ## AnimNode_ModifyVMC4UEBones 继承自FAnimNode_SkeletalControlBase。 - Initialize_AnyThread:调用InitializeBoneReferences() @@ -93,10 +94,20 @@ Epic网站上也有一篇文章作为参考[[1]](https://zhuanlan.zhihu.com/p/61 - `TArray InitialBones`:记录初始RefPose的骨骼形变,找不到骨骼的情况会使用。 ### VRMMaping的作用 +存储VRM角色骨骼映射表与BlendShape信息。 VMC软件只用于驱动VRM角色或者与VRM骨骼结构相同的角色,角色的骨骼数量、排序大概率不同,会使得Index不同。所以需要搞一个BoneName映射表,用来寻找驱动的骨骼。 ## 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_Base。大致逻辑与AnimNode_ModifyVMC4UEBones相似。 @@ -105,4 +116,12 @@ VMC软件只用于驱动VRM角色或者与VRM骨骼结构相同的角色,角 2. 调用UVMC4UEBlueprintFunctionLibrary::GetStreamingSkeletalMeshTransform()。 3. 从AnimInstanceProxy取得Skeleton。 4. 相关有效性判断。 -5. +5. Reset所有MorphStates的值为0。 +6. 开启StreamingSkeletalMeshTransform的线程读写锁。 +7. StreamingSkeletalMeshTransform->CurrentBlendShapes,获取所有BlendShape进行遍历。 + 1. 寻找名字匹配的BlendShape.Clips,不匹配则直接进入下一次循环。 + 2. 寻找名字匹配的BlendShape.Meshs,不匹配则直接进入下一次循环。 + 3. 修改对应MorphStates[MorphName]的数值。 +8. 输出所有MorphState.Value。 + +