【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 State 和 Hand 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
【Oculus Interaction SDK】(十)在 VR 中使用手势识别的更多相关文章
- 【Oculus Interaction SDK】(一)设置 VR 相机与控制器 && 实现简单的抓取功能
前言 前段时间 Oculus 的 SDK 频繁更新,很多已有的教程都不再适用于现在的版本了.本系列文章的主要目的是记录现版本常见功能的实现方法,便于自己后续开发.当然,不排除我文章刚写完 SDK 又变 ...
- 【Oculus Interaction SDK】(三)限制可操作物体的移动 / 旋转
前言 这篇文章是[Oculus Interaction SDK]系列的一部分,如果发现有对不上的对方,可以回去翻看我之前发布的文章,或在评论区留言.如果文章的内容已经不适用于新版本了,也可以直接联系我 ...
- 【Oculus Interaction SDK】(二)抓取释放效果的物理优化
前言 这篇文章是[Oculus Interaction SDK]系列的一部分,如果发现有对不上的对方,可以回去翻看我之前发布的文章,或在评论区留言.如果文章的内容已经不适用于新版本了,也可以直接联系我 ...
- 【Oculus Interaction SDK】(六)实体按钮 && 按压交互
前言 这篇文章是[Oculus Interaction SDK]系列的一部分,如果发现有对不上的对方,可以回去翻看我之前发布的文章,或在评论区留言.如果文章的内容已经不适用于新版本了,也可以直接联系我 ...
- 【Oculus Interaction SDK】(五)设置不同的抓握手势
前言 这篇文章是[Oculus Interaction SDK]系列的一部分,如果发现有对不上的对方,可以回去翻看我之前发布的文章,或在评论区留言.如果文章的内容已经不适用于新版本了,也可以直接联系我 ...
- VR中的Redirection
在虚拟现实(Virtual Reality,VR)中,很重要的一点就是用户的在虚拟环境中的漫游(navigation).除了固定视点的VR电影,一般的VR应用,特别是游戏或者其他交互式的应用,都会依赖 ...
- VR中的“寻路(wayfinding)”
虚拟现实(VR)中很重要的一个问题就是Locomotion(用户在VR中的移动).这个Locomotion分为两种,一种是点对点的,如传送门的方式,一种是包含了可以操控的中间过程的,这种被称为“导航( ...
- 什么是VR中的Locomotion?
Locomotion,本文中我称之为移位,是VR研究中最重要的话题之一.因为它属于VR中三大元老级操作(Selection选择,Manipulation操纵物体,Locomotion移位),其中,前两 ...
- 浅谈html5在vr中的应用
使用过HTML5制作动画过程的开发者都知道,HTML5页面给人一种逼真的感觉,同时HTML也是可以制作VR页面,但是需要你熟练HTML5与JavaScript开发过程,所以在有必要的情况下,我们可以用 ...
- 【笔记】android sdk集成的eclipse中导入项目
android sdk集成的eclipse中导入项目 想要把旧的ADT项目,一模一样的导入进来,需要: 1.把项目放到,非当前ADT的workspace目录下: 2.从Project中Import,选 ...
随机推荐
- C温故补缺(一):数据类型和基本类型占位
数据类型 基本类型:就是算术类型,包括整型和实型 枚举类型:一组离散的整数 void类型:无可用值类型 派生类型:指针(*),数组([]),结构体(struct),共用体(union),函数(fun( ...
- 6 STL-vector
重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦! 生命就像一朵花,要拼尽全力绽放!死磕自个儿,身心愉悦! 写在前面,本篇章主要介绍S ...
- 安装BurpSuite (专业版)
BurpSuite简介: Burp Suite 是用于攻击web 应用程序的集成平台.它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程.所有的工具都共享一个能处理并显示HTT ...
- 【大数据面试】【框架】Zookeeper作用、半数机制、命令、安装台数
〇.作用 存储和管理数据 Zookeeper=文件系统+通知机制 树形结构,每个节点被称为一个Znode(1MB) 一.半数机制 1.注意 安装奇数台(4台) 二.常用命令 ls get create ...
- 《MySQL必知必会》之快速入门游标和触发器
第二十四章 使用游标 本章将介绍什么是游标以及如何使用游标 游标 之前的select语句检索出来的数据,没有办法得到第一行或者下一行 有时,需要在检索出来的行中前进或后退一行或多行.这就是使用游标的原 ...
- 第一百一十四篇: JS数组Array(三)数组常用方法
好家伙,本篇为<JS高级程序设计>第六章"集合引用类型"学习笔记 1.数组的复制和填充 批量复制方法 copyWithin(),以及填充数组方法fill(). 这两 ...
- 万万没想到,go的数据库操作,也能像php一样溜了
Hi,各位go的小伙伴. 很多人都是从php转过来的吧,不知道你们有没有发现,go界的orm并没有像php的orm一样好用.这篇文章里,我们认真的讨论下这个问题,并且会在后面提出解决方案. php的方 ...
- docker搭建Elasticsearch、Kibana、Logstash 同步mysql数据到ES
一.前言 在数据量大的企业级实践中,Elasticsearch显得非常常见,特别是数据表超过千万级后,无论怎么优化,还是有点力不从心!使用中,最首先的问题就是怎么把千万级数据同步到Elasticsea ...
- Redis学习整理
目录 1.Redis基本概念 2.Redis的5种基本类型 3.Jedis整合redis操作 4.Springboot整合redis 5.Redis主从复制 5.1.概念 5.2.原理 6.开启主从复 ...
- JVM面试大总结
一.汇总 JVM是运行在操作系统之上的,它与硬件没有直接的交互.先说一下JVM的内存区域,当函数开始运行时,JVM拿到自己的内存将自己的内存区域进行了分割,分为五块区域:线程共享的有堆.方法区,线程私 ...