【Oculus Interaction SDK】(十)在 VR 中使用手势识别

时间:2023-02-20 16:10:15

前段时间 Oculus 的 SDK 频繁更新,很多已有的教程都不再适用于现在的版本了。本系列文章的主要目的是记录现版本常见功能的实现方法,便于自己后续开发。当然,不排除我文章刚写完 SDK 又变了的可能性,所以如果有人发现文章的内容已经不适用于新版本了,也可以留评论或者私信我,我会持续更新文章内容。

当前适用版本:

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

文章最近更新日期:2023.02.20

 


环境准备

项目创建与添加 SDK 的具体方式不再描述,之前的文章中有提到过

【Oculus Interaction SDK】(一)设置 VR 相机与控制器 & 实现简单的抓取功能 - 千叶Christa - 博客园 (cnblogs.com)

 

创建一个新场景,删除原相机,在 Project 窗口搜索 OculusInteractionSampleRig,并将其添加到场景中

【Oculus Interaction SDK】(十)在 VR 中使用手势识别

 

制作所需的手势

创建一个空物体 Poses 作为要制作的所有手势的父级,在它之下再创建一个空物体 Bunny Right(右手的兔子手势),用来记录我们需要测试的手势

【Oculus Interaction SDK】(十)在 VR 中使用手势识别

 

为 Bunny Right 添加 Shape Recognizer Active StateHand Ref 组件,并完成组件之间的引用

注:文章中用到的手是右手,如需使用左手,请引用 LeftHand

【Oculus Interaction SDK】(十)在 VR 中使用手势识别

 

接下来,我们需要为手势记录器(Shape Recognizer Active State)添加手势

 

在 Assets 文件夹下新建一个 Hand Pose 文件夹,用于存放手势相关的数据文件

右键 > Create > Oculus > Interaction > SDK > Pose Detection > Shape,创建一个手势文件 Bunny

【Oculus Interaction SDK】(十)在 VR 中使用手势识别

 

我们可以通过这个文件来创建想要的手势(图中设置为兔子手势)

【Oculus Interaction SDK】(十)在 VR 中使用手势识别

 

关于手势设置的详细信息,可以参照这篇文章

【Oculus Interaction SDK】(十一)关于手势识别中手势设置的详细信息 - 千叶Christa - 博客园 (cnblogs.com)

 

实现手势识别功能

把设置好的手势 Bunny 添加到 Shape Recognizer Active State 的手势列表中

【Oculus Interaction SDK】(十)在 VR 中使用手势识别

 

接着添加一个 Active State Selecter 组件,并引用 Shape Recognizer Active State 组件,这样我们就可以检测手的姿态了

【Oculus Interaction SDK】(十)在 VR 中使用手势识别

 

现在,我们需要检测手势识别的效果

 

在场景中新建一个 Cube,设置好大小和位置,并添加 Selector Debug Visual 来可视化手势的检测结果

【Oculus Interaction SDK】(十)在 VR 中使用手势识别

 

测试下效果

【Oculus Interaction SDK】(十)在 VR 中使用手势识别

 

从上面的测试结果来看,我们的手势姿态已经可以被检测到了。但是当我压下手腕做出“剪刀”手势的时候,检测器依旧会把手势识别为“兔子”。

“剪刀”与“兔子”手势在手指设置上是相同的,但是对应的手掌与手腕的方向并不相同,能不能对这一点进行进一步的区分呢?

我们下一步就来解决这个问题!

 

设置手腕与手掌的方向限制

回到 Bunny Right,添加 Transform Recognizer Active State 组件

  • 在 Hand 处引用 Hand Ref 获取手的姿态
  • 在 Transform Feature Configs 处选择 Palm Away From Face(手掌远离面部),并标记为 True
  • 在 Up Vector Type 处选择 World,使手势的向上的方向与世界保持一致
  • 在 Feature Thresholds 处打开选择器,选择默认的特征阈值文件

【Oculus Interaction SDK】(十)在 VR 中使用手势识别  【Oculus Interaction SDK】(十)在 VR 中使用手势识别

 

Feature Threshold 文件保存了每个手指的阈值配置,你也可以创建一个新的阈值文件要保存自定义的设置(在这里我直接使用了默认文件)

【Oculus Interaction SDK】(十)在 VR 中使用手势识别

 

回到 Punny Right,现在我们有两个手势识别器:Shape Recognizer Active State 和 Transform Recognizer Active State

但是在 Cube 的 Selector Debug Visual 组件上只能引用一个识别器

这个问题该如何解决呢?

 

为 Punny Right 添加 Active State Group 组件,将两个识别器都添加到 Active States 列表中,并将 Logic Operator 改为 AND(同时满足两个条件)

【Oculus Interaction SDK】(十)在 VR 中使用手势识别

 

在 Active State Selector 处引用 Active State Group,这样就完成了!

【Oculus Interaction SDK】(十)在 VR 中使用手势识别

 

大功告成!

【Oculus Interaction SDK】(十)在 VR 中使用手势识别

 


参考资料

Hand Pose Detection with Oculus Interaction SDK - YouTube