Snapdragon Spaces 开发指南(3)
3.4 合成层
当向用户呈现渲染图像时,有时需要将场景的元素分成不同的层。这些层中的每一层都可以单独渲染,然后合成在一起以形成最终场景。这有助于提高每个渲染层的稳定性和质量,但会牺牲一些性能。
这些层称为合成层。Snapdragon Spaces SDK允许开发人员访问不同类型的组合层。这里简要总结了这些类型。其他详细信息可以在引擎特定文档中找到。
支持的渲染器
并非所有渲染 API(OpenGLES、Vulkan 等)都支持此处描述的所有层。有关更多详细信息,请参阅任何特定于引擎的文档。
图层类型
投影层
投影层表示使用透视投影从每只眼睛渲染的平面投影图像。这最常用于从用户的角度渲染虚拟世界。从主摄像头的角度自动创建投影层并渲染到 XR 耳机。无需执行任何操作即可渲染此自动生成的投影图层。目前还无法提交额外的投影图层。
四层
四层对于显示渲染到虚拟世界中的用户界面元素或 2D 内容非常有用。四层仅从正面可见,并且没有厚度。
- Unity Gaze Pointer 组合图层示例
深度层
深度层包含将深度信息与最终图像的颜色信息进行匹配所需的数据。深度图像仅与投影层一起提交。
仅限虚拟现实
仅选定的 VR 硬件支持深度提交。在 Unity 中,可以通过打开 Project Settings > XR Plug-in Management > OpenXR 并选择Depth 16 Bit或Depth 24 Bit的深度提交模式来启用深度层。然后,将自动生成并提交与默认投影层相对应的深度图像,无需开发人员采取进一步操作。
排序顺序
所有合成图层均使用“画家算法”进行排序和渲染,其中首先渲染较低层,然后在其上渲染较高层。
层数
最多可以使用 16 个合成层。此总数包括负责渲染主摄像头内容的默认投影层 - 实际计数为 1 + 15 个附加合成层。使用的每一层都会产生额外的性能开销。如果超过最大层数,则不会渲染最高层。
提示
使用尽可能少的层以获得最佳性能。
层尺寸
合成层允许的最大尺寸由硬件决定,但通常应支持高达 16k 纹理的尺寸。
4 设计与用户体验
4.1 手部追踪
4.1.1 最佳实践
在设计 XR 应用程序时,用户舒适度、实用性和可用性是创造高质量体验的关键。
本节的目的是为您提供设计最舒适、身临其境和引人入胜的体验的最佳实践。
最佳实践部分包括手势以及与虚拟对象和界面的交互、人体工程学、可用性和限制故障排除。
#虚拟互动
手部追踪技术使用户能够通过两种方式与虚拟内容进行交互:
- 手势是可用于触发动作或与项目交互的特定姿势。
- 对象交互允许手通过远端或近端交互与虚拟对象进行物理交互。
#手势
手势作为一种交互方式通常需要一定程度的教程或指导。即使手势是最普遍和最自然的语言之一,不同的人对建议手势的解释也可能存在一些差异。
在以下情况下最好使用手势:
- 不是一次性介绍的,而是在教程过程中介绍的
- 手势数量有限且在整个应用程序中保持一致
- 各个手势各不相同并映射到特定功能
- 向用户呈现教程并可供用户随时访问
- 在正确的时间和地点成功地使用虚拟对象和手势将有助于创造积极的用户体验。
#可用性
可用性是创造真正身临其境的用户体验的关键。为了实现人体工程学,需要仔细考虑设计因素:空间环境、用户交互、物体放置和用户旅程。
#用户姿
- 保持身体中立位置
- 保持手臂靠近身体一侧并向下放置
- 避免剧烈、剧烈和重复的运动
#无障碍
在 XR 中设计无障碍体验意味着每个人都可以访问包括教程、字体、颜色和交互方法在内的用户界面。
请记住,在 XR 中,用户界面并未绑定到手机屏幕或笔记本电脑。使用提示来引导用户体验 360° 3D 环境非常重要。
一般来说,建议让用户能够在手臂自然弯曲的较近范围内执行操作,而不是在手臂伸展的情况下进行较长范围的操作,这对用户来说会更累。
#用户旅程
- 使用提示引导用户体验
- 通过视觉或音频反馈通知用户是否可以执行操作以及是否检测到交互
- 为用户提供退出不需要的状态的机会 - 所有操作都应该是可逆的
#语境
为了进一步改善用户体验,可以使用上下文来简化内容传递和相关交互。通过跟踪用户正在查看的内容并调整可用元素,可以减少视觉混乱,并且体验将更加简单。
例如,上下文可以用在绘图演示中,其中有许多可用于定制的元素(铅笔粗细、颜色等)。默认菜单提供了选择任何这些元素的能力。一旦用户选择这些元素之一,菜单就会更改为仅提供与该元素相关的选项。在用户选择颜色的情况下,后续菜单将缩小为仅可用于绘图演示的不同颜色选项。
#对象放置
- 对相似的对象进行分组,使它们更容易找到(即格式塔原则)
- 将物体放置在清晰的视野中,并且不会遮挡用户的视线
- 如果预计会发生近端碰撞交互,请确保对象位于用户可触及的范围内
- 交互对象的大小需要根据参与模式适当调整
局限性
#视场角 (FOV)
FOV 通常以度为单位测量,是人们通过眼睛或 AR/VR 设备可以看到的开放可观察区域。
在 AR/VR 中,FOV 取决于设备,尤其取决于:
- 相机FOV由相机(通常是单色或RGB)组成。
- 显示FOV是“内部屏幕FOV”。这是用户看到的。
#闭塞
当 3D 空间中的一个对象挡住另一个对象的视线时,就会发生遮挡。当一只手挡住另一只手的情况下可能会发生这种情况,从而妨碍准确的手部跟踪。
为了尽量减少遮挡:
- 避免可能促使用户双手重叠的手势和交互
- 尽可能使用单手交互模式
- 通知用户移动双手以实现最佳手部跟踪,以解决确实发生遮挡的事件
#户外环境
为了获得最佳体验,请在内部使用手部追踪功能。由于当前支持的硬件限制,打算在外部使用的应用程序可能无法按预期运行。
4.1.2 交互手势
主要交互手势
捏
通过将拇指尖接触食指尖并同时伸展其余手指来执行捏合手势。如果从侧面观察手,则可以最好地识别捏力。
捏合用于在手指触摸时进行选择,或通过保持手势并移动进行操作。
捏合手势是一种高效的沉浸式验证手势,因为它会产生自动触觉反馈。
抓住
抓取手势是通过将手放在相机前面并握紧拳头来执行的。
该手势用于抓取和操作附近的大体积物体。
抓取手势还可以实现自动触觉反馈。
张开手
张开手的姿势是一个中立的姿势。它是通过将手伸开、手指张开、手掌远离相机来执行的。
Open-Hand 通常用于连接射线投射,以便与远端元件交互。
此手势用于显示光线投射或作为释放手势。
#点(已弃用)
从 Snapdragon Spaces 版本 0.12.1 开始,点手势已被弃用。仅在使用 Snapdragon Spaces 0.11.1 及更低版本进行开发时使用此手势。
点手势是通过伸展食指同时保持其余手指闭合来执行的。
该手势通常在近端交互中与 GUI 交互(例如按下按钮)时使用。
手部表示
#增强现实
在 AR 环境中,不建议在真实手上显示虚拟手。建议重点关注虚拟元素的反馈,而不是手部头像。
#虚拟现实
利用逆运动学的 3D 模型最适合 VR 应用。手的 3D 表示覆盖在数字空间中的手上,为用户创造更加身临其境的体验。根据演示的上下文调整手的表示非常重要。
此外,3D手必须返回视觉效果来警告用户他/她正在交互。
以下是 3D 手部头像的 2 个示例:
阿尔法手
![](https://i-blog.csdnimg.cn/blog_migrate/a68896898a402e76ebe1861be474872f.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/8df587e1e6b9e72d697d8c99da893392.jpeg)
丑角手
![](https://i-blog.csdnimg.cn/blog_migrate/2ebf0f424b87c16e64fc872536a2fdee.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/333d5a6862a315616fdb25cab5e2c96c.jpeg)
反馈、提示和可供性
由于手无法像其他输入设备那样提供触觉反馈,因此当用户与 3D 对象交互时,必须通过视觉和音频反馈来对其进行补偿。设计独特的声音和视觉变化来确认用户何时与组件交互非常重要。
为了改善用户体验,请考虑将现实世界的反馈纳入交互设计中。这将有助于通过视觉或音频提示确认与对象或手势的交互正在或已经成功执行。
一般来说,虚拟元素的主要状态有以下几种:
状态 | 视觉反馈 | 音频反馈 |
---|---|---|
闲置的 | 没有任何 | 没有任何 |
徘徊 | 是的 | 是的 |
已选择 | 是的 | 是的 |
视觉反馈
目的
对象的行为可以改变,或者当成功接合时该对象可以突出显示。对象还可以根据交互或手势改变形状或大小。
对象状态从左到右:空闲、悬停、选定。
手
根据具体情况,除了交互式对象之外,还建议在 3D 手部头像上提供视觉反馈。
一般来说,手会经历三种状态:无交互、与交互元素碰撞、交互。以下是 3D 手可以产生的效果类型的表示:
手部反馈:空闲、悬停、选择
十字线
为了指定想要交互的元素,尤其是在远端交互上下文中,在指针上返回不同类型的效果非常重要。传统上,在 HMI 界面中,指针的外观根据其交互状态而变化。因此,这些行为对于用户来说非常直观。在设计阶段考虑光线投射及其十字线可能具有的不同类型的行为至关重要。
十字线反馈:空闲、悬停、选定
#音频反馈
优选的是,仅在虚拟对象上实现音频反馈,因为交互声音是上下文相关的。如果用户与 2D 菜单交互,则音频反馈将不同于他/她在视频游戏中交互。
音频也可用于环境声音,但仍取决于上下文。
#互动提示
交互提示是一个手部动画,当未检测到用户的手时触发。当用户不知道如何与虚拟元素交互时,该组件会指导用户。
如果用户在 x 秒内没有交互(在设计演示时定义),则组件会循环动画,直到系统检测到交互。
备忘单
最适合交互状态的手势和反馈:
近端 | 远端 | 反馈 | |
---|---|---|---|
目标 | 碰撞 | 张开手(光线投射) | 视觉、音频 |
选择 | 捏、抓 | 捏 | 视觉、音频 |
操纵 | 捏、抓 | 捏 | 视觉,取决于上下文 |
用户界面目标 | 碰撞 | 张开手(光线投射) | 视觉、音频 |
用户界面选择 | 捏、点、张手 | 捏 | 视觉、音频 |
用户界面操作 | 捏、点、张开 | 捏 | 视觉、音频 |
4.2 自定义控制器项目
开发人员包中包含一个 Android Studio 项目,用于构建自定义控制器存档,该存档可以在以后使用,而不是 Snapdragon Spaces Unity 包或虚幻引擎插件中默认包含的控制器存档。
要更改控制器的外观,请使用 Android Studio(建议使用 2020.3 或更高版本)打开项目,然后打开SpacesController > res > 布局 > custom_input_companion_controller.xml。位于SpacesController > java > com.qualcomm.snapdragon.spaces.spacescontroller.SpacesCustomInputContentViewFactory下的类将覆盖 Spaces Services 应用程序内的控制器。如果布局文件中的 ID 或SpacesController > res > value路径下声明的其他值即将更改,则还应相应地管理前面提到的类中的相应对应项,以避免任何链接错误。
要构建可在 Snapdragon Spaces Unity 包或 Unreal Engine 插件中使用的自定义控制器存档,请运行位于SpacesController > 任务 > 构建或运行下的 Gradle 窗口(打开View > Tool Windows > Gradle)中assemble的模块任务在 Windows 或 macOS/Linux 上通过命令行在项目根目录中。SpacesControllergradle assemble./gradle assemble
如果构建成功,位于SpacesController > 构建 > 输出 > aar下的生成的存档之一(发布版或调试版)可用于后续步骤之一:
- 在 Unity 中使用自定义控制器
- 在 Unreal 中使用自定义控制器
4.3 用于测试的图像目标
在这里,您可以找到用于在 SDK 中的示例应用程序中测试 XR 体验的所有图像。
打印
确保以 100% 比例打印 PDF,以便图像目标的物理尺寸正确。