VTuber表情捕捉开发指南(HuaWeiARFace/Unity)

举报
NZY小叶子 发表于 2020/02/11 22:01:10 2020/02/11
【摘要】 本文介绍利用获取HuaweiFaceAR的表情驱动VTuber人物模型的脸部表情的方法。

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的创建方式如图: 

                                                image.png

 

ARFaceTrackingConfig的配置面板如下:

 image.png

 

应用在使用时,需要设置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 继承关系图如下:

image.png

ARFace中的主要数据结构说明

enum BlendShapeLocation定义了64个华为AR Engine所支持的微表情;包含:眉毛,眼皮,眼球,脸颊,嘴巴,舌头,下巴等的动作捕捉。

image.png

 

ARFace中的主要成员函数说明

GetBlendShape()获取人脸的微表情,返回人脸的微表情和值的字典。

GetBlendShapeWithBlendName()获取人脸的微表情,返回人脸微表情字符串和值的字典。

GetFaceGeometry() 返回人脸的3D Mesh。该Mesh基于一个人脸坐标系,该坐标系的原点位于人头模型的中央。

GetPose( 获取到 该原点在Unity相机坐标系下的位姿。

 

image.png

 

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端代码需要自己来写

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。