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

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

创建适用于 Jetpack XR 的 ARCore 会话

通过 ARCore for Jetpack XR 会话创建锚点。请参阅了解会话的生命周期,以获取 Session

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

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

创建相对于可跟踪对象的锚点

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

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

创建不含可跟踪的锚点

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

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

将实体附加到锚点

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

AnchorEntity.create(session, anchor).apply {
    setParent(session.activitySpace)
    addChild(entity)
}

了解 TrackingState

每个 Trackable 都有一个 TrackingState,应先检查该 TrackingState,然后再使用。如果 TrackableTrackableStateTracking,系统会主动更新其 PosePausedTrackable 将来可能会变为 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()。这会从应用的存储空间中移除锚点,并使给定 UUID 无法检索,以便调用 Anchor.load()

Anchor.unpersist(session, uuid)

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

val uuids = Anchor.getPersistedAnchorUuids(session)