IK(反向动力学)有利于提升 VR 应用中的沉浸感,比如我们可以通过对手部的追踪,再结合 IK,来模拟 VR 中人物的手臂和手肘的姿态。
Final IK 是 Unity 一款功能强大的 IK 插件,其中拥有适用于 VR 的 IK 功能(称为 VRIK,Asset Store 链接:https://assetstore.unity.com/packages/tools/animation/final-ik-14290)
Hurricane VR 是一款开发 Unity VR 的插件,拥有强大的物理交互功能。它可以集成 Final IK 中的 VRIK,实现拟真的 IK 效果。(Asset Store 链接:https://assetstore.unity.com/packages/tools/physics/hurricane-vr-physics-interaction-toolkit-177300)
虽然单独一个 Final IK 插件已经能实现 VR 中的 IK 功能,但是 Hurricane VR 集成 Final IK 后拥有更加方便的配置步骤和更加强大的功能。因此本篇博客将介绍如何设置 Hurricane VR 插件中的 VRIK。
使用的 Unity 版本:2021.3.5,基于OpenXR
使用的 VR 设备:Meta Quest 2
使用的插件:Final IK 2.1 , Hurricane VR 2.8.8 (正版资源在 Unity Asset Store 里可以搜到,需要付费)
Hurricane VR 官方文档:https://cloudwalker2020.github.io/HurricaneVR-Docs/manual/intro.html
这一步大家可以参考官方文档中的 Project Setup 和 Project Settings 。因为过程比较简单,这里就不赘述了。本篇博客用的 XR Plugin 是 PC 端的 OpenXR。
找到项目文件夹中 HurricaneVR/Framework/Integrations/FinalIK,双击导入 Unity 包。
导入后 Console 里面应该还会报出缺少某些组件的错误。这时候我们还需要额外导入 Final IK 的包,这个与 Hurricane VR 中的 FinalIK Inegration 是不一样的。大家可以从网上自行下载资源。我这边导入后是这样一个文件夹:
注意事项:人物模型的 Rig 下的 Animation Type 需要是 Humanoid,并且模型的两只手要左右对称。
然后将模型拖入场景,并且把人物的游戏物体 Unpack 掉,如下图中的 Latifa 游戏物体。
检查人物的 Inspector 面板中有没有赋值了 Humanoid Avatar 的 Animator 组件。
打开项目文件夹的 HurricaneVR/TechDemo/Scenes/Scene_barebones场景:
找到场景中的这两个物体(因为我用的是 OpenXR,所以选择下面这个名字带有 OpenXR 的 TechDemoXRRigOpenXR 物体,如果用的是 SteamVR 或者 Oculus 插件,选择 TechDemoXRRig),把它们复制到我们设置 VRIK 的场景,并且删除场景中的 Main Camera 。
点击 Unity 编辑器最上方菜单栏的 Tools/HurricaneVR/VRIK Setup
然后会出现一个 VRIK Setup 面板:
将人物的游戏物体拖到上图中的 Avatar 进行赋值。
然后点击 Setup 按钮,这时候面板会变成下图这个样子:
接着点击上图中的 “Detect Mirror”,面板会变成下图这个样子:
(如果这步失败了,可能是模型本身的问题,比如两只手没有左右对称)
经过上面的步骤,VRIK 会自动在人物的手部节点创建 Palm 子物体,在人物的手指节点创建 Tip 子物体。Plam 代表手掌的位置,Tip 代表手指的位置。
我们先在 Hierarchy 面板搜索 Plam,随便点击一个,先把一边手设置完毕:
我这边选择了第一个,位于左手上:
点击 Plam 物体,在 Scene 窗口调整它的位置,使它大致位于手掌中心。接着调整旋转角度,使 Forward 轴(蓝色的轴)大致垂直于手掌,箭头方向由掌心向外:
另一边手的 Plam 的设置也是同样的道理。
现在 Plam 已经设置完毕了,接下来需要设置 Tip。我们在 Hierarchy 面板搜索 Tip:
因为刚刚我们设置的是左手的 Plam,所以我们要找到任意一个左手的 Tip,我这里找到了食指(Index Finger)上的 Tip:
实际上,VRIK 会给五个手指头都添加 Tip 子物体,所以我们展开手指模型节点,可以找到五个 Tip:
接下来,我们要调整这五个 Tip 的 Position,让它们位于对应指腹的中心,如下图所示:
另一边手的 Tip 的设置也是同样的道理。
点击 VRIK Setup 面板中的 Start Mirroring:
这时候场景出会多出一个克隆的人物模型,并且 Hierarchy 面板自动定位到了右手腕的关节上:
我们拖动,旋转这个定位好的物体,可以发现另一边手也会同步变化。我们的目的是检查两只手是否能镜像变化。如果能,就可以 Stop Mirroring 了;如果不能,可能是模型本身的 Rig 有问题。测试期间,可以把手的本地坐标改为世界坐标,这样子观测镜像会更方便:
如图所示:
这时候,VRIK Setup 面板的 Rig Setup 部分变成了下图所示的样子:
点击 Setup Rig References:
点击 VRIK Setup 面板中的 Auto Setup Prefab/HVRSettings
然后 Assets 文件夹下会新增这个人物模型的预制体:
我们可以把它放到自己想要的文件夹下。然后点击 VRIK Setup 面板中的 Create Hand Poser:
可以看到这里有三个地方需要赋值:Relaxed Pose(自然状态下的手部姿态),Open Pose(手掌打开的手部姿态),Closed Pose(手掌合上的手部姿态,一般指抓取后握拳的姿势),这就是我们接下来需要创建的目标。
创建 Hand Poser 后,Hierarchy 面板中会多出一个 PoseSetup 物体:
我们在 PoseSetup 的 Inspector 面板中勾选 HVR Hand Poser 脚本的 LeftHand: Preview
然后场景中 PoseSetup 处会多出只有左边手臂的人物模型:
选中 PoseSetup 物体,我们可以点击上方的这个 Target (下图中圈出的这个)调整手部的位置和旋转。显示方块的时候可以调整手部 IK 的 Position:
点击这个方块,会从方块变为一个球体,此时可以调整手部 IK 的旋转角度:
我们可以调整出一个自己想要的姿态,不过手心的朝向是没有多大的影响的。调整完毕后在 PoseSetup 的 Inspector 面板中勾选 HVR Hand Poser 脚本的 RightHand: Preview ,这时候将会出现人物模型的右手臂,然后点击 Mirror 按钮,右手的姿态将会称为左手的镜像,如果姿态看着别扭,可以将取消勾选 RightHand: Preview,重新调整左手的 IK 姿态,再重新勾选右手的 Preview 并且 Mirror:
设置完毕后,我们点击 HVR Hand Poser 中的 Save As,把设置的手势保存在一个文件夹里,相当于我们创建了一个手势的配置文件,里面记录了一个手势的姿态信息:
同理,我们创建 Open Pose 和 Closed Pose。这里还有个小技巧,如果我们想修改之前创建的 Pose,可以点击 HVR Hand Poser 中的 Pose,找到想要修改的 Pose:
如果想要创建 Closed Pose 这种握拳的手势,我们可以看到人物模型的手上有很多关节节点,旋转它们可以调整手指的弯曲程度。
最后,在 VRIK Setup 面板中赋上我们创建的三个手势,然后点击 Setup Poses:
这时候面板会变成下面这个样子:
总的来说,设置手势的步骤就是:
1)在 PoseSetup 物体的 HVR Hand Poser 脚本中将一边手的 Preview 打开
2)在 Scene 窗口中调整手势
3)在 HVR Hand Poser 脚本中将另一边手的 Preview 打开,并且点击 Mirror
4)反复调整,最后保存 Relaxed Pose,Open Pose,Closed Pose 三个手势的配置文件,在 VRIK Setup 面板中进行赋值
点击 VRIK Setup 面板中的 Start Solving:
这个时候 Scene 窗口里原始的人物模型会发生一些变化,并且场景中新创建了一个 RightIKTarget 物体:
注意看场景中这双悬浮的手,这是 Hurricane VR 中的 Physics hand,具有物理交互的功能。
移动,旋转场景中新创建的 RightIKTarget,人物模型的手臂也会跟着移动或旋转。我们的目标就是让人物模型的手的位置和旋转角度能大致和这双悬浮的手重合。
接下来,我们在 Hierarchy 面板中搜索“JointAnchor”:
我们要调整 JointAnchor 的位置,让它位于人物模型的手掌附近。
在 VRIK Setup 面板中点击 Add Collider Controller:
这个时候 Hierarchy 面板中的 Physics LeftHand 和 Physics LeftHand 的子物体会多出 Colliders 子物体:
展开 Colliders 物体,子物体 HandBox 会给人物模型的手部添加碰撞体:
这个时候人物模型的根物体(Hirerarchy 层级中人物模型最顶层的父物体)会自动添加一个 HVR Hand Collider Controller 脚本:
然后选择一个 Hand Curve,这里大家可以自行尝试不同 Curve 的区别,我选择了下图中的这个:
之前的设置实现了上半身的 IK 效果,如果要在人物行走的时候让腿部做出行走的动画,我们可以用 VRIK 自带的 Animator Controller。
首先在 Hierarchy 面板中找到人物模型,在 Inspector 面板中找到 Animator 组件:
添加名为 “VRIK Animated Locomotion 的 Animator Controller
最后,我们点击 VRIK Setup 面板中的 Stop Solving :
然后就可以准备运行程序进行测试了,主要查看 IK 的效果,手柄位置和人物手部是否有较大偏差,如果有,可以回到第十一步反复调整 IK Target 的位置。
运行测试完后,将 Physics LeftHand 和 Physics RightHand 下的 LeftHandModel 和 RightHandModel 子物体给隐藏或者删除掉。
最终效果: