Snapdragon Spaces 开发指南(13)

150 篇文章 19 订阅
27 篇文章 5 订阅


6.3.2.2 手部追踪交互

本节介绍使用手部跟踪交互所需的不同参与者和组件。

警告
手部追踪交互不仅用于手部追踪示例,还用于项目的所有示例。这允许用户与可与手部跟踪交互的小部件角色和 3D 角色进行交互。

6.3.2.2.1 空间手势输入管理器角色

要使用手部追踪交互功能,这是非常重要的角色。为了将手部追踪设置为输入模式,需要将此角色添加到关卡中。建议使用Spawn Actor of class节点来生成此角色。

在这里插入图片描述

警告
在将此角色添加或生成到关卡中之前,请务必检查手部追踪是否可用。在这里插入图片描述

控件手势输入管理器参与者负责实时监听手势并使用委托报告基于这些手势的操作。它生成并拥有 ASpacesHandInteraction 类的两个参与者,每只手一个,这是执行交互所需的。以下部分列出了可在此类中访问和使用的不同变量和函数。

6.3.2.2.1.1 变量
  • FOnSpacesHandPinch OnSpacesHandPinchLeftFOnSpacesHandPinch OnSpacesHandPinchRight:触发委托以通知捏合手势状态。
  • FOnSpacesHandOpen OnSpacesHandOpenLeftFOnSpacesHandOpen OnSpacesHandOpenRight:触发委托以通知有关张开手势状态的信息。
  • FOnSpacesHandGrab OnSpacesHandGrabLeftFOnSpacesHandGrab OnSpacesHandGrabRight:触发委托以通知 Grab 手势状态。
  • FOnSpacesHandInteractionStatusUpdated OnSpacesHandInteractionStatusUpdated:手部交互状态更新时触发的委托,它用布尔值通知状态。
  • TSubclassOf < ASpacesHandInteraction > HandInteractionClass空间手部交互角色的子类,作为手部交互角色生成。
  • FVector LeftRayPositionOffsetFVector RightRayPositionOffset:两个手部交互角色的光线偏移。
  • float RayDistance:两个手部交互角色的光线距离。
6.3.2.2.1.2 函数
  • ASpacesHandInteraction* GetHandLeftInteraction() constASpacesHandInteraction* GetHandRightInteraction() const:用于获取手部交互角色。
  • void SetHandInteractionState(bool active):用于启用或禁用手部交互,该函数将影响所有手部交互系统。默认情况下禁用手部交互。
  • void GetHandInteractionState() const:返回手部交互系统的状态。

提示
请参阅 BP_HandTrackingControllerComponent(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core > Components 下)以了解如何使用控件手势输入管理器角色。

6.3.2.2.2 空间手交互角色

Spaces Hand Interaction 角色负责与关卡中存在的不同手部可交互元素进行交互,例如 3D 小部件和其他类型的角色。 空间手交互角色包括远端手部交互(在场景元素上执行光线投射)和近端手部交互(当用手触摸可交互的角色时将被激活)。 空间手交互角色将用一条光线表示,该光线将从用户指定的手中开始。除非使用近端交互,否则该射线始终可见。光线有两种交互模式:活动(当光线投射到场景中任何手部可交互角色上时)或非活动。光线的颜色和长度将根据这两种模式而变化。要与 UI 交互,请使用远端交互和捏合手势。

提示
在虚幻引擎的 Snapdragon Spaces 示例项目中,手势输入管理器生成了两个空间手部交互类型的参与者,每只手一个,这意味着将手势输入管理器添加到场景中就足够了。

在这里插入图片描述
可以使用以下变量和函数来自定义空间手部交互角色。

