前言

这篇文章是【Oculus Interaction SDK】系列的一部分,如果发现有对不上的对方,可以回去翻看我之前发布的文章,或在评论区留言。如果文章的内容已经不适用于新版本了,也可以直接联系我,我会持续更新文章内容。

当前适用版本:

  • Unity 版本:2021.3.7f1c1
  • Oculus Interaction SDK 版本:47.0

文章最近更新日期:2023.02.09


设置不同的抓握手势

之前在玩 ALEX 的时候,发现从不同的方向拿起同一件物品时会有不同的抓握手势,这种新奇的交互感受让我的游戏体验大幅提升。现在,使用新版本的 SDK 也可以很方便地设置自定义的抓握手势了

介于内容的特殊性,使用单纯的方块模型就没有什么意思了,我们找一个相对复杂一点的模型来进行演示

在 Project 窗口中搜索 mugMesh 直接拖到场景中,再给模型更换一个辨识度高一点的材质

给杯子添加 Mesh Collider、Rigidbody 和 Grabbable 组件 ,其中 Mesh Collider 需要勾选 Convex 选项

然后到导航栏打开 Oculus > Interaction > Hand Grab Pose Recorder,这个工具可以帮助我们在运行模式下记录手的姿态,并保存为数据文件

  • 选择需要记录手势的手(在这里我选择的是左手),没有选择的手的姿态不会被记录
  • 选择设置手势对应的物体,我们需要他的刚体(Rigidbody)组件
  • 这个工具有一个默认的幽灵手来帮助我们可视化已经录制的手势,在这里我就不做更改了
  • 默认情况下是按下空格键来完成一次记录,你也可以选择其他按键,这里也不做修改

点击 Play 进入运行模式,开始录制不同的手势

录制完成之后记得保存数据,点击 Save To Collection 生成手势集合文件,保存完之后再退出运行模式

退出运行模式后,点击 Load From Collection 将手势数据加载到物品上

(这里有一个 bug,如果你发现 Load From Collection 按钮点击之后没有效果,把整个窗口高度缩小之后再点击就可以了)

对录制的手势进行调整

在打开手势的列表之后,可以看到手部关节处可以调整,可以自己对手势进行为微调

甚至可以搞出很多奇怪的手型

也可以设置抓握时手指的自由度

甚至可以利用已经创建的左手的姿态来镜像一个右手姿态(在 Hand Grab Interactable 组件里)

调整完成后,测试下看看

看起来似乎是实现了使用不同的手势抓取物体,但手的姿态却并不像我们设计的那样受到限制

那么下一步就是要把手的姿态控制住!

限制手的姿态

回到 OculusInteractionSampleRig,找到 LeftHand 和 RightHand,把它们对应的子物体 LeftHandVisual / RightHandVisual 禁用掉

给左右手分别添加对应的 OVRLeftHandSynthetic / OVRRightHandSynthetic 组件(以下所有操作左右手类似,别忘记做另外一只手 ^_^)

别忘记在 I Modify Data From Source Mono 处引用 LeftHand

还需要一个 Hand Grab State Visual 组件,Hand Grab Interactor 引用 HandGrabInteractor,Synthetic Hand 引用自己的 Synthetic Hand 组件

大功告成!!!

使用控制器时,如果模型是手,该怎么实现姿态控制?

我们实现了在手势追踪模式下的手势姿态限制,但是控制器模式下手势姿态就没法使用了

如果我需要在使用控制器的前提下使用手的模型,那么控制器操作的手能不能实现姿态限制呢?

这个问题我会在后续的文章里解决,敬请期待!


参考资料