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

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

锚点描述了现实世界中的位置和方向。将对象附加到锚点有助于对象在现实世界中呈现出逼真的放置效果,并有助于应用节省电量,因为无需每帧都运行逻辑。

访问会话

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

配置会话

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

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

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

锚点是使用 Pose 创建的,可以相对于 现有 Anchorable 进行解读,也可以固定在世界中。Anchorable 是一种 Trackable,可以附加锚点。

创建相对于 Anchorable 的锚点

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

val anchor = plane.createAnchor(pose)

创建固定在世界中的锚点

如需创建固定在世界中的锚点,请勿将其附加到 Anchorable。仅将此类锚点用于漂浮在空间中的点,因为会话对不可移动对象位置的估计会随时间变化:

val anchor = Anchor.create(session, pose)

将实体附加到锚点

如需在此位置呈现模型,创建 GltfModel 并将其 父项设置为 AnchorSpace

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

了解 TrackingState

每个 Trackable 都有一个 TrackingState,应先检查该状态,然后再使用。 如果 TrackableTrackableStateTracking,则其 Pose 会由系统主动 更新。处于 Paused 状态的Trackable 将来可能会变为 Tracking 状态,而处于 Stopped 状态的 永远不会变为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()。这会从应用的存储空间中移除 锚点,并使给定的 UUID 无法通过对 Anchor.load()的调用进行检索。

Anchor.unpersist(session, uuid)

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

val uuids = Anchor.getPersistedAnchorUuids(session)