VTuber表情捕捉开发指南(HuaWeiARFace/Unity)
1. 开发环境准备
1.1 硬件环境准备
(1)一部支持HUAWEI AR Engine的手机,对于FaceAR需要使用Mate20/30 Pro带有深度相机的手机。
1.2 软件环境准备
(1)手机EMUI版本9.0以上。
(2)Unity 2017.4LTS 及以上版本。
(3)前往华为开发者网站下载最新版本的UnitySDK,其格式为:Huawei_AR_Engine_UnitySDK_v*.unitypackage。
(4)在华为应用市场搜索“华为AR Engine”并下载安装。
2. 基于HUAWEI AR Engine Unity SDK开发AR应用
2.1 导入unitypackage
新建unity项目,导入HUAWEI AR Engine Unity SDK_vx.x.x.unitypackage,可参考Unity SDK接口说明书进行开发。连接地址如下:
https://developer.huawei.com/consumer/cn/doc/overview/HUAWEI_AR
2.2 FaceAR
HUAWEI AR Engine在支持的设备上可以实时识别人脸,人脸的微表情以及人脸模型。当应用为ARSession配置 HuaweiARUnitySDK.ARFaceTrackingConfig ,引擎将实时检测并返回预览中的人脸HuaweiARUnitySDK.ARFace。 目前仅支持单个人脸的检测。
1)会话管理
关于会话的启动、暂停、恢复和停止,请参考WorldAR中的 会话管理 。 ARFaceTrackingConfig的创建方式如图:
ARFaceTrackingConfig的配置面板如下:
应用在使用时,需要设置EnableDepth,在支持的手机上,启动深度以便实现人脸识别和跟踪。关于手机是否支持的判断,请参考 HuaweiARUnitySDK.ARSession.Config(ARConfigBase)的使用.ARFace获取的关键代码如下:
ARFrame.GetTrackables<ARFace>(m_newFaces, ARTrackableQueryFilter.NEW);
for(int i=0;i< m_newFaces.Count; i++)
{
GameObject faceObject = Instantiate(facePrefabs, Vector3.zero, Quaternion.identity, transform);
faceObject.GetComponent<FaceVisualizer>().Initialize(m_newFaces[i]);
}
2)ARFace主要类说明
关于ARFace的数据获取和使用详情请参考 HuaweiARUnitySDK.ARFace。
类 HuaweiARUnitySDK.ARFace 继承关系图如下:
类ARFace中的主要数据结构说明
enum BlendShapeLocation定义了64个华为AR Engine所支持的微表情;包含:眉毛,眼皮,眼球,脸颊,嘴巴,舌头,下巴等的动作捕捉。
类ARFace中的主要成员函数说明
GetBlendShape()获取人脸的微表情,返回人脸的微表情和值的字典。
GetBlendShapeWithBlendName()获取人脸的微表情,返回人脸微表情字符串和值的字典。
GetFaceGeometry() 返回人脸的3D Mesh。该Mesh基于一个人脸坐标系,该坐标系的原点位于人头模型的中央。
GetPose( 获取到 该原点在Unity相机坐标系下的位姿。
2.3 获取ARFace的数据传到Unity人物模型
在上述工程中找到Assets->Examples->Common->Visualizer->FaceVisualizer.cs文件;
在 “FaceVisualizer.cs”文件中定义
StringBuilder sb = new StringBuilder();
在update函数中var blendShapes = m_face.GetBlendShapeWithBlendName();语句下面加入以下代码,拿到人脸表情的数据:
foreach(var bs in blendShapes){
sb.Append(bs.Key);
sb.Append(": ");
sb.Append(bs.Value);
sb.Append("\n");
}
自己动手编写Socket Client函数将上述sb发送给自己的VTuber Server端,同时也是Socket Server端。
VTuber Server接收到表情的BlendShapeName及Value后,将对应的BlendShape值赋给自己模型脸部上对应的BlendShape上。复制语句残参考如下代码:
skinnedMeshRenderer.SetBlendShapeWeight(pair.Key, pair.Value);
备注:
Socket Client端代码、Socket Sever端代码需要自己来写
- 点赞
- 收藏
- 关注作者
评论(0)