6.3.2.2.2.1 变量
  • float LerpFactor:调节角色的平移和旋转速度。
  • float LerpFactor:调节角色的缩放速度。
  • floatMinimumScaleFactor:可以应用于角色的最小比例因子。
  • float MaximumScaleFactor:可以应用于角色的最大比例因子。
  • bool bApplyTranslation:指示是否翻译角色。
  • bool bApplyRotation:指示是否旋转角色。
  • bool bApplyScale:指示是否缩放角色。
  • FOnSpacesHandInteractableStateChanged OnSpacesHandInteractableStateChanged:通过参与者传达手部交互状态的委托/调度程序,使用 ESpacesHandInteractableState 枚举返回状态(请参阅以下代码示例中此枚举的工作原理)。
UENUM(BlueprintType, Category = "Snapdragon Spaces Hand Interaction")
enum class ESpacesHandInteractableState : uint8
{
    Focused = 0,
    Grabbed = 1,
    UnFocused = 2
};

该组件的使用示例位于 BP_SpacesHandInteractableCube 蓝图角色中,位于插件文件夹 SnapdragonSpacesSamples Content > SnapdragonSpaces > Samples > HandTracking > Placeable > InteractableObjects 下。

在这里插入图片描述

6.3.2.2.3 空间捕捉体积组件

Spaces Snapping Volume 组件继承自虚幻引擎 Box 组件 (opens new window)。它主要用于将 SpacesHandInteraction 角色的光线端捕捉到另一个角色内的所需位置。这对于可交互的 3D Widget 组件(例如按钮、复选框或滑块)特别有用,但它可以用于任何类型的 3D 角色。该组件可以添加到角色内部,并且必须手动放置在所需位置,例如,放置在 3D 小部件中的按钮顶部,如下图所示。

在这里插入图片描述

警告
在将此组件与 UI 一起使用时,遵循以下准则非常重要:

  • 框的位置和大小必​​须与 3D 小部件组件的形式相匹配,否则可能会出现不需要的效果,例如在 3D 小部件角色外部进行光线投射时出现闪烁。
  • 组件的 X 轴方向必须与 3D 小部件组件的方向匹配。这是与小部件组件正确交互所必需的。

要自定义该组件的行为,可以使用不同的变量和函数。

6.3.2.2.3.1 变量
  • bool bSnap:确定组件是否将用于捕捉。在不启用捕捉的情况下使用此组件的可能情况是 3D 小部件滑块。在这种情况下,不可能将光线的末端捕捉到滑块手柄,但为了用户体验需要手部光线的可视化。
  • bool bIsUI:当组件用于 3D Widget UI 组件交互时,必须启用此选项。它可以被禁用以供任何其他参与者使用。
  • bool bIsDisabled:确定组件碰撞是否从一开始就处于活动状态。默认情况下它将为 false。
6.3.2.2.3.1 函数
  • void SetCollisionDisabledState(bool disabled):用于设置bIsDisabled的值。
  • void UpdateCollisionStatus(bool active):更新组件的碰撞状态。如果 bIsDisabled 为 true,则无论函数的输入值如何,碰撞都将被禁用。
6.3.2.2.4 空间远端交互盒角色

BP_SpacesDistalInteractionBox 允许使用远端交互来旋转和缩放参与者。为了使用它,必须将其作为子 Actor 组件添加到 Actor 内部进行操作。在 SnapdragonSpaces Content > Hand Tracking > Actors 下找到 BP_SpacesDistalInteractionBox。要查看如何将 BP_SpacesDistalInteractionBox 添加到另一个 actor 的示例,请参阅位于 SnapdragonSpacesSamples Content > Snapdragon Spaces > Samples > HandTracking > Placeable > InteractableObjects 下的 BP_PandaInteractable 角色。远端交互盒由不同的 Spaces Distal Manipulator Actor 实例组成,每个实例都可以称为“操纵点”。 Spaces Distal Manipulator Actor 有两种不同的类型,即 Spaces Distal Scale PointSpaces Distal Rotation Point。根据框中的部分,操作点将具有不同的行为。位于框边缘的操作点用于更改角色的比例,其余操作点将执行不同的旋转,并且根据框上的位置,它们将在 X、Y 或Z 平面。请使用捏合手势与交互框进行交互。

在这里插入图片描述

6.3.3 命中测试

6.3.3.1 命中测试示例

