Unity Meta Quest 一体机开发(三):【手势追踪】Oculus Integration/Meta XR SDK 基本原理、概念与结构+玩家角色基本配置

这篇具有很好参考价值的文章主要介绍了Unity Meta Quest 一体机开发(三):【手势追踪】Oculus Integration/Meta XR SDK 基本原理、概念与结构+玩家角色基本配置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


此教程相关的详细教案,文档,思维导图和工程文件会放入 Spatial XR 社区。这是一个高质量知识星球 XR 社区,博主目前在内担任 XR 开发的讲师。此外,该社区提供教程答疑、及时交流、进阶教程、外包、行业动态等服务。

社区链接:
Spatial XR 高级社区(知识星球)
Spatial XR 高级社区(爱发电)

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎


📕教程说明

这篇教程将会介绍 Meta XR SDK(旧版叫做 Oculus Integration)中处理手部数据的基本流程和交互的流程,并且配置一个基本的玩家物体,在虚拟场景中能够看到拥有手势追踪的手部模型。(下文中提到的 Oculus Integration 同样使用于 Meta XR SDK)

系列教程专栏:https://blog.csdn.net/qq_46044366/category_12118293.html

配套的视频链接:【2023 VR+MR全硬件开发教程】三(上)、Quest Integration基本原理概念与结构(上)-知识点讲解(主讲:YY)
【2023 VR+MR全硬件开发教程】 三 (下): 手势追踪与玩家角色配置(主讲:YY)

环境配置可参考:https://blog.csdn.net/qq_46044366/article/details/133967343

​电脑操作系统:Windows 11

使用的 VR 设备:Meta Quest 3(Quest 系列都适用)

使用的 Unity 版本:2021.3.5 LTS (这里推荐使用 2021 及以上的 LTS 版本)

Oculus Integration 版本:v57

官方文档:https://developer.oculus.com/documentation/unity/unity-gs-overview/
https://developer.oculus.com/documentation/unity/unity-isdk-architectural-overview/


📕输入数据

VR 中的双手要么就是用手柄控制,要么就是用手势追踪控制。当我们使用手柄作为输入的时候,虚拟世界中的手部会同步现实世界中手柄的位置和旋转,使用手势追踪作为输入的时候,虚拟世界中的手部会同步现实世界中手的姿态。然后 VR 中的头部由头显控制,也就是说我们的视角可以根据现实中头显的位置和旋转发生变化。因此,现实世界中头显和手柄的追踪数据会被传输给虚拟世界中的头部和手部,然后虚拟世界中的头和手就会同步现实中的位置和旋转。同样,这个概念适用于所有的 VR SDK。
那么 Oculus Integration 中用了一系列 From OVR…Source 组件来获取追踪的数据。在 Oculus Integration V57 版本中具体分为这 5 个组件:

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎
From OVR Body Data Source:获取上半身身体运动姿态数据。
From OVR Controller Data Source:获取手柄姿态数据,在虚拟世界中以手柄模型来表示。
From OVR Controller Hand Data Source:获取手柄姿态数据,在虚拟世界中以手部模型来表示。
From OVR Hand Data Source:获取手势追踪的手部姿态数据。
From OVR Hmd Data Source:获取头显的姿态数据。

获取了追踪数据之后,Oculus Integration 会用相应的接口去处理对应类型的数据,这些接口分为 IController, IHand, IHmd, and IBody,对追踪数据进行处理和包装之后,才能适配 SDK 中的一些组件。这样,这些组件就能够利用获取的数据去实现相应的交互功能。


📕Oculus Integration 处理手部数据的推荐流程

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

首先通过 FromOVRHandDataSource 获取头显追踪到的手部数据。

然后数据会被传给 HandFilter 组件,这个组件就实现了 IHand 接口,它能够进行一些防抖的处理。

