该库旨在通过 Unity Inspector 简化配置过程,轻松将 Yasushi Emoto 的 iFacialMocap 添加到 Unity 项目中。
用于侦听 UDP 数据包的线程,处理后将其添加到队列中。另一个从队列中获取并将它们通过 UnityEvents 分发到主线程上。这样就无需在帧更新时执行 UDP 侦听。
将 IFacialMocap 通信协议实现为更可用的包,无需所需的 IFacialMocap 配套应用程序。
在Unity 2018.4.33f1上开发,在Unity 2020.3.0中测试。
将版本中的Unitypackage导入到您的项目中。
将IFMService
添加到场景中的空 GameObject,并绑定具有IFMPacket
参数的场景内处理函数。
带有处理程序的示例脚本将执行以下操作
public class Example : MonoBehaviour
{
public void OnMessage(IFMPacket packet)
{
//.. Do stuff ..
}
}
要查看 UnityIFMLib 的实际运行示例,请在Example/Scene
中打开场景RiggedExample
或StaticMeshExample
。请参阅场景对象IFMService
、 CharacterFaceController
和场景中使用的示例头像之间的交互。
iFacialMocap 应直接连接到 Unity 应用程序,而不是使用 iFacialMocap Companion 应用程序。
您可以通过打开 iFacialMocap 应用程序并按屏幕右侧的齿轮来执行此操作。从这里,您可以将目标 IP 设置为本地网络上运行应用程序的主机。
默认情况下,启用IFMService
后,它将每 5 秒轮询一次 IFM(默认)端口49983
,直到第一次收到数据包。如果收到,则会向 iFacialMocap 发送一个连接确认数据包,并在其上显示确认通知。
如果发生超时,应用程序将每 5 秒重试一次,并再次出现确认对话框。
当IFMService 关闭时,端口侦听将被禁用。
IFM 数据包是根据 UDP 消息构建的已解析对象
Blendshapes
- 包含BlendshapeData
的对象数组。Head
、 LeftEye
、 RightEye
都是IFMTransform
的对象。Name
是一个字符串,使用 ARKit Blendshape 值。注意:协议简写_L
或_R
分别替换为 ARKit 特定的Left
Right
以保证所有混合形状的命名一致性Value
是 0 到 100 之间的整数。 SetBlendshapeForRenderers(SkinnedMeshRenderer[])
- 循环遍历提供的所有渲染器并在适用的情况下应用混合形状Position
- Vector3 相对于相机的位置。只有头有这一套EulerRotation
- 对象相对于相机的 Vector3 欧拉度旋转。具有静态帮助器的实用程序类,可加快原型设计或实现速度
ApplyBlendshapes(IFMPacket, SkinnedMeshRenderer[])
- 将IFMPacket.Blendshapes
应用于具有相同 Blendshapes 的所有SkinnedMeshRenderers
GetBlendshapeIndex(SkinnedMeshRenderer, string)
- 在字符串上运行 GetBlendShapeIndex,但如果共享网格为 null 或 blendshapecount 小于 1,也会执行一些快速操作以跳过整个搜索源自 iFacialMocap Companion 应用程序的示例项目