此示例演示了如何对现实世界中发现的点和平面进行命中测试。有关命中测试以及虚幻引擎的线跟踪跟踪对象 3D 节点(如下图所示)功能的基本信息,请参阅虚幻引擎文档(打开新窗口)。为了使用此功能,必须在项目设置 > Snapdragon Spaces 插件下的 OpenXR 插件设置中启用它。此外,还必须启用平面检测功能才能使命中测试正常工作。为了获得更准确的命中,请在 AR 会话配置中启用平面检测功能的使用凸包检测选项。

在这里插入图片描述

6.3.3.1.1 示例如何运行

当示例打开时,小控件始终位于用户面前,并且每次更新都会启动光线投射。如果它返回成功的命中结果,则小控件将移动到命中姿势并以青色、黄色和洋红色显示。如果未检测到击中,小工具将移动到头部姿势前方一米并变为红色。

6.3.3.1.2 命中管理器

该示例使用 BP_HitManager 蓝图资源(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Samples > HitTesting > Placeable 下)来处理示例映射中的命中测试。要启用和禁用命中测试,必须将Toggle Spaces Feature方法与命中测试作为功能一起使用。开发人员可以使用多种选项来自定义用于命中测试的射线:

  • Distance Ray Cast:光线的长度。
  • GizmoTag:在 BP_Pawn 的 SceneComponent 中定义的标签名称,用于放置(也称为示例中的白色小控件)。
  • Distance Gizmo:从头部姿势到放置对象的距离。

6.3.4 图像追踪

6.3.4.1 图像追踪示例

该示例演示了如何检测和增强现实世界中发现的图像目标。

有关自定义可跟踪对象更新以及虚幻引擎的 AR Trackable Notify 组件功能的基本信息,请参阅虚幻引擎文档(打开新窗口)。为了使用此功能,必须在项目设置 > Snapdragon Spaces 插件下的 OpenXR 插件设置中启用它。

6.3.4.1.1 示例如何运行

默认情况下,当示例运行并识别图像时,它会在物理目标上生成一个小控件。该示例当前仅识别一张图像,并在地图中包含的 UI 面板中显示其世界位置。

在这里插入图片描述

6.3.4.1.2 图像AR管理器

BP_ImageTrackingManager 蓝图资源(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Samples > ImageTracking > Placeable 下)通过事件系统处理创建和销毁 BP_Gizmo_AugmentedImage 角色。它绑定来自 AR Trackable Notify 组件(打开新窗口)的事件,以对 AR 可跟踪图像的更改做出反应。当系统检测图像时,它会调用添加/更新/删除跟踪图像事件。在示例蓝图中,如果应开始检测,则Toggle AR Capture必须设置为ON;如果应停止检测目标并销毁所有生成的 AR 图像,则必须将Toggle AR Capture设置为OFF切换空间功能可用作启用该功能的替代方法。此外,必须将场景理解设置为该节点的捕获类型。

6.3.4.1.3 图像 AR 会话配置

系统开始使用 D_SpacesSessionConfig_ImageTracking 资源(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Samples > ImageTracking > Core 下)来检测图像。该资源是从 SpacesSessionConfig 类派生的数据资源。

会话配置文件提供三个字段:一个用于定义图像大小的字段,一个用于指定应跟踪的同时图像的最大数量的字段,以及一个用于引用要跟踪的候选图像的字段。

创建图像跟踪器在一个异步线程中进行,以避免在要跟踪的图像数量非常多时出现冻结问题。因此,有时图像跟踪可能会延迟启动。请监听On Spaces Image Tracking Is Ready代理事件,以确定何时可以开始跟踪图像。

在这里插入图片描述

6.3.4.1.4 AR 候选图像

虚幻引擎使用一种称为 AR 候选图像(打开新窗口)的专用资源类型。创建 XR 系统应跟踪的图像的引用。开发人员可以根据需要添加任意数量的 AR 候选图像,并将它们分配给 AR 会话配置中指示的数组。

