如何用Unity面部动捕控制原神角色说话
最近想着如何简化角色面部动画制作流程,发现可以用Unity的Live Capture官方插件实现面部捕捉效果,尝试了一下后发现效果还可以,于是打算把自己的开荒经历记录下来,以供后人和自己参考。如果你成功看完并掌握本文内容,你就能够把左边这只平平无奇的木讷胡桃变成右边这只古灵精怪的鬼畜胡桃:
以及让胡桃根据你的面部动作说话,例如说“我是胡桃嗷嗷嗷”:
我还用这方法整了个《鸡汤来咯》的小动画放到了B站,想看效果的小伙伴可以进去瞧瞧。
正式开始之前请注意这玩意需要IOS14.6以上的设备(iPhone或iPad)以及一张英俊潇洒的脸,并且很容易断开连接,只适用于短时间的动画录制(也许是网的问题,听说隔壁的虚幻引擎很稳,下次有机会试一试,233)。另外也建议看看官方文档、某个中文教程以及Youtube视频教程。
另外不是所有型号的iPhone和iPad设备都支持这么玩,我用的是iPad8代,所以开始前可以先检查一下自己的设备是否支持Face ID或带有A12 Bionic 芯片:
那么闲话少说,开始进入正题。鄙人使用的是Unity2021.2.0f1c1,创建一个URP项目(其它类型应该也可以),然后window→Package Manager,搜索live capture插件并进行安装(也可以通过add package by name,输入com.unity.live-capture)。装好后记得把它的Samples也import进来:
然后进到它自带的FaceCaptureSample场景,里面有一个示例脑袋,需要先试着调通它的示例demo,因为这也是瓶颈之一。
然后按照官方的教程配置网络,官方写得很详细,这里简要说一下: 可以右键自己的网络图标→打开“网络和Internet设置”→点击属性→将wifi网络配置文件设置为专用:
貌似还要手动设置防火墙规则(如果嫌麻烦,直接关掉防火墙也不是不可以),不知道这一步是不是可选的,总之就是进到Windows Defender防火墙,点击高级设置,点击入站规则,再点击新建规则,然后下一步,然后在此程序路径中选择自己unity editor.exe的路径,然后下一步,下一步,在配置文件中只保留专用选项,下一步,名称输入Unity Live Capture (应该随便起都可以)→完成,然后应该可以看到这么一条入站规则:
搞完电脑后就可以配置iPad了!(iPhone也可以,不过我目前只有iPad8代...)然后可以在ipad或iphone上安装一个叫做Unity Face Capture的App(貌似评分不是很高)。要实现ipad和电脑的互联,首先要保证他们用的同一个网络,比如同一个WIFI,然后点击Connections窗口的Start按钮,这时ipad应该就能搜到我们创建的服务器。不过对于有的人来说,就算连到同一个WIFI貌似还是搜不到(校园网的锅?)...不过凭借本科打war3的经验,可以利用360免费wifi创建一个wifi,再让ipad连到这个wifi上,这样应该就能搜到我们创建的服务器了(后来发现电脑windows系统自带开热点功能,用电脑开热点的方法也能实现):
点Connect按钮,一次不行就多点几次,进去后应该可以看到自己英俊的脸:
然后做表情,那个示例脑袋应该就能跟着动了。另外可以调成镜像模式,只需要点左上角那个设置按钮,然后选上 Flip Horizontally:
可以点击TakeRecorder的Start Recording按钮进行录制(或者ipad上那个红色按钮),录好的动画会存到Assets/Takes文件夹(可以调整面板上的参数指定存放文件夹之类的)。再按相同的按钮就能结束录制,然后点击Playback→StartPreview按钮可以预览之前录制的效果,也可以把存好的动画丢到自己的Timeline里:
如果这一步没问题的话就可一开始导入自定义模型了:创建一个新场景,导入一只可爱的胡桃(也可以是别的角色),更换二刺猿材质,用MagicaCloth插件添加头发服装摆动效果(如果不知道我在说啥的话可以戳这里)。然后我们就得到了一只面无表情的木讷胡桃:
在模型上添加一个ARKit Face Actor组件,然后在Assets里的合适位置创建一个FaceMapper(右键→Create→Live Capture→ARKit Face Capture→Mapper),并取名为HuTaoFaceMapper。把它拖到ARKit Face Actor组件的Mapper槽里,顺便把Head Position选项给去掉:
然后是设置FaceMapper,它的槽里需要先添加一个带有ARKit Face Actor的Prefab(预制件),所以需要把胡桃模型拖到Project面板中的合适位置创建一个新的Prefab,再把该Prefab从Project面板中拖到Rig Prefab槽里。之后会出现一些新的槽,分为眼睛、头和BlendShape三类,对于眼睛就把对应的左右眼骨骼拖进去即可;头的话就不管Position还是Rotation都拖头的骨骼;BlendShape控制面部表情,添加的话就得先点击一下Add Renderer按钮,选择带有Blendshape的网格模型(如果你在Blender里把模型按材质炸开的话,那就是选脸的模型):
然后就可以建立你的模型和苹果ARKit标准下BlendShape的一一对应关系了!如果你的模型BlendShape命名符合苹果的命名规范它就会自动配对,否则你就可以苦逼地一个一个指定了(当然可以先随便设几个,等跑通了再优化也不迟)。比如按一下+号表示添加一个用得上的ARKit BlendShape,你可以从下拉列表选择其他的BlendShape。按一下里边的+号就是添加一个与之对应的你的模型的BlendShape,按多次就是绑定多个。这里有一个提供给手艺人的小技巧:你可以把它的示例模型丢到你的场景里,然后调它的BlendShape看看会做出什么样的表情,再根据这个表情找到你的模型上与之相对应的BlendShape。对于有的BlendShape可能存在它有你没有的情况,比如MouseSmileLeft,你的模型没有左笑右笑那就统一认为左笑就代表整个笑就好了。当然你用的模型有的BlendShape它可能也没有,比如眼睛闭上,那就选一种闭法好了。另外我把Eye Smoothing调得足够小(当然也可以设为0),因为经过它的Smoothing后,眼睛追踪可能会出现奇怪的跳动现象...然后面板会变成这个样子:
这个Eye Angle Offset是干啥用的?它是用来调整眼睛的角度偏移的,默认情况下它只让你调节水平角和俯仰角的偏差。那为什么要调整角度偏移呢?我们可以看看下面这两个图:
原因大概是原神模型眼睛的朝向和示例头的朝向不一致,但是设备返回的旋转值又是按照它示例头的模型来的,比如(0,0,0)是朝前,但用到我们的模型上就是朝下了。那么如何修正呢?其实就是如何把右图那个轴转成左图这个轴,可以先绕上轴转180度,再绕左轴转90度,具体度数也可以根据喜好自行设置。至于为啥我的Eye Angle Offset里多了一个Z,这是因为我一开始觉得眼球下端有点朝内挤的样子,想让眼睛绕前轴旋转,于是改了它package里DefaultFaceMapper的代码。不过后来发现貌似不转(z=0)问题也不大(左边是不转的,右边是转了12度的):
想添加这个Feature的话就得改它package的代码(直接改会代码回滚,具体方法可以参考这个),具体来说就是找到DefaultFaceMapper.cs,把左右眼对应处代码改成下面这个样子:
费了老大劲搞完FaceMapper以后,弄一弄模型和设备通讯相关。Hierarchy窗口右键->Live Capture->Take Recorder,在该GameObject下创建一个空的子物体(取个名字,比如FaceDevice),添加一个ARKit Face Device组件,Channels中把Head Position去掉(头的位置如果不对的话,会造成身首异处的鬼畜现象)。然后把场景中的角色对象拖到Actor槽里用于获取来自设备的值:
然后就可以玩了!Connections->Start,连上iPad,然后尽情欢乐吧!
要想和其他肢体动画组合的话,就在Timeline上把面部动画丢到override轨道上即可:
效果如下:
如果觉得光头动脸动还不得劲,可以去学学这个Youtube小哥,整全身动捕设备(xsens)以及手套+虚幻。
另外我用这个方法整了个《鸡汤来咯》的视频放到了B站,想看效果的小伙伴可以进去瞧瞧。
写得稀里糊涂的,有啥问题欢迎留言...
参考链接
Live Capture 官方文档
Ready Player Me x Unity Live Capture / Face Capture App
XR人脸捕捉(Unity + iPhone)快速简易版