使用适用于 Jetpack XR 的 ARCore 创建锚点

适用的 XR 设备
本指南可帮助您为这些类型的 XR 设备打造体验。
XR 头戴设备
有线 XR 眼镜

锚点描述了现实世界中的固定位置和方向。 将对象附加到锚点有助于使对象看起来真实地放置在现实世界中。

访问会话

通过 ARCore for Jetpack XR Session 创建锚点。如果您要使用 Jetpack Compose for XR 增强空间界面,请访问 Jetpack Compose for XR 会话。如果您使用的是 Jetpack SceneCore 库中的空间化实体,请从 Jetpack XR 运行时访问会话

配置会话

创建和加载锚点不需要配置会话。不过,默认情况下,XR 会话不会启用锚点持久性。如需从本地存储空间持久保存和加载锚点,请配置会话并设置 AnchorPersistenceMode.LOCAL 模式:

val newConfig = session.config.copy(
    anchorPersistence = Config.AnchorPersistenceMode.LOCAL,
)
when (val result = session.configure(newConfig)) {
    is SessionConfigureSuccess -> TODO(/* Success! */)
    else ->
        TODO(/* The session could not be configured. See SessionConfigureResult for possible causes. */)
}

将内容锚定到空间中的固定位置

锚点是使用 Pose 创建的,可以相对于现有 Trackable 进行解读,也可以不相对于现有 Trackable 进行解读。

创建相对于 Trackable 的锚点

当锚点是相对于 Trackable(例如 Plane)创建时,锚点会随着所附着的 Trackable 在空间中移动。

when (val result = trackable.createAnchor(pose)) {
    is AnchorCreateSuccess -> { /* anchor stored in `result.anchor`. */ }
    else -> { /* handle failure */ }
}

创建不含 Trackable 的锚点

如需创建未附加到 Trackable 的锚点,请执行以下操作:

when (val result = Anchor.create(session, pose)) {
    is AnchorCreateSuccess -> { /* anchor stored in `result.anchor`. */ }
    else -> { /* handle failure */ }
}

将实体附加到锚点

如需在此位置渲染模型,请创建 GltfModel 并将其父级设置为 AnchorEntity

AnchorEntity.create(session, anchor).apply {
    parent = session.scene.activitySpace
    addChild(entity)
}

了解 TrackingState

每个 Trackable 都有一个 TrackingState,应在使用前进行检查。 如果 TrackableTrackableStateTracking,则其 Pose 会由系统主动更新。PausedTrackable 在未来可能会变为 Tracking,而 StoppedTrackable 永远不会变为 Tracking

在整个会话期间保持锚点不变

未持久保存的锚点会在会话销毁后消失。通过持久保存锚点,您的应用可以记住该锚点在其私有应用数据中的位置。此锚点可在后续会话中检索,并锚定在世界中的同一位置。

如需持久保存锚点,请使用 Anchor.persist(),如下所示:

val uuid = anchor.persist()

您的应用可以在未来的会话中使用 UUID 检索锚点:

when (val result = Anchor.load(session, uuid)) {
    is AnchorCreateSuccess -> {
        // Loading was successful. The anchor is stored in result.anchor.
    }
    else -> {
        // handle failure
    }
}

如果您不再需要锚点,请调用 unpersist()。这会从应用的存储空间中移除锚点,并使对 Anchor.load() 的调用无法检索到给定的 UUID。

Anchor.unpersist(session, uuid)

您的应用还可以请求已持久保存且仍存在于应用存储空间中的所有锚点的列表:

val uuids = Anchor.getPersistedAnchorUuids(session)