要创建 AR 候选图像,必须首先将要跟踪的图像作为纹理资源导入到 Content 文件夹项目中。创建的纹理资源必须在压缩设置中设置 UserInterface2D (RGBA),建议关闭 mip 贴图。

在这里插入图片描述

提示
您可以在用于测试的图像目标部分找到使用的参考图像

下一步是创建 AR 候选图像资源,候选纹理字段引用创建的纹理资源。每个 AR 候选图像应具有可在友好名称字段中设置的唯一标识符。否则,同一 AR 会话配置中使用的不同候选者中的任何相同名称将导致哈希码冲突。

最后一步是通过宽度/高度字段定义图像的物理尺寸(以厘米为单位)。正确的测量对于正确的姿势估计和随后的增强放置至关重要。考虑到遵循“方向”字段中定义的方向的图像比例,此数据会自动填充。不幸的是,虚幻引擎目前的方向是颠倒的,因此开发人员必须对纵向图像使用横向,对横向图像使用纵向

如果 AR 候选图像资源父级是 Spaces AR 候选图像,则 Snapdragon Spaces 插件可以在不同的跟踪模式之间进行选择。

  • 动态模式:每帧更新跟踪图像的位置,适用于移动和静态目标。如果找不到跟踪的图像,则不会报告位置或姿势。默认使用。
  • 自适应模式:如果静态图像发生轻微移动,则定期更新它们的位置(大约每 5 帧更新一次)。这在静态图像的功耗和准确性之间找到了平衡。
  • 静态模式:适用于跟踪已知静态的图像。在此模式下跟踪的图像在首次检测到时固定在位置上,并且永远不会更新。这会降低功耗并提高性能,但如果跟踪图像出现任何漂移,其位置将不会更新。

可以在应用程序运行时更改跟踪模式,而无需使用以下节点停止或重新启动 AR 会话:

  • Set Image Target Tracking Mode by Friendly Name.
  • Set Image Target Tracking Mode by Candidate Image.
  • Set Image Targets Tracking Mode by Friendly Name.
  • Set Image Targets Tracking Mode by Candidate Image.

SetImageTrackedModeByID 已在版本 0.15.0 中弃用。

在这里插入图片描述
该示例使用 D_SpacesARCandidateImage_SpaceTown 蓝图资源(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Samples > ImageTracking > Placeable 下)。图像目标在 26 厘米高处测量(以 DIN A4 或 US letter 打印时)。 BP_Gizmo_AugmentedImage 蓝图资源(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Samples > ImageTracking > Placeable 下)正在物理图像目标上渲染一个小控件,该小控件在识别和跟踪时指示其方向。

在这里插入图片描述

6.3.5 平面检测

6.3.5.1 平面检测示例

此示例演示了如何可视化现实世界中发现的跟踪平面。有关自定义可跟踪对象更新以及虚幻引擎的 AR Trackable Notify 组件功能的基本信息,请参阅虚幻引擎文档(打开新窗口)。

6.3.5.1.1 示例如何运行

默认情况下,当打开示例时,它会为检测到的平面生成简单的形状。启用“使用凸包检测”选项后,示例将使用检测到的平面的凸包生成复杂的形状。

还可以显示这些几何图形的线框。

在这里插入图片描述

6.3.5.1.2 平面AR管理器

BP_PlaneARManager 蓝图文件(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Samples > PlaneDetection > Placeable 下)集中通过事件系统将创建和销毁平面作为增强几何图形的操作。此蓝图绑定来自 AR Trackable Notify 组件(打开新窗口)的事件,以对 AR 可跟踪平面的更改做出反应。以下事件与平面检测相关:

  • 添加/更新/删除跟踪平面:当系统使用简单平面几何体时,将调用这些事件。
  • 添加/更新/删除跟踪的几何图形:当系统使用复杂的平面几何图形时,将调用这些事件。
    • 与其他情况相反,不同类型的对象可以注册为 UARTrackedGeometry。要验证它是否是凸平面,其对象分类应为 EARObjectClassification::NotApplicable。请使用 GetObjectClassification 函数进行确认。在这里插入图片描述

