使用适用于 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 = session.config.copy(
    anchorPersistence = 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 创建的,可以相对于 现有 Anchorable 进行解读,也可以不相对于现有 Anchorable 进行解读。一个 Anchorable 是一个 Trackable ,可以附加锚点。

相对于 Anchorable 创建锚点

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

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

创建不含 Anchorable 的锚点

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

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 会由系统主动 更新。处于 Paused 状态的 Trackable 将来可能会变为 Tracking 状态,而处于 Stopped 状态的 Trackable 永远不会变为 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)