接下来 SynthethicHand 组件会对手部关节的数据进行进一步的处理,它会在特定情况下覆写,也就是 override 手部关节的数据,从而限定虚拟手部的手势。比如我在 VR 中用手按压一个按钮,当我按到底的时候,按常理来说我的手是不能再往下按了,否则就会穿过按钮,产生穿模现象。但是因为我在现实世界中可能没有在按一个真的按钮,所以现实中的手是可以继续往下按的,而 VR 中的手需要同步现实世界里手部的位置,那么这种情况下 VR 中的手就必定会穿过按钮。而 SynthethicHand 组件就能够限制虚拟手部的位置,当按钮按到底的时候,这个组件就能限制 VR 中的手无法继续向下移动。还有 VR 中的抓取也是类似的原理,当你用手抓到这个物体的时候,会呈现出一个抓取的手势,而 SynthethicHand 组件能够限定住抓取手势的姿态。

当 SynthethicHand 对手部数据进行处理之后,就会由 HandVisual 组件来渲染虚拟手部的姿态。


📕VR 中交互的基本概念

VR 中的交互需要有两个对象参与。一个是 Interactor,一个是 Interactable。Interactor 是发起交互的对象,Interactable 是可以被交互的对象。以抓取交互为例,抓取的流程就是用手去抓一个物体的过程,那么手就是发起抓取的对象,也就是 Interactor,物体就是可以被抓取的对象,也就是 Interactable。这个 Interactor 和Interactable 的概念会在我们后续的教程中经常用到,这个概念在其他的 VR SDK 中也会见到。


📕Oculus Integration 中的交互流程

Oculus Integration 中有不同的 Interactor 组件,它们通常被挂载到表示手部或者手柄的物体上。当 Oculus Integration 获取了设备的追踪数据后,它就知道虚拟世界中的手或者手柄的位置和旋转角度应该是什么样的,这个时候手部或者手柄物体上的 Interactor 就会寻找对应的 Interactable。比如抓取相关的 Interactor 会寻找周围有没有可以被抓取的对象,点触(Poke)相关的 Interactor 会寻找周围有没有可以被点击的对象,如下图所示:

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

当 Interactor 检测到 Interactable 对象时,会进入到 Hover 状态。不过判断是否检测到需要一些条件,以手势追踪为例,需要满足下面这几个条件:

  1. 手要靠近 Interactable 对象
  2. 确保当前手上没有其他的 Interactor 正在与对应的 Interactable 对象交互
  3. 手要做出 Interactor 触发需要的手势。比如用手点击 UI 按钮的交互,需要伸出食指,如果伸出的是小拇指,就无法触发。

满足条件后,就会进入 Hover 状态,相当于准备开始交互的阶段。Hover 可以类比成鼠标悬停的操作。