警告
请记住更改 ToggleARCapture 的状态以重新启动检测,在角色行为开始时选择ON,并停止检测,在完成时选择OFF,以销毁所有生成的 AR 几何图形。

6.3.5.1.3 复杂的 AR 会话配置

当用户启用凸选项时,系统开始使用 D_ConvexHullSessionConfig 资源(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Samples > PlaneDetection > Core 下)来检测复杂平面。

与平面检测相关的选项有:

  • 使用凸包检测
  • 水平面检测
  • 垂直平面检测
6.3.5.1.4 功能设置

单击 OpenXR 项目设置中平面检测功能旁边的齿轮图标可以找到功能设置。

  • 使用场景理解:
    • 启用或禁用此设置将在检测到的平面的形状和数量方面产生不同的结果。
    • 启用此设置将启用场景理解来检测平面。这利用了空间网格划分(实验)功能所使用的相同技术。

默认平面检测与基于场景理解的平面检测之间的差异

度量默认值场景理解
检测速度和首次检测正常
误报误报率极低容易出现误报
平面精度
平面数量很少很多
平面更新和移动稳定,更新可能性不大动态而且包含更多平面更新的AR会话配置
平面取向滤光片水平和垂直过滤器选项没有过滤选项
命中测试按预期针对平面进行操作针对网格的命中测试

6.3.6 相机框架访问(实验性)

6.3.6.1 相机框架访问示例

警告
相机帧访问功能被标记为实验性的,因为插件和 Snapdragon Spaces 服务方面的优化目前正在破坏各个版本的向后兼容性。

此示例演示了如何从支持的设备访问相关相机信息,在本例中为相机图像和内在函数。目前此功能仅限于 RGB 相机。

6.3.6.1.1 示例如何运行

默认情况下,当示例运行时,UI 显示设备捕获的 RGB 图像以及与其相关的内在值。用户可以使用相应的按钮暂停和恢复帧捕获。

在这里插入图片描述
如果设备未授予相机访问权限,则图像、按钮和相机信息将被替换为建议用户启用它的警告消息。

6.3.6.1.1.1 相机框架访问AR管理器

该示例使用 BP_CameraFrameAccessARManager 蓝图资源(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Samples > CameraFrameAccess > Placeable 下)使用切换 AR 捕获启动和停止相机捕获,如果捕获应该开始,则必须将其设置为ON,并设置为OFF ,如果它应该停止捕获。此外,必须将相机设置为该节点的捕获类型。此功能支持任何 SpacesSessionConfig 资源的配置。也可以使用Toggle Spaces Feature方法来启用或禁用它。

6.3.6.1.1.2 相机捕捉库

Unreal AR界面为我们提供了从相机获取信息的功能。

  • Get AR Texture
    • 返回相机帧。 Snapdragon Spaces 插件扩展了信息以提供 RGB 帧作为 2D 纹理。投射到 Spaces AR 相机图像纹理类以获取帧 RGB 纹理。此外,必须将相机图像设置为该节点的纹理类型。、
  • Get Camera Intrinsics
    • 返回相机的图像分辨率焦距主点
      在这里插入图片描述
      Snapdragon Spaces 插件提供了额外的功能来帮助管理蓝图的相机捕获:
  • Set Camera Frame Access State
    • 要暂停相机捕捉,请将 Active 设置为 FALSE。要继续使用相机进行捕捉,请将 Active 设置为 TRUE。在版本 0.15.0 中已弃用,请改用暂停 AR 会话暂停空间功能
  • Is Camera Frame Access Supported
    • 如果捕获可供使用,则返回 TRUE,否则返回 FALSE。如果应用程序使用捕获,建议在 Tick 期间检查此结果。在版本 0.15.0 中已弃用,请改用功能是否可用在这里插入图片描述

提示
示例的行为在 WBP_CameraFrameAccess 蓝图资产中实现(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Samples > CameraFrameAccess > UI 下)。

6.3.6.2 Advanced

