Unity Meta Quest 一体机开发(七)【手势追踪】:配置玩家 Hand Grab 功能


获取完整课程以及答疑,工程文件下载:
https://www.spatialxr.tech/


📕教程说明

上期教程我们介绍了 Meta XR SDK 中 Hand Grab 交互中的重要知识点,这篇教程将会介绍如何将 Hand Grab 交互应用到我们自己的项目中。

配置一个基本的玩家物体可以参考前几期教程:https://blog.csdn.net/qq_46044366/article/details/134097455

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

配套的视频链接:
上半部分:2023 VR+MR全硬件开发教程】七(上半)、V59新版本说明以及配置手追交互(主讲:YY)
下半部分:【2023 VR+MR全硬件开发教程】七(下半)、V59新版本说明以及配置手追交互(主讲:YY)

​电脑操作系统:Windows 11

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

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

Meta XR SDK 版本:v57

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

HandGrab 知识点:https://developer.oculus.com/documentation/unity/unity-isdk-hand-grab-interaction/

配置 Hand Grab Interaction:https://developer.oculus.com/documentation/unity/unity-isdk-create-hand-grab-interactions/


📕玩家物体配置 Hand Grab Interactor

⭐添加 Hand Grab Interactor 物体

在 Project 窗口中搜索 Hand Grab Interactor 这个 Prefab:

在这里插入图片描述

将它拖到场景中,分别作为 HandInteractorsLeft 和 HandInteractorsRight 的子物体:

在这里插入图片描述

⭐激活 Hand Grab Visual 和 Hand Grab Glow

激活 Hand Grab Interactor 下的 Hand Grab Visual 和 Hand Grab Glow 子物体(左右手都需要):

在这里插入图片描述

将对应手的 Synthetic Hand 拖到 Hand Grab State Visual 脚本的 Synthetic Hand 变量上:

在这里插入图片描述
对 Hand Grab Glow 脚本上的 Hand Renderer,Material Editor 和 Hand Visual 变量进行赋值:

在这里插入图片描述

⭐更新 Best Hover Interactor Group

在 HandInteractorsLeft 和 HandInteractorsRight 物体上分别有一个 Best Hover Interactor Group 脚本,我们需要把对应的 HandGrabInteractor 拖到 Interactors 中

在这里插入图片描述
Best Hover Interactor Group是 Interactor Group 的其中一种。
只要是个Interactor Group,它就会保证所有添加进 Interactor Group的Interactor,在同一时刻只能有一个Interactor在交互。当其中一个 Interactor 在交互的时候,Group 里面的其他 Interactor 会暂时失活,无法与对应的 Interactable 交互,等到当前正在运作的 Interactor 停止交互后,其他的 Interactor 才会被激活。

在 Interactor 开始交互,也就是进入到 Select 状态之前,要先进入 Hover 状态,也就是准备交互的阶段。而这个 BestHoverInteractorGroup 有它自己的特性,就是能够保证优先级高的 Interactor 进入到 Hover 状态,然后优先级低的 Interactor 会暂时失活。默认情况下,Best Hover Interactor Group 中的 Interactors 列表元素中越靠前的拥有越高的优先级。也就是说列表中第一个Interactor 优先级最高,然后优先级往下递减。

在这里插入图片描述
比如上面这张图,这个是右手上的 Best Hover Interactor Group,在 Group 中 HandGrabInteractor 排在 HandRayInteractor(实现的是射线交互)前面,那么对于右手来说,当 HandGrabInteractor 和 HandRayInteractor 同时满足进入 Hover 的条件时,因为 HandGrabInteractor 会比 HandRayInteractor 优先进入 Hover,所以 HandRayInteractor 会暂时失活,等到 HandGrabInteractor 取消了 Hover 状态且 HandRayInteractor 仍满足 Hover 状态条件时,HandRayInteractor 才会进入到 Hover 状态。


📕配置可抓取物体(无抓取手势)

⭐刚体和碰撞体

在可抓取物体身上添加刚体和碰撞体。

在这里插入图片描述

我这边将碰撞体设为了 Is Trigger,将刚体 Rigidbody 的 Use Gravity 取消,让物体不具有物理效果,如果想要添加物理效果,需要添加额外的一些脚本,这个会在后续教程中介绍。

⭐Grabbable 脚本

官方文档:https://developer.oculus.com/documentation/unity/unity-isdk-grabbable/

在可抓取物体身上添加 Grabbable 脚本。

在这里插入图片描述

🔍Transfer On Second Selection

如果将 Grabbable 脚本上的 Transfer On Second Selection 勾选上,就能够实现左右手的交替抓取。比如我的右手正在抓取这个方块,这个时候我保持右手的抓取,然后用左手去抓取这个方块。那么我的左手会接替方块的控制权,右手则自动取消对这个方块的抓取。

🔍Transformer 脚本

在 Grabbable 脚本的 Optionals 下有一个 One Grab Transformer 和 Two Grab Transformer 变量。如果没有对这两个变量赋值,程序运行后默认会给物体添加一个 One Grab Free Transformer 脚本,然后引用到 One Grab Transformer 变量上。

Grabbable 脚本可以通过 Transformer 类型的脚本控制可抓取物体的移动,旋转或缩放。One Grab Transformer 可以通过一只手控制物体,Two Grab Transformer 需要同时用上两只手控制物体。

下面介绍一些常见的 One Grab Transformer 和 Two Grab Transformer:

在这里插入图片描述

我们可以手动在物体上添加 Transformer 相关的脚本,然后记得将它引用到 Grabbable 脚本上的 One Grab Transformer 或 Two Grab Transformer 处:

在这里插入图片描述

⚡OneGrabFreeTransformer

能用一只手控制物体的移动和旋转。

⚡OneGrabRotateTransformer

能用一只手控制物体的旋转,可设置 Rotation Axis 限定物体能绕哪个轴旋转。

⚡OneGrabTranslateTransformer

能用一只手控制物体的移动。

⚡TwoGrabFreeTransformer

能用两只手控制物体的移动,旋转和缩放。如果我们用了 Two Grab Transformer,需要将 Grabbable 脚本上的 Transfer On Second Selection 取消勾选,因为勾选上实现的是左右手交替抓取,无法支持两只手同时抓取。

如果想要让一个物体既能通过一只手抓取,也能用两只手同时操作,我们需要给 One Grab Transformer 和 Two Grab Transformer 都赋值:

在这里插入图片描述

⭐添加 Hand Grab Interactable 物体

我们在 Project 窗口的搜索栏中搜索 HandGrabInteractable 物体,将它拖到场景中,作为可抓取物体的子物体。

在这里插入图片描述
在这里插入图片描述

⭐让物体在进入不同状态下变色

我们可以在可抓取物体下添加一个子物体,专门用来负责视觉效果:

在这里插入图片描述
在 Visuals 物体上添加 Interactable Color Visual,Material Property Block Editor 和 Interactable Group View 脚本:

在这里插入图片描述
将物体的 Mesh Renderer 拖到 Material Property Block Editor 的 Renderers 下:

在这里插入图片描述

将 HandGrabInteractable 拖到 Interactable Group View 的 Interactables 下:

在这里插入图片描述

将 Material Property Block Editor 和 Interactable Group View 脚本拖到 Interactable Color Visual 脚本的对应位置:
在这里插入图片描述

默认情况下,物体进入 Hover 状态会变成蓝色,进入到 Select 状态会变成绿色。我们可以自行修改颜色。

### Meta Quest 传送功能实现原理 Meta Quest 的传送功能是一种基于空间计算的技术,允许用户通过虚拟环境中的交互完成位置移动。其实现主要依赖于以下几个关键技术模块: #### 1. **空间映射与场景理解** 空间映射是传送功能的核心之一。Meta XR SDK 提供了强大的 Scene API 功能,能够扫描用户的物理环境并构建三维地图[^4]。这些数据被用于识别障碍物、地面和其他重要特征,从而确保用户不会撞到真实世界中的物体。 #### 2. **手势追踪与控制器输入** 用户通常会使用 Meta Quest 控制器或者手部追踪来触发传送操作。SDK 支持对手势和控制器动作的高度精确捕捉,并将其转化为虚拟世界的交互信号[^1]。 #### 3. **路径规划算法** 当用户选定目标地点时,系统会在后台运行复杂的路径规划算法,评估从当前位置到达目标点的最佳路线。此过程考虑到了实际环境中可能存在的障碍物以及其他约束条件。 #### 4. **视觉反馈机制** 在执行传送之前,应用程序向用户提供清晰的视觉提示,比如高亮显示可行的目标区域或标记潜在危险区。这种设计增强了用户体验的安全性和直观性[^2]。 以下是简单的代码片段展示如何初始化 Meta XR SDK 并调用基本的空间感知能力: ```csharp using UnityEngine.XR.Meta; public class TeleportationExample : MonoBehaviour { void Start() { // 初始化 Meta XR 场景管理服务 XRSpatialAwarenessSubsystem spatialSystem = null; if (XRSpatialAwarenessSubsystem.TryGetSpatialAwarenessSubsystem(out spatialSystem)) { spatialSystem.RequestMeshAsync(new Vector3(0, 0, 0), new Vector3(10, 10, 10)); } } public void PerformTeleport(Vector3 destination) { transform.position = destination; // 实际应用中应加入更多验证逻辑 } } ``` 上述脚本展示了如何请求周围环境网格模型以便后续处理,而 `PerformTeleport` 方法则简化表示了一个瞬移行为的实际执行部分。 --- ### 关联开发资源推荐 对于希望深入研究 Meta Quest 传送功能的具体开发者来说,可以参考官方文档和技术博客获取最新指南和支持材料。特别注意的是随着技术迭代原有资料可能会有所更新甚至替换因此建议始终访问最新的在线帮助中心链接。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YY-nb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值