添加跟随目标的子空间

适用的 XR 设备
本指南可帮助您为以下类型的 XR 设备打造优质体验。
扩展现实头戴设备
有线扩展现实眼镜

虽然标准 Subspace 会停留在由系统确定的固定位置,但有时您可能希望应用的空间界面随用户动态移动,或停留在其环境或现实世界中的特定位置。您可以将 FollowTarget 传递给 Subspace 的 follow 参数,以构建头部锁定 HUD 或附加到现实世界对象的各种信息面板等体验。

添加跟随用户视角的子空间

如需添加相对于用户视野范围定位的子空间,请使用 FollowTarget.view。根据您指定的跟随模式,您可以持续跟踪用户的头部运动,或根据用户注视的位置静态放置内容。您可以将其用于 HUD、常驻通知或快速操作控件等。

声明和请求权限

在请求权限之前,您必须使用 <uses-permission> 元素在应用的清单文件中声明这些权限。

<manifest ...>
    <!-- Only declare permissions that your app actually needs. In this example,
    we declare permissions for head tracking. -->
    <uses-permission android:name="android.permission.HEAD_TRACKING"/>
    <application ...>
        ...
    </application>
</manifest>

现在,请求权限。如需了解详情,请查看权限原则和工作流,确保为用户提供最佳体验,例如检查用户是否已授予应用所需的运行时权限,以及应用是否应在请求此权限之前向用户显示理由。

配置会话

接下来,您将通过设置 DeviceTrackingMode.SPATIAL 来配置使用 Jetpack Compose for XR 时为您创建的应用会话:

val session = checkNotNull(LocalSession.current)
session.configure(
    config = Config.Builder(session.config).setDeviceTracking(DeviceTrackingMode.SPATIAL)
        .build()
)

创建子空间

最后,您将创建一个以用户视图为目标的子空间,并设置跟随模式:

// Example: A subspace that softly follows the user's view (like a HUD)
Subspace(
    follow = FollowTarget.view(
        // Customizing the soft follow to move slightly faster and tracking all dimensions
        mode = FollowMode.soft(
        )
    ),
    modifier = modifier,
) {
    SpatialPanel {
      // SpatialPanel Content
    }
}

针对用户视图的子空间的跟随模式

将 FollowTarget.view 用作目标时,您可以通过指定 FollowMode 来自定义内容的行为:

  • FollowMode.soft:内容会逐渐跟上目标的移动,从而营造出平滑的浮动效果。
  • FollowMode.snap:内容会根据用户的初始视角姿势放置在用户面前一次 ,之后保持静止。
  • FollowMode.tight:内容会立即跟踪用户的视角,延迟极低,使内容与用户的动作紧密相连。

在所有跟随模式下,您都可以从以下选项中选择要跟踪的运动维度:

  • X 轴
  • Y 轴
  • 推介
  • 掷
  • 偏航
  • RotationOnly:可让您指定一个值来跟踪与旋转相关的维度(俯仰角、偏航角和翻滚角)。

您可以选择这些维度的任意组合,也可以使用默认值 TrackedDimensions.All 来跟踪所有这些维度。

添加一个遵循环境特征的子空间

如需添加一个将空间内容严格锁定到用户环境中的物理特征的子空间,请使用 FollowTarget.anchor()。使用此类目标可跟踪检测到的平面、锚点或地理空间位置。

跟踪真实世界特征需要额外的权限和会话配置,具体取决于您要跟踪的特征。

如需详细了解如何使用 ARCore 功能的感知功能,以及如何设置必要的权限和配置会话以使用 FollowTarget.anchor(),请参阅 Jetpack XR SDK 文档,了解平面、锚点和地理空间姿势。

以下示例创建了一个跟随现实世界锚点的子空间:

// A subspace locked to a real-world anchor
Subspace(
    follow = FollowTarget.anchor(anchor = myAnchor)
) {
    // Rotate the panel to ensure it faces the user while remaining anchored
    SpatialPanel(SubspaceModifier.rotateToLookAtUser()) {
      // SpatialPanel Content
    }
}

避免空间重叠

您创建的每个 Subspace 都会管理其自己的独立 3D 场景,并且不会感知其他子空间的存在,因此不会自动避免碰撞。

为防止头部锁定 HUD 穿过锚定 POI 面板(Z 冲突),请使用以下方法明确管理布局体积:

  1. 使用偏移:使用 SubspaceModifier.offset 在 Z 轴上将外围界面(如 HUD)推近或推远,或将其移至用户视野的边缘。
  2. 限制大小:应用 requiredSizeIn 等修饰符来限制空间的边界框。

如需详细了解坐标空间、布局限制条件和所有可用的跟踪配置,请参阅 Subspace 参考文档。