6 虚幻引擎
6.1 设置
6.1.1 虚幻引擎设置指南
本指南将详细解释如何在虚幻引擎中开始使用 Snapdragon Spaces SDK。
6.1.1.1 前提条件
请注意,Snapdragon Spaces SDK 目前支持虚幻引擎编辑器版本 4.27 和 5.0。此外,由于 OpenXR 插件的限制,仅支持 Windows 作为开发平台。不幸的是,该插件不支持虚幻引擎5.1及更高版本,并且虚幻编辑器中的OpenXR仅支持Win64
。
安装虚幻引擎时必须添加 Android 构建支持才能导出 .apk 文件。请按照 Unreal 说明(打开新窗口)设置 Android SDK 和 NDK。
6.1.1.2 第 1 步:创建项目
要创建新的虚幻引擎项目,请按照 AR 项目的虚幻文档(打开新窗口)的设置空白项目
一文中的步骤进行操作。如果不需要导入示例,则可以忽略添加 Pawn 和游戏模式
以及创建 AR 会话
部分。
6.1.1.3 第2步:导入插件
要将 Snapdragon Spaces 插件导入到引擎中,只需将 SnapdragonSpaces
文件夹从 SnapdragonSpaces_Plugin
存档中提取到引擎安装路径中的 Engine/Plugins/Marketplace
文件夹中即可。
警告
如果您的 Engine 中未创建Marketplace
文件夹,您可以在Plugins
文件夹中创建它,然后复制SnapdragonSpaces
文件夹。请注意,Unreal 仅在遵循建议路径的情况下才会检测插件。
6.1.1.4 第 3 步:导入样本
要将 Snapdragon Spaces Samples 导入到项目中,请打开 SnapdragonSpaces_Samples zip 文件并将 Config
文件夹复制到项目根目录并覆盖现有文件,然后将位于项目文件夹的 Plugins 文件夹中的 SnapdragonSpacesSamples
插件复制到 Plugins 中文件夹(如果项目中的 Plugins 文件夹不存在,请继续创建它)。请注意,SnapdragonSpacesSamples
插件需要 Snapdragon Spaces 插件。在添加示例插件之前,请确保项目中已添加 Snapdragon Spaces 插件。内容子文件夹包括示例文件夹以及公共文件夹。公共文件夹包含正确使用 AR 设备的基本蓝图。
使插件文件夹在项目中可见
为了访问 Snapdragon Spaces 示例内容,请在编辑器中激活项目插件的可见性。
6.1.1.5 第 4 步:更改项目设置
要启用 Snapdragon Spaces OpenXR 插件,请导航至编辑 > 插件 > 混合现实下的项目设置,然后启用 SnapdragonSpaces 插件。
在编辑>插件>虚拟现实下,检查 OpenXR 插件是否也已启用。
警告
确保 OpenXRHandTracking 插件已禁用。它可能会导致与 Snapdragon Spaces 的功能发生冲突。
某些设置是构建包所必需的。请检查您的项目是否在项目设置 > Snapdragon Spaces 下正确配置。
以下是屏幕截图中各点的说明:
- 刷新设置验证。请在应用此选项卡中的更改后执行此操作。
- 当启用的功能出现问题时,显示错误消息。
- 显示可以启用的功能。
- 显示带有项目设置的错误和警告消息。
- 显示强制设置。必须启用所有这些选项才能继续构建。
- 显示为获得更好性能而推荐的设置。
6.1.1.6 可选:自定义控制器设置
Snapdragon Spaces Unreal Engine 插件可以在主机设备上启动应用程序时生成控制器。默认情况下,此功能在插件设置中启用,该设置位于编辑>项目设置>插件>Snapdragon Spaces下(通过单击齿轮)。
如果需要具有不同外观和稍微不同功能的自定义实现,则可以按照自定义控制器部分中描述的步骤构建替代控制器存档。
这些步骤生成的存档可以链接到项目设置中。必须启用使用自定义控制器开关(还需要启用在主机上启动控制器选项),以便可以选择备用控制器存档的路径。
6.1.1.7 可选:添加新的交互配置文件
要使用和创建新的交互配置文件而不是 Snapdragon Spaces 插件中包含的交互配置文件,您可以创建一个新类。该类可以继承IModuleInterface
和IOpenXRExtensionPlugin
接口,并实现StartupModule
、ShutdownModule
、GetDisplayName
和GetInteractionProfile
功能。在 StartupModule
中,必须创建必要的键,并且在 GetInteractionProfile
中,必须配置预期的交互配置文件,您可以在 FSpacesInputExtension
类中查看它是如何完成的。确保这个新模块在 PostConfigInit
加载阶段加载。最后,您可以使用上一类中创建的键创建所需的操作和轴映射,并使用项目中的输入。
6.1.2 场景设置
警告
本指南假定您已具备虚幻引擎中 XR 开发的知识。有关更详细的概述,请访问介绍性文档页面(打开新窗口)。
Snapdragon Spaces 示例包含常见 AR 使用案例的即用型蓝图。
6.1.2.1 核心蓝图
这些蓝图已准备好在 AR 环境中工作,并且是示例项目的基础。
BP_GameMode
(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core 下)定义了体验的规则。目前,它仅将默认 pawn 类设置为自定义 BP_Pawn
。为了避免为每个地图进行自定义,请转到项目设置>地图和模式并覆盖默认游戏模式。
在虚幻引擎中,pawn 是用户的物理表示,并定义用户如何与世界交互。自定义 BP_Pawn
(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core 下)可与凝视或 3DoF 控制器一起使用进行交互。此外,它还包括这些交互控制器的实现,用于在编辑器中测试它们。
D_ARSessionConfig
(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core 下)定义了 AR 会话中使用的功能。有关此资产的基本信息,请参阅虚幻文档(打开新窗口)。目前,BP_Pawn 定义了示例中使用的会话配置。
6.1.2.2 直通(仅适用于 MR 设备)
直通(打开新窗口)是指将物理环境作为图像传送到 VR 设备的可能性。它可以通过一个新的小部件启用或禁用,该小部件带有附加到主菜单的直通复选框。仅当设备兼容直通时,此小部件才会对用户有效。检查是在 BP_MainMenuWidget
蓝图中的 BeginPlay
处使用新函数 IsPassthroughSupported()
完成的,如果 SpacesEngineSubsystem
支持 直通,则该函数将检索 bool。
WBP_Passthrough
上的复选框调用 SpacesEngineSubsystem 中的函数 SetPassthroughEnabled(bool)
,这将设置 bPassthroughEnabled
的新值,这将使用户能够查看或隐藏物理环境图像。调用 SetPassthroughEnabled(bool)
的另一种方法是使用绑定到 XRController(L) X
和 XRController(R) A
的输入 SwitchPassthrough
。
bPassthroughEnabled
的值可以随时使用 GetPassthroughEnabled()
进行访问,或者在使用委托 OnChangePassthrough
更改时进行绑定。
6.2 交互
6.2.1 交互组件
6.2.1.1 控制器蓝图
不同控制器的实现是在组件中完成的,以便在参与者中轻松扩展或替换。
父组件类 BP_ControllerComponent
(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core > Components 下)拥有对注视和指针控制器的访问权限。该蓝图还建立了管理交互的基础,并包括一些可供开发人员在所有派生控制器中自定义的选项。
- 自动激活:指示控制器是否默认启用。
- 延迟启动:应用程序启动或加载新地图时启用交互之前应经过的时间。
- 标签组件:父组件上的标签名称(来自 pawn 角色),以便稍后从控制器组件实现中引用。
为了与控制器组件交互或创建自定义子控制器组件,需要考虑的一些函数是:
- Start: 该事件只应在首次初始化控制器时调用,不支持覆盖。最好从 开始播放 节点调用。
- Start_Implementation:该函数包含每个子组件的特定初始化。
- Set Default Controller:配置初始化后是否应激活组件。因此,仅当调用在 Start 函数之前完成时才有用。
- Enable:启用组件。
- Disable:禁用该组件。
- Is Enable:返回组件是否已启用。
- Press/Release Button:使用小部件交互组件管理按钮交互。
- Is Over Interactable Widget:如果 Widget 交互组件指向一个 Widget,则返回。
提示
XR 项目控制器的关键元素是小部件交互组件
。所有组件或衍生产品应该仅根据控制器的类型建立交互规则。有关该组件的基本信息,请参阅 Unreal 文档(打开新窗口)。
6.2.1.2 凝视控制器
凝视控制器 BP_GazeControllerComponent
(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core > Components 下)管理场景中的光线投射和与小部件 actor 的交互,以及延迟交互功能和指针的“单击”功能。
凝视指针限制
目前,凝视指针只能与场景中的小部件 actor 交互,而指针控制器则可以与小部件和 3D actor 交互。
有些选项可以为开发人员定制:
- Move Reticle to Hit:如果启用此布尔值并且用户看着交互式角色,则十字线将移动到角色的交互位置。
- Timer Duration:用户必须注视某项才能选择它的秒数。
- Default Distance:当 bMoveReticleToHit 处于活动状态时,这将设置绘制注视控制器的距离。
- Vertical Bias:标线的垂直位置,0 为屏幕中心,1 为屏幕顶部,-1 为屏幕底部。
- Reticle Outer Ring:外环标线材质,如果为NULL则假设外环被禁用。在 SDK 版本 0.15.0 中已弃用。
最后,样本用来指向世界的十字线由隐藏的小部件组件和立体层组件组成。所有与凝视相关的组件始终使用组件标签(凝视)进行区分,并且控制器组件假定凝视的控件交互组件始终是其他必要组件的父组件。 - Stereo Layer:为了防止指针抖动,建议在立体层中渲染纹理。为了正常工作,必须启用实时纹理,并且立体图层形状应设置为四层。请记住,Unreal 将此组件的变换值解释为相对于摄像机,而不是相对于父组件或它所附加的 actor,这在其他组件中是常见的。函数
Update Reticle Position
(在组件蓝图中)将小部件移动到交互命中位置,并计算与相机的相对位置以在立体层中使用。但是,必须使用 Quad Size 变量而不是比例来定义大小。此外,纹理未初始化,因为控制器组件将 小部件组件的渲染复制到其中。
- Widget Component:该组件是隐藏的,因为立体层负责重新渲染指针。可以从
WBP_GazePointer
资源(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > UI 下)修改原始纹理。它使用静态材质作为内环 (MI_Reticle_Inner
),使用动态材质作为外环 (MI_Reticle_Outer
)。这个动态材质定义了一个参数(百分比
)来完成十字线交互的视觉效果。
6.2.1.3 指针控制器
指针控制器的主要行为在 BP_PointerControllerComponent
中实现(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core > Components 下)。其工作原理与其他控制器相同,但初始化还管理是否在支持 3DoF 或 6DoF 的设备上使用。使用 microsoft 交互配置文件的控制器将自动启用为 3DoF 控制器,使用 oculus 交互配置文件的控制器将在运动控制器组件
中自动启用为 6DoF。
请注意,使用 3DoF 时,选择的手必须为左手。对于 6DoF,选择的手可以是左手或右手,具体取决于控制器设计用于哪只手。此外,开发人员还可以选择由哪个控制器来处理交互。
Spawn Controller 函数生成在运动控制器类变量上设置的 BP_PointerController
类 actor 的子级。
BP_PointerController
actor(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Placeable 下)已准备好管理每个单独的控制器。
运动控制器组件
作为根组件的子组件添加以管理每个控制器。该组件的可视化
部分允许在现实世界中控制器移动后在虚拟世界中渲染 3D 模型,只需启用“显示设备模型”选项即可。此外,如果开发人员有兴趣根据配置文件显示每个设备的默认网格,则必须在“显示模型源”选项中选择 OpenXR。否则,开发者可以选择“Custom”进行自定义,并在“Custom Display Mesh”中添加网格。最后,在运动控制器
部分,开发人员应分配输入类型。
仅当启用交互时,运动控制器组件
才必须附加:小部件交互组件
以正确跟踪控制器的真实世界运动,以及静态网格体组件
(在示例中称为激光指针网格)以可视化指针。独立于交互,如果使用 6DoF 设备,则父组件需要使用 BP_XRControllerRepresentation
(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Placeable 下)附加子 Actor 组件
以显示控制器及其动画。
6.2.1.4 手部追踪控制器
手部跟踪控制器 BP_HandTrackingControllerComponent
(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core > Components 下)负责生成并启用使用手部跟踪远端交互所需的参与者。这些演员将自动处理交互。仅当位于项目设置 > Snapdragon Spaces 插件下的手部跟踪功能处于活动状态时,此控制器才会处于活动状态。控制器将允许场景中的小部件演员和可以与手部跟踪进行交互的演员进行交互。在手部跟踪示例中查找有关手部跟踪交互如何工作的更多信息。
手部追踪控制器的限制
目前,手部追踪交互无法在虚幻引擎编辑器中使用。
6.2.1.5 输入备忘单
用于输入操作的按钮:
主控制器 | 右 XR 控制器 | 左 XR 控制器 | |
---|---|---|---|
选择 | 点击触控板 | 右触发按钮 | 左触发按钮 |
凝视/指针开关 | 菜单按钮 | 空 | 左侧菜单按钮 |
触摸板 | 触控板 | 空 | 左操纵杆 |
锚点位置确认 | 点击触控板 | 任意触发按钮 | 任意触发按钮 |
使用所有三种输入方式
在示例应用程序中,使用三种输入模式时,AR 和 VR/MR 设备之间存在差异:
- AR 设备:手部跟踪、注视控制器和指针控制器之间的切换应使用菜单按钮完成。
- VR/MR 设备:使用菜单按钮,用户只能在注视控制器和手部跟踪/指针控制器之间进行切换。手部跟踪输入和指针控制器之间的切换(反之亦然)将根据控制器的跟踪状态自动发生。当没有跟踪到控制器时,系统将自动更改为手部跟踪输入。当使用手部跟踪输入并检测到控制器时,系统将自动更改为指针控制器输入模式。
6.2.1.6 用户界面
位于世界中的 3D Widget 必须使用蓝图 BP_3DWidget
创建(位于 SnapdragonSpacesSamples Content > Snapdragon > Common > UI 下),并在 WidgetComponent 中定义 UI。为了使用凝视或指针控制器,它必须是此类的子类。
6.2.2 交互示例
此示例演示了如何与世界空间中的 3D 对象和 2D UI 进行交互。
6.2.2.1 示例如何运行
该示例演示了如何与场景中的 UI 和其他游戏对象进行交互。
浮动 UI 面板提供了可交互的常用 UI 元素,例如按钮和滚动条。虽然按钮可与凝视指针和设备指针一起使用,但示例中的滚动条仅可与设备指针一起使用。此外,场景中的另一个 UI 元素展示了来自主机控制器触摸板的输入。
最后,可以使用控制器抓取交互式立方体对象,以演示 3D 对象交互。为了使其成为有效的交互式 Actor,它需要与 3DWidget 通道发生重叠或阻塞的碰撞,并且需要 BPI_Interactable
(位于 SnapdragonSpacesSamples Content > Snapdragon > Common > Placeable 下)接口。要将接口添加到参与者,请转到“类设置”>“接口”>“实现的接口”>“在蓝图选项中添加”。
6.2.2.2 设备指针控制器
设备指针控制器的实现分为多个蓝图,在下面的章节中详细描述。
6.2.2.2.1 指针控制器组件
BP_PointerControllerComponent
蓝图文件(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core > Components 下)可以添加到 pawn 类中,以通过指针与 2D UI 和 3D 进行交互。
该组件继承自父类 BP_ControllerComponent
(请参阅场景设置)并编写管理与世界交互的基础脚本。唯一可定制的选项是运动控制器类,它指的是激活该控制器时将生成的角色类。
6.2.2.2.2 指针控制器
BP_PointerController
蓝图文件(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Placeable 下)管理光线投射以及与小部件和 3D actor 的交互。使用名为 3DWidget 的自定义跟踪通道。最后,为了可视化设备指针控制器,从控制器的原点沿着控制器的前进方向渲染圆柱体网格。默认情况下,它的颜色为红色,但是一旦它击中有效的交互对象,它就会将其颜色更改为绿色。此外,视觉的长度是通过以光线投射命中点作为结束点来调整的。
6.3 感知示例
6.3.1 锚示例
此示例演示了如何创建和销毁本地和保存的锚点以准确跟踪现实世界中的点。请参阅虚幻引擎文档,了解有关锚点的基本信息以及虚幻引擎的 ARPin 的作用 (打开新窗口) 和 ARPin 本地存储 (打开新窗口) 的工作原理。为了使用此功能,必须在项目设置 > Snapdragon Spaces 插件下的 OpenXR 插件设置中启用它。
6.3.1.1 示例如何运行
默认情况下,打开示例时,相机前方 1 米处会出现一个白色小控件,但如果在相机前方检测到击中,则小控件将呈黄色并放置在击中位置。在此示例中,用户有两种方法将小控件放置在当前位置:通过点击控制器上的选择,或使用启用凝视控制器时出现在浮动 UI 中的创建按钮。
放置小控件后,会出现一个简单的白色小控件,表明它不是 ARPin,也不会被跟踪。一旦底层功能报告了跟踪的锚点,就会出现红色、绿色和蓝色的小控件。这也会将 ARPin 附加到该对象。如果跟踪的 Gizmo 不再跟踪或 ARPin 创建失败,它将被涂成红色。如果将锚点保存到本地锚点存储中,则立方体网格组件将显示在小控件的中心。
此示例中用户可用的选项有:
- Destroy all anchors:用于删除放置在世界中的所有本地小玩意的按钮。此操作不会破坏商店中保存的锚点。
- Load all saved anchors:用于加载所有已保存的锚点并将其显示为放置在世界中的本地小工具的按钮。
- Clear store:用于从存储中删除所有已保存锚点的按钮。此操作不会清除放置在世界中的本地小工具。
- Save created anchor to local store:创建时将本地小工具保存为已保存锚点的复选框。
6.3.1.2 锚点管理器
BP_AnchorManager
蓝图(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Samples > Anchor > Placeable 下)集中了创建和销毁小玩意的操作。该蓝图绑定 pawn 中的事件以与示例交互(在本例中为控制器上的点击选择)。
要启用和禁用空间锚点,必须将切换空间要素
方法与空间锚点作为要素一起使用。
此外,在 BP_Pawn
中,添加了一个场景组件作为未放置的小控件的根组件。开发人员可以为未放置的小玩意自定义的一些选项包括:
- AnchorTag:标签名称定义到 BP_Pawn 中的场景组件中,用作未放置的小控件的根。
- DistanceGizmo:相机前面未放置的小控件的距离。
为了放置小控件,管理器将小控件与根分离,并使用他的变换来创建 ARPin 小控件。
此外,您还可以了解如何将锚点实现与Update Hit
函数中的命中测试结合起来。
6.3.1.3 小控件
BP_Gizmo
蓝图文件(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Samples > Anchor > Placeable 下)负责创建 ARPin。 PinComponent(打开新窗口)节点用于执行此操作,如下图所示。
警告
对于 SnapdragonSpaces 插件,必须添加应固定的组件(Component to Pin)和应固定组件的变换(Pin to World Transform),如果其中一个输入为空,则 ARPin 创建失败。
如果小控件启用了 bAutoSave 变量,请在分配 ARPin 后将其保存在锚点存储中。
Pin状态的管理是在这个蓝图的勾选处处理的。
最后,当小控件被破坏并具有有效的 ARPin 时,它会手动删除 Pin。
6.3.1.4 加载和保存锚点
警告
确保环顾您的环境,以便生成更好的跟踪地图并减少保存和加载时间。一次保存多个锚点会阻塞主线程,因此应该使用回调来保存任何后续锚点。
OpenXR 接口为我们提供了使用 Snapdragon Spaces 插件加载和保存 ARPins 到本地存储的功能,这些功能的实现在异步线程中进行,以避免应用程序中出现冻结问题。为此,开发商必须考虑:
- 从本地存储加载 ARPins
- 从本地保存加载所有 ARPins。该节点向我们返回名称和 ARPins 的映射。这些 ARPins 尚未加载,并且在异步线程完成从本地存储加载所有 ARPins 之前,它们的状态将处于“未跟踪”状态。完成后,ARPins 的状态将自动更改。
- 从本地保存加载所有 ARPins。该节点向我们返回名称和 ARPins 的映射。这些 ARPins 尚未加载,并且在异步线程完成从本地存储加载所有 ARPins 之前,它们的状态将处于“未跟踪”状态。完成后,ARPins 的状态将自动更改。
- 将 ARPin 保存到本地存储
- 将 ARPin 保存到本地存储。该节点使用名称作为 ID 保存 ARPin(它将由加载节点返回),开发人员应使用
On Spaces Anchor Is Saved
委托来了解保存何时成功完成。
- 将 ARPin 保存到本地存储。该节点使用名称作为 ID 保存 ARPin(它将由加载节点返回),开发人员应使用
- 获取保存的锚点名称
- 返回存储中保存的所有锚点名称。
- 获取 ARPin 保存的锚点名称
- 返回用于保存在 ARPin 存储中的名称。
- 返回用于保存在 ARPin 存储中的名称。
6.3.2 手部追踪
6.3.2.1 手部追踪示例
该示例演示了如何启用手势追踪功能、如何使用SpacesHandTracking功能的返回数据以及如何启用手势交互。为了使用此功能,必须在项目设置 > Snapdragon Spaces 插件下的 Snapdragon Spaces 插件设置中启用它。
警告
确保禁用 OpenXRHandTracking 插件,以便标准手部跟踪不会覆盖 Spaces 手部跟踪。
6.3.2.1.1 示例如何运行
打开示例后,当用户将手放在耳机摄像头的视野中时,手部跟踪就会启动。用户将看到代表每只手的网格。如果“手部跟踪”作为输入模式处于活动状态,则场景中的 3D 演员将可以交互。根据所选的交互选项,场景中将生成不同的可交互演员。
下图显示了手部网格。
6.3.2.1.1.1 手部追踪管理器
该示例使用 BP_HandTrackingManager
蓝图资源(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Samples > HandTracking > Placeable 下),该资源负责控制场景中可用的不同交互选项,包括远端交互和近端交互。
要启用和禁用手部跟踪,必须将Toggle Spaces Feature
方法与手部跟踪一起使用作为要启用的功能。通过这种方法,当不需要手部跟踪时,可以在项目的某些部分按需启动和停止手部跟踪。
提示
在 Snapdragon Spaces 0.13.0 和 0.14.0 版本中,还有另一个启用手部追踪的选项。这是“从一开始就使用手部跟踪”,可以在项目设置>插件>Snapdragon Spaces>常规>手部跟踪中找到。
使用Toggle AR Capture
(以手部网格划分作为捕获类型)启用手部网格划分。也可以使用Toggle Spaces Feature
来启用它。
警告
对于 Snapdragon Spaces 0.12.1 版之前的版本,通过使用 设置手部网格状态 启用手部网格划分。通过使用获取手部网格状态检查状态来管理网格的可见性。
两只手被表示为运动控制器,并且可以通过获取运动控制器数据来获取数据,以访问手关节位置和旋转。
提示
对于 Snapdragon Spaces 0.15.0 之前的版本,手部跟踪管理器负责使用运动控制器数据渲染手部关节,这一点已被删除,以更加强调手部交互。用于绘制关节的功能在手部跟踪管理器蓝图中仍然可用,其中绘制关节用于显示手部关节。从运动控制器数据中提取相应的信息,特别是每个手关节的位置和旋转,以正确放置每个关节的表示。角色 BP_HandJointRepresentation 用于此表示。
6.3.2.1.1.2 手部网格划分查看器
BP_HandMeshingViewer
位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Samples > HandTracking > Placeable 下,绑定来自 AR Trackable Notify 组件(打开新窗口)的事件以对 AR 可跟踪几何体变化做出反应,在本例中是渲染手网格。调用 On Add/Update Tracked Geometry 事件,并且由于不同类型的对象可以注册为 UARTrackedGeometry
,因此要验证跟踪的几何体是否为手网格,对象分类必须为 EARObjectClassification::HandMesh
。如果手部跟踪是输入模式,则 BP_HandMeshingViewer
会在 BP_HandTrackingControllerComponent
中生成,并将用作手部网格渲染器。
GetObjectClassification
函数可用于检查分类。
警告
对于 Snapdragon Spaces 0.13.0 版之前的版本,BP_HandMeshingViewer
不存在,该功能位于BP_HandTrackingManager
内部。对于 Snapdragon Spaces 0.12.1 版之前的版本,为了渲染手部网格,使用了HGestures 蓝图库
中的渲染手部网格方法,该方法从 Snapdragon Spaces 0.13.0 版开始已弃用。警告
在蓝图节点中,虚幻引擎通过引用将参数显示为返回值。必须传递表示手部网格的 actor 的引用和表示顶点数量的变量,否则将创建多个 actor。
提示
手网格材质适应新的手网格系统,这会产生平坦的阴影效果。
提示
为了非常简单地进行测试,可以使用 XRVisualization 插件并将运动控制器数据连接到渲染运动控制器功能来完成手部渲染。
6.3.2.1.1.3 手势状态
提示
从 Snapdragon Spaces 0.15.0 版本开始,手部跟踪示例中不再使用直接访问手势数据的功能。蓝图WBP_HandTrackingSample
仍在示例插件中,但不再使用。
WBP_HandTrackingSample
(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Samples > HandTracking > UI 下)用于在手部网格划分和手部关节可视化之间切换,并可视化每帧中识别的手势。 HGestures 蓝图库类
的函数就是用于此目的。在每一帧中都会检查两只手是否被跟踪以及正在做出什么手势。这是通过使用 Get XRHand Gesture Data 和 Is Hand Tracked 方法来完成的。
手势数据由以下参数组成:
- 类型:给出检测到的手部手势的枚举值。它可能是此列表中的手势之一:{ UNKNOWN、OPEN_HAND、GRAB、PINCH、ERROR }
- GestureRatio:0 到 1 之间的浮点值,指示应用手势的程度。
- FlipRatio:-1 到 1 之间的浮点值,指示是从后面 (-1)、从前面 (1) 还是在中间检测到手势。
以下是 UI 的结果,显示了检测到的左手手势类型和比例。