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


    前言

    前段时间 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,并将其添加到场景中

     

    制作所需的手势

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

     

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

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

     

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

     

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

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

     

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

     

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

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

     

    实现手势识别功能

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

     

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

     

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

     

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

     

    测试下效果

     

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

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

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

     

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

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

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

     

     

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

     

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

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

    这个问题该如何解决呢?

     

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

     

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

     

    大功告成!

     


    参考资料

    Hand Pose Detection with Oculus Interaction SDK - YouTube

  • 相关阅读:
    .NET周刊【5月第2期 2024-05-12】
    测试计划包括哪些内容?目的和意义是什么?
    改进YOLOv5、YOLOv7系列:首发最新改进一种强大性能的全新架构(顶会2022), 该架构精度超越TPH-YOLOv5, 新范式高效涨点
    事件循环与 async/await
    新手教程,蛋糕小程序的搭建流程一网打尽
    阿里滑块x5sec 226算法分析
    Go底层总结
    DevExpress开发WPF应用实现对话框总结
    qtpdfium的编译及读取pdf文件和一些简单操作
    国产1.8V低电压输入,可用于驱动步进电机;H 桥驱动电路单元可以直接驱动IR-CUT
  • 原文地址:https://www.cnblogs.com/Christa/p/17078196.html