使用 VIVE Tracker 打造 VTuber
(您可以在这里下载一个完整的虚拟形象示例程序,并且在这里查阅如何使用)
两年前我们介绍过使用 Vive 和 VRM 打造 Vtuber,今天我们来介绍一下使用 VIVE Tracker 实现全身动捕,功能也更全面的 VTuber。
我们将使用道乐师提供的全身动捕插件,除此之外,跟上次一样,需要 SteamVR 以及 OVRLipSync。关于道乐师全身动捕,可以参考这篇文章。
SteamVR v2.6.1
https://github.com/ValveSoftware/steamvr_unity_plugin/releases/tag/2.6.1
OVRLipSync 1.30.0
https://developer.oculus.com/downloads/package/oculus-lipsync-unity/
道乐师全身动捕 Unity 插件
https://www.sunnyview.tech/dollarsmocap
你也可以在这里下载完整项目,文章最后有成果视频。
https://github.com/fengkan/UnityChanKAGURA_URP_DollarsMoCap
这次我们将借用 UnityChan 的最新项目,UnityChanKAGURA,在下面的地址下载,
https://github.com/unity3d-jp/UnityChanKAGURA
打开之后运行,可以看到使用 URP 渲染的最新版 UnityChan。
准备工作
我们把 UI、Timeline 下的对象,以及 VCAM 对象全都无效,
再把 UnityChanKAGURA 的 Animator Controller 置空,
稍许调整一下 Main Camera 的位置,运行程序,将是这个样子,
准备就做得差不多了,接下去我们将依次为 UnityChan 添加动作,口型,手势和表情。
动作
首先添加动作。
将道乐师的 Unity 插件导入项目,并且将其中的 DollarsMoCap prefab 拉到场景中。
然后为 UnityChanKAGURA 添加 MoCapSrc 组件,将刚才添加的 DollarsMoCap prefab 设置到 src 变量。
动作就搞定了。
此时,打开道乐师主程序,载入一段 bvh,就可以看到 UnityChan 跟着动了起来。
口型
其次是口型,因为我们这次没有使用 VRM 模型,口型比上次还会简单些。
首先将 OVRLipSync 插件导入项目。
插件安装完成后,将 Oculus\LipSync 目录下的 LipSyncInterface 加入场景。
之后我们在场景中新建一个空的对象,命名为 LipSync,并且在其上添加 OVRLipSyncContext,OVRLipSyncContextMorphTarget 和 OVRLipSyncMicInput。添加 OVRLipSyncMicInput 后,我们可以勾选其中的 Enable Mic Selection GUI 选项,这将方便我们在运行时指定语音输入的麦克风。
之后,我们在 OVRLipSyncContextMorphTarget 的 Skinned Mesh Renderer 中选中 UnityChan 的头部 head_Def,并且修改各 Blend Target 如下,
最后,我们在场景的 Main Camera 中增加一个 Audio Listener 组件。
口型完成了!
语音合成加上外放音箱录音,音质请忽略吧。
手势
接下去我们为 UnityChan 添加手势。我们将使用 VIVE 手柄来控制手势。
首先添加 SteamVR 的插件,然后在 SteamVR Input 中增加 TouchPad,Menu 两个 Action 并绑定,这部分可以参见前文,这里就略过了。
完成 SteamVR 设置后(顺便一提,这是整个过程中最需要祈祷的部分),我们将 SteamVR 目录下的 [CameraRig] 加入场景,将 [CameraRig] 中的 Mesh Renderer 无效,
无效其中的相机,
另外,当项目加入 SteamVR 之后,相机有可能被置为通过头显显示,我们将 Main Camera 的 Target Eye 调整回 None(Main Display)。
完成这些设置后,建议你启动下程序,确认下一切仍然是正常的。
如果没有问题,我们可以从 github 中复制 HumanoidHandPose.cs 进项目,然后将它添加在 UnityChanKAGURA 之上。
启动程序,切换 Right Shape 或者 Left Shape,可以看到 UnityChan 的手势也会发生相应变化。
在进一步工作前,我们在 [CameraRig] 下的 Controller (left) 和 Controller (right) 中,分别添加一个 Cube 和一个 Sphere。
这样做的目的,是为了让我们在程序启动后,可以根据手柄上的模型判断 VIVE 手柄应该握在左手还是右手,你可以添加任何便于识别的模型,上面的修改效果如下,
之后,将 Github 中的 UnityChanHandController.cs 复制进项目,并且添加到 UnityChanKAGURA 上,其中的 Trigger 以及 Pos 分别如下图所示选择 Teleport 以及 TouchPad。
这个组件的作用,是通过判断按下 TouchPad 时手指的位置,切换不同的手势,这样我们握着手柄,就能控制 UnityChan 的手势了。
如果你觉得现有的手势不够丰富,可以在 HumanoidHandPose.cs 中添加,然后通过 UnityChanHandController.cs 映射到 TouchPad 上,当然,只要你实际使用中记得住就行。
最后,我们在 UnityChanKAGURA 再添加一个 UnityChanHideMesh 组件,并且把 [CameraRig] 下的手柄模型以及我们追加的 Cube 和 Sphere 加入组件中的 gos 数组。
在 Trigger 中指定 Menu,修改后 UnityChanHideMesh 如下。
这样,程序启动后,在我们知道两个手柄分别应该握在哪个手之后,可以按下 Menu 键把这些模型都隐藏起来。
手势搞定了。
表情
最后是表情。
我们为 UnityChanKAGURA 添加 UnityChanBlink,UnityChanExpression,UnityChanExpressionController 三个组件,并且将 UnityChanExpressionController 的 Trigger 置为 InteractUI,Pos 置为 TouchPad。
粗略介绍一下代码的话,UnityChanExpression 负责将 UnityChanKAGURA 的 BlendShape 封装成“眨眼”,“微笑”这样的表情,UnityChanBlink 每隔一定时间通过调用 UnityChanExpression 来眨眼,UnityChanExpressionController 则与 UnityChanHandController 一样,根据我们按下 TouchPad 的位置,来切换不同的表情。用起来像这样。
注意,我们可以通过左右手的组合来触发更多表情,视频中没有拍出来。
最后上一个成果。
参考: