Snapdragon Spaces 开发指南(6)
5.4.2 QCHT指南
5.4.2.1 手部追踪概述
XR 代表了下一代如何与世界互动。该解决方案提供了与硬件无关的手部跟踪和手势识别软件平台,为最先进的 XR 沉浸式解决方案提供支持。
手部追踪的目的是:
- 提供准确、低延迟的第一人称 POV 手部跟踪
- 识别一组常见的手势
- 直接与板载摄像头和传感器集成
- 支持不同的硬件和操作系统
Snapdragon Spaces 插件内的手部追踪组件提供以下功能:
- 手部检测和跟踪
- 手势识别(抓、捏、张开)
开发人员包中的自定义包 Qualcomm 手势追踪交互 (QCHTI) 提供了以下附加功能:
- 可视化手部网格
- 处理交互(光线投射、捕捉、虚拟力反馈)
- 通过补偿自动触觉反馈(目标、选择、操纵)进行高级交互
5.4.2.2 一般的
手部跟踪功能,例如装配手部网格和交互组件,不包含在主Snapdragon Spaces 包中,而是作为 tarball 文件包含在单独的包中。它可以按照与主包相同的方式导入,如Unity 文档中所述 。
首先,安装 Snapdragon Spaces 包(此处介绍)。手部追踪所需的最低版本是 0.6.0。然后,导入以下包,该包与主 Snapdragon Spaces 包位于同一文件夹中。
警告
必须按照此处所述启用 Spaces Services 应用程序的摄像头权限,手部跟踪才能正常工作。
QCHT Unity交互4(版本4.0.0)
该软件包管理手部跟踪子系统、OpenXR 连接和生命周期事件。它还包含手持设备和基于特定 XRIT 的交互(例如远端和近端)。
您可以通过单击“包管理器”中的“导入”按钮并浏览将直接添加到“资源”文件夹中的文件来探索“手部跟踪”示例场景。
![](https://i-blog.csdnimg.cn/blog_migrate/b3253ef127e9de5f49b29431de03e98d.png)
基本场景设置
AR 会话和 AR 会话起源
如果需要,手部追踪还支持 AR Foundation 4.X 的AR Session和AR Session Origin ,如此处所述。
XR起源
首先,按照此处的说明在场景中创建XR 原点 (打开新窗口)。
创建XR Origin游戏对象后,展开其层次结构以查看Left Controller和Right Controller。
这两个游戏对象中的每一个都包含一个XR 控制器组件,默认情况下该组件未映射到任何输入操作。此时可以删除这两个组件,因为它们未被使用。
然后,在XR Origin(或AR Session Origin )游戏对象上添加XR Hand Tracking Manager组件。
XR 手部追踪管理器
提示
可以使用类上的静态公共 API通过代码创建XR 手部跟踪管理器的实例。请参阅XR 手部跟踪管理器 API。GetOrCreateXR Hand Tracking Manager
该组件需要管理手部跟踪子系统。它在运行时更新手部跟踪数据,并跟踪引用该组件所附加的 XR Origin 中的用户手部(它支持XR Origin和AR Session Origin)。在运行时,手部跟踪管理器将实例化左手和右手预制件,在 Open XR 手部跟踪层跟踪或取消跟踪手部时启用和禁用实例。
通过右键单击场景的层次结构并选择 QCHT > 手部跟踪管理器,将手部跟踪管理器添加到场景中。
在编辑器模拟器中
启用XR Interaction Toolkit 设备模拟器 (打开新窗口)对于模拟,请在 Unity 项目设置的手部跟踪模拟部分中启用模拟子系统。
然后,在项目设置的 XR 交互工具包部分中启用在场景中使用 XR 设备模拟器。
警告
在将应用程序构建到目标平台之前,需要禁用此设置。
要了解如何使用模拟器,请参阅XR Interaction Toolkit 设备模拟器文档 (打开新窗口)。
提示
在将项目构建到目标平台之前,不要忘记禁用“在场景中使用 XR 设备模拟器”。
在编辑器中播放场景时,您可以通过按键盘的 Tab 键快速从头切换到左/右手。
XR 手部追踪管理器 API
静止的 | 描述 |
---|---|
GameObject DefaultLeftHandPrefab | 参考资源文件夹中默认的左手预制件。软件包 > 预制件 > 资源 > QualcommHandLeft |
GameObject DefaultRightHandPrefab | 参考资源文件夹中默认的右手预制件。封装 > 预制件 > 资源 > QualcommHandRight |
XRHandTrackingManager InstantiateHandTrackingManager() | 使用默认手部预制件实例化手部跟踪管理器 |
XRHandTrackingManager GetOrCreate(GameObject leftHandPrefab, GameObject rightHandPrefab) | 获取现有的手部跟踪管理器,如果参数中给出的手部预制件不存在,则创建手部跟踪管理器 |
void Destroy(XRHandTrackingManager manager) | 销毁给定的手部跟踪管理器实例,或者尝试找到一个要销毁的实例(如果存在) |
非静态 | 描述 |
---|---|
GameObject LeftHandPrefab | 将被实例化的左预制对象 |
GameObject RightHandPrefab | 将被实例化的右侧预制对象 |
void RefreshLeftHand() | 如果预制件已更改,则重新生成左侧对象 |
void RefreshRightHand() | 如果预制件已更改,则重新生成右侧对象 |
void ToggleLeftHand(bool visible) | 切换左手可见性 |
void ToggleRightHand(bool visible) | 切换右手可见性 |
void SetLeftHandSkin(HandSkin skin) | 如果手对象可换肤,则设置左手皮肤 |
void SetRightHandSkin(HandSkin skin) | 如果手对象可换肤,则设置右手皮肤 |
void StartHandTracking() | 如果子系统管理器中存在手部跟踪子系统,则手动启动该子系统。 |
void StopHandTracking() | 如果子系统管理器中存在手部跟踪子系统,则手动停止该子系统。 |
XR 手部追踪子系统
静止的 | 描述 |
---|---|
XRHandTrackingSubsystem GetSubsystemInManager() | 返回子系统管理器中的第一个XR 手部跟踪子系统实例(如果存在) |
非静态 | 描述 |
---|---|
HandTrackingStatus Status | 获取手部追踪后端状态。它可以是Idle,Running或者Error |
Hand LeftHand | 左手数据 |
Hand RightHand | 右手数据 |
Hand GetHand(XrHandedness handedness) | 通过惯用手获取手部数据 |
event Action OnHandTracked | 如果此帧已跟踪手,则举起 |
event Action OnHandUntracked | 如果此帧未跟踪手,则举起 |
event Action OnHandsUpdated | 当双手数据更新时引发 |
手部结构
非静态 | 描述 |
---|---|
XrHandedness Handedness | 用手习惯。它可以是XR_HAND_LEFT或者XR_HAND_RIGHT |
XrSpace Space | 存储联合数据的空间。它可以是XR_HAND_LOCAL或XR_HAND_WORLD(在 XR Origin 中) |
bool IsTracked | 如果当前正在跟踪手,则为 true |
XrHandGesture Gesture | 手部追踪后端检测到手势 |
float FlipRatio | 手掌方向与 HMD 位置相反或朝向时,手翻转比率-1f分别为1f |
float Scale | 手秤从.5f到1.6f |
Pose Root | 手根姿势(相当于XR Origin中的手腕中心姿势) |
Pose[] Joints | 手部关节姿势 |
手部追踪控制器
场景架构
创建后XR Hand Tracking Manager,会在左侧和右侧字段中自动设置两个预制件。这些预制件仅用于手动可视化目的。
手部游戏对象具有Hand Rigged Visualizer和Hand Driver组件,负责可视化手部网格并更新Skinned Mesh的手部关节变换。
为了实现远端交互和近端交互等交互,必须添加手部自定义 XRIT 控制器。
通过在场景的层次结构中右键单击并选择 QCHT > 手部跟踪控制器,将手部跟踪控制器游戏对象添加到场景中。
手部跟踪控制器的两个实例会自动添加为XR Origin(或AR Session)的子级。
每个控制器都通过预定义的设置和输入操作绑定聚合了XR Ray Interactor、XR Poke Interactor和XR Direct Interactor组件。这些组件是高度可配置的。
XR 手持控制器
XR Hand Controller组件是XR Action Base Controller的自定义实现 (打开新窗口)来自 XR 交互工具包包。XR 手控制器负责处理来自直接映射到底层手部跟踪子系统的新 Unity 输入系统的输入操作。XR Action Base Controller的自定义实现定义了额外的抓取操作和控制器的用手习惯,这对于过滤交互非常有用。
5.4.2.3 互动方式
远端互动
要与远处(远端)物体交互,用户可以使用XRIT 的XR Ray Interactor组件。
要使用远端交互功能,用户必须将手放入耳机的视野中,并且会看到一条光线,使他们能够瞄准想要与之交互的对象。射线末端的十字线允许用户瞄准并提高交互的精度。捏合手势激活选择以操纵目标对象。
描述
首先,确保场景的手部跟踪初始设置已完成。
XR控制器指针
XRControllerPointerLeft和XRControllerPointerRight预制件位于 Packages > QCHT Unity Interactions > Prefabs > Interactions > Distal 文件夹中,应成为XR Origin GameObject中Camera Offset GameObject 的子级。
通过更改每只手的 XR 射线交互器组件来调整射线投射参数。请参阅 Unity 的文档以了解有关XR Interactor 的更多信息 。
默认情况下,XRController 控制每只手的脚本具有由 设定的位置pointerPosition和由 设定的旋转pointerRotation。这些由XRHandTrackingManager计算。默认情况下,“选择”和“UI 按下”操作设置为triggerPressed(即“捏合”手势)。
如本示例所示,第二个和第三个动作可以映射到另一个设备,作为手部跟踪的后备。由于新的输入系统兼容性,可以使用完全相同的代码轻松支持不同的输入模式。
捕捉音量
使用XR 可交互快照卷 XRIT 组件可提高光线投射精度和效率。
近端交互
近端交互是指与靠近手部的虚拟对象进行交互。
XR直接交互器
由于 QCHT Interactions 包基于 XRIT,因此XR Direct Interactor组件可用于对象操作。
XR直接交互器 负责触发任何可交互对象上的交互。它是 XRIT 的标准组件,并且具有高度可配置性。
带有XR Direct Interactor组件的预配置HandMainLeftXRIT和HandMainRightXRIT手部预制件可以在 Packages > QCHT Unity Interactions > Prefabs > Hands 文件夹中找到。
XR Grab 互动
XR Direct Interactor触发与XR Grab Interactables 的交互 。它是 XRIT 的标准组件,并且具有高度可配置性。
XR Poke 互动器
QCHT Interactions 支持XR Poke Interactor 通过放置在食指尖上的戳位置。它是 XRIT 的标准组件,并且具有高度可配置性。