本节介绍如何访问原始 YUV 相机帧数据,而无需从生成的纹理中提取它。它还解释了如何获取蓝图中无法访问的额外数据。包含此过程中涉及的所有数据类型和结构,包括属于 USpacesRuntimeBlueprintLibrary 一部分并包含在 SpacesRuntimeBlueprintLibrary.h 中的可用函数。

提示
这些数据和函数只能通过 C++ 访问。

6.3.6.2.1 数据类型

ESpacesPlaneCameraFrameType 枚举描述帧平面的类型。

UENUM()
enum class ESpacesPlaneCameraFrameType : uint8
{
	Y = 0,
	U = 1,
	V = 2,
	UV = 3
};

ESpacesDistortionCameraFrameModel 枚举描述了用于相机校准的不同镜头畸变模型。

UENUM()
enum class ESpacesDistortionCameraFrameModel : uint8
{
	Linear = 0,
	Radial_2 = 1,
	Radial_3 = 2,
	Radial_6 = 3,
	FishEye_1 = 4,
	FishEye_4 = 5
};

ESpacesCameraFrameFormat 枚举描述了相机帧的不同格式。

UENUM()
enum class ESpacesCameraFrameFormat : uint8
{
	Unknown = 0,
	Yuv420_NV12 = 1,
	Yuv420_NV21 = 2,
	Mjpeg = 3,
	Size = 4,
};

FFrameDataOffset 结构描述了帧缓冲区数据中传感器图像数据的偏移量。

USTRUCT()
struct FFrameDataOffset
{
	GENERATED_BODY()
	int32 X;
	int32 Y;
};

FSpacesPlaneCameraFrameData 结构描述了帧缓冲区中的平面。

USTRUCT()
struct FSpacesPlaneCameraFrameData
{
	GENERATED_BODY()
	uint32 PlaneOffset;
	uint32 PlaneStride;
	ESpacesPlaneCameraFrameType PlaneType;
};

  • PlaneOffset 包含从缓冲区开头到平面数据开头的偏移量。
  • PlaneStride 表示从一行到下一行的字节距离。
  • PlaneType描述了帧数据的类型。

FSpacesSensorCameraFrameData 结构包含扩展的相机内在数据。

USTRUCT()
struct FSpacesSensorCameraFrameData
{
	GENERATED_BODY()
	FARCameraIntrinsics SensorCameraIntrinsics;
	FFrameDataOffset SensorImageOffset;
	TArray<float> SensorRadialDistortion;
	TArray<float> SensorTangentialDistortion;
	ESpacesDistortionCameraFrameModel DistortionCameraFrameModel;
};

  • SensorCameraIntrinsics 包含相机的图像分辨率、主点和焦距。
  • SensorImageOffset 是帧缓冲区数据中传感器图像数据的偏移量。
  • SensorRadialDistortion 描述径向畸变系数的浮点数组。
  • SensorTangentialDistortion 浮点数数组,描述切向畸变系数。
  • DistortionCameraFrameModel 描述用于相机校准的镜头畸变模型。

FSpacesCameraFrameData 结构包含帧数据和相机数据。

USTRUCT()
struct FSpacesCameraFrameData
{
	GENERATED_BODY()
	uint32 BufferSize;
	uint8* Buffer;
	ESpacesCameraFrameFormat FrameFormat;
	TArray<FSpacesPlaneCameraFrameData> Planes;
	FSpacesSensorCameraFrameData SensorData;
};

  • BufferSize 是包含数据的缓冲区的大小。
  • Buffer是指向帧数据的指针。
  • FrameFormat 是相机帧的格式。
  • Planes 是包含框架平面的数组。
  • SensorData 包含捕获帧的相机的扩展内在数据。
6.3.6.2.2 函数
  • static FSpacesCameraFrameData GetCameraYUVFrameData():访问并返回 FSpacesCameraFrameData 格式的最新相机帧数据。
  • static bool ReleaseCameraFrameData():释放之前访问的帧。必须在使用前一帧数据后使用它才能访问另一帧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值