进入 Hover 状态后,完成交互动作就能进入 Select 状态。比如还是点击 UI 按钮的交互,当我伸出食指并且靠近按钮时,会进入 Hover 状态,用食指戳到按钮的时候就会转变为 Select 状态,表示点击的交互动作完成。然后当我取消点击动作之后,也就是将手远离按钮的这一过程中,交互状态就会先由 Select 变为 Hover,再由 Hover 变为 Normal。那么我这里给出 Meta 官方提供的 Interactor-Interactable 交互状态切换图(https://developer.oculus.com/documentation/unity/unity-isdk-interactor-interactable-lifecycle/):

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

Disabled 就是无法发生交互的状态。然后默认状态是 Normal,当交互功能被开启的时候,就会在 Normal,Hover,Select 这三个状态之间互相切换。


📕配置一个基本的玩家物体

现在,我们已经对 Oculus Integration 中的处理手部数据的流程和交互的基本概念有了初步的认识。接下来,我们在 Unity 中配置一个玩家物体,之后在介绍各种交互功能的时候就可以在这个玩家物体上不断添加功能。

前置的环境配置可以参考这篇教程:Unity Meta Quest 一体机开发:前期准备和环境配置(2023 版,Oculus Integration v57)

首先新建一个场景,删去场景中的 Main Camera,然后添加一个 Plane 物体作为地面。

⭐OVRCameraRig

然后在如下文件夹中找到 OVRCameraRig 预制体,或者在 Project 窗口中搜索这个物体:

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎
oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

将该物体拖到场景中,找到它身上的 OVR Manager 脚本,将 Tracking Origin Type 改为 Floor Level:

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

选择 Floor Level,会以安全区的地面(打开 VR 设备一般都会先设置地面高度,然后划安全区)作为参考系,运行程序后头部高度会以地面作为参考点,初始高度相当于摆放在场景中的眼部相机的高度加上现实中玩家头显到安全区地面的距离。Tracking Origin Type 的区别可以参考这篇文章:https://blog.csdn.net/qq_46044366/article/details/131616046

⭐OVRInteraction

搜索 OVRInteraction 预制体,将它拖入 Hierarchy 面板,作为 OVRCameraRig 的子物体。这个 OVRInteraction 物体就是负责所有交互功能的父物体。

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎
oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎
oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

OVRInteraction 下自带一个 OVRHmd 物体,用于获取头显追踪姿态的数据。

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

⭐OVRHandPrefab

搜索 OVRHandPrefab 预制体,先将它拖到 OVRCameraRig > TrackingSpace > LeftHandAnchor 下:

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎
oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎
oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎
打开 OVRHandPrefab 的 Inspector 面板,除了 OVR Hand 和 OVR Skeleton 脚本,其他的脚本先取消勾选:

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

然后在 OVR Skeleton 脚本里, 勾选 Enable Physics Capsules:

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

然后将这个 OVRHandPrefab 复制一份,作为 RightHandAnchor 的子物体:

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

将右手 OVRHandPrefab 的 OVRHand 和 OVRSkeleton 脚本的 Hand Type 从 Hand Left 改为 Hand Right:

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

⭐OVRHands

搜索 OVRHands 预制体,将它作为 OVRInteraction 的子物体:

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

我们可以展开这个预制体:

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

点击 OVRHandDataSource 物体,它上面挂载了 FromOVRHandDataSource 脚本,用于获取手部的姿态数据:

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

点击 HandDataLeft,它上面挂载了一些实现 IHand 接口的脚本,用于处理获取到的手部追踪数据,其中 Hand Filter 就是刚刚介绍的用于防抖处理的脚本:

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

展开 HandVisualsLeft,它有个 OVRLeftHandVisual 子物体,上面有一个 Hand Visual 组件,用于渲染手部模型:

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

但是默认的 OVRHands 预制体下没有挂载了 SynthethicHand 脚本的物体,我们可以手动添加。

⭐OVRLeftHandSynthetic/OVRRightHandSynthetic

搜索 OVRLeftHandSynthetic 和 OVRRightHandSynthetic 预制体,将它们作为 OVRHands 的子物体:

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎
oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

找到 OVRLeftHandSynthetic 物体上的 SyntheticHand脚本,将 LeftHand 物体拖入 I Modify Data From Source Mono 变量,右手同理:

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎
oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

然后我们展开这两个预制体,它们下面各有一个 HandVisual 子物体,用于渲染手部模型。

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

但是 OVRHands 物体的 LeftHand 和 RightHand 下也有用于渲染手部模型的物体,这时候如果我们运行程序,会发现手部模型闪烁。这是因为场景中会渲染两双手,手部模型重合在一起就会发生闪烁。

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎
因此,我们需要把 LeftHand 和 RightHand 下的 HandVisualsLeft 和 HandVisualsRight 物体隐藏掉,保证渲染的是 SyntheticHand。

oculus驱动函数进行手势识别开发,# Unity Quest 一体机开发,unity,游戏引擎

现在运行程序,如果你能看到手势追踪的双手,就说明玩家物体配置成功了。不过 SyntheticHand 的效果要结合具体的交互组件来看,我会在后续的教程中详细说明。文章来源地址https://www.toymoban.com/news/detail-792083.html

到了这里,关于Unity Meta Quest 一体机开发(三):【手势追踪】Oculus Integration/Meta XR SDK 基本原理、概念与结构+玩家角色基本配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity Meta Quest 一体机开发(三):【手势追踪】Oculus Integration/Meta XR SDK 基本原理、概念与结构+玩家角色基本配置

    此教程相关的详细教案,文档,思维导图和工程文件会放入 Spatial XR 社区 。这是一个高质量知识星球 XR 社区,博主目前在内担任 XR 开发的讲师。此外,该社区提供教程答疑、及时交流、进阶教程、外包、行业动态等服务。 社区链接: Spatial XR 高级社区(知识星球) Spatial

    2024年01月16日
    浏览(53)
  • Unity Meta Quest 一体机开发(二):前期准备和环境配置

    ​ 此教程相关的详细教案,文档,思维导图和工程文件会放入 Spatial XR 社区 。这是一个高质量知识星球 XR 社区,博主目前在内担任 XR 开发的讲师。此外,该社区提供教程答疑、及时交流、进阶教程、外包、行业动态等服务。 社区链接: Spatial XR 高级社区(知识星球) Spa

    2024年02月03日
    浏览(35)
  • Unity VR 开发教程:Meta Quest 一体机开发 (二)混合现实 MR 透视 Passthrough 环境配置

    Meta Quest 一体机具有透视(Pass through)的功能。它通过 VST(Video See Through)技术,使用户能够透过头显看到现实中的场景,并且能将虚拟的物体融入于透视场景中,与用户进行交互。利用这个功能,我们可以开发一些混合现实 MR 应用,将虚拟和现实相互融合。 前期需要的一体

    2024年02月16日
    浏览(51)
  • Pico 一体机开发记录

    大概2020-2021年间的工作实况,可能有些问题已解决,某些API已改动,权且当做参考吧 1.软件发布后在设备运行时,场景颠倒? (Pico G2老版本开发问题) 在Unity找到AndroidManifest文件; 把这行代码注释掉即可。 2.视频播放时卡顿很严重? (4K版项目开发问题) 设备是Pico neo2,通

    2024年02月05日
    浏览(47)
  • Unity之OpenXR+XR Interaction Toolkit接入Pico VR一体机

    Pico VR 一体机是目前国内比较流行的VR设备之一,PICO成立于2015年3月,于2021年9月并入字节跳动。最新推出的Pico4一体机售价只有2400左右,这让很多家庭都入手了Pico设备,VR一体机的功能包括:VR全景视频,VR运动,VR游戏等等。我们今天就来通过Unity最新的OpenXR标准来接入Pico

    2024年02月04日
    浏览(37)
  • 机器视觉运动控制一体机结构体功能上线,助力客户高效开发

    运动控制器正朝着高速度、高精度、开放式的方向发展,不仅对运动控制功能精益求精,还增加了视觉相关的定位、测量、检测和识别等,多种功能的穿插使用进一步增加了在编程设计代码时的复杂程度。 为了给客户提供更好地软件框架,简化程序结构、节省内存空间、提高

    2024年02月11日
    浏览(48)
  • 鲲鹏昇腾开发者峰会开幕 星辰天合发布新一代天合翔宇一体机

    近日,主题为“创未来 享非凡”的 鲲鹏昇腾开发者峰会 2023 在东莞松山湖开幕,此次大会旨在帮助开发者深入了解鲲鹏、昇腾全栈技术,加速行业数智化的技术、产品和解决方案创新。 作为鲲鹏生态重要合作伙伴,XSKY星辰天合获邀参加此次会议,展示星辰天合与鲲鹏生态长

    2024年02月08日
    浏览(35)
  • 冲量在线出席2023鲲鹏昇腾开发者峰会,联合鲲鹏打造可信AIGC一体机,共筑产业数字根基

    近日,以“创未来 享非凡”为主题的2023鲲鹏昇腾开发者峰会在东莞松山湖举办。鲲鹏昇腾开发者峰会是面向ICT领域开发者的技术盛会,旨在打造生态伙伴、开发者学习、交流的平台,帮助开发者深入了解鲲鹏、昇腾全栈技术,加速行业技术、产品和解决方案创新。 冲量在线

    2024年02月11日
    浏览(35)
  • 网络安全设备-等保一体机

    本文为作者学习文章,按作者习惯写成,如有错误或需要追加内容请留言(不喜勿喷) 本文为追加文章,后期慢慢追加 等保一体机的功能 等保一体机产品主要依赖于其丰富的安全网元(安全网元包括:防火墙、IPS、WAF、网络审计、数据库审计、EDR、VPN、基线、漏扫、堡垒机

    2024年02月14日
    浏览(37)
  • ADSL无线路由一体机上网如何设置?

    市面的上的ADSL一体机提了PPOE拨号,无线、IPTV等功能,给家庭用户带来很多方便,下面我们看看如何设置。 步骤一:连接线路 在没有共享上网一体机之前,我们的网络拓扑是入户的电话线插到ADSLModem上,然后电脑直接连接Modem来拨号上网的,或者使用普通无线路由器连接到M

    2024年02月08日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包