锚点描述了现实世界中的固定位置和方向。 将对象附加到锚点有助于使对象看起来真实地放置在现实世界中。
创建 ARCore for Jetpack XR 会话
通过 ARCore for Jetpack XR 会话创建锚点。请参阅了解会话的生命周期,以获取 Session
。
配置会话
创建和加载锚点不需要配置会话。
不过,默认情况下,XR 会话不会启用锚点持久性。如需从本地存储空间持久保存和加载锚点,请配置会话并设置 AnchorPersistenceMode.LOCAL
模式:
val newConfig = session.config.copy( anchorPersistence = Config.AnchorPersistenceMode.LOCAL, ) when (val result = session.configure(newConfig)) { is SessionConfigureConfigurationNotSupported -> TODO(/* Some combinations of configurations are not valid. Handle this failure case. */) is SessionConfigureSuccess -> TODO(/* Success! */) else -> TODO(/* A different unhandled exception was thrown. */) }
将内容锚定到空间中的固定位置
锚点是使用 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
,应在使用前进行检查。
如果 Trackable
的 TrackableState
为 Tracking
,则其 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()
。这会从应用的存储空间中移除锚点,并使对 Anchor.load()
的调用无法检索到给定的 UUID。
Anchor.unpersist(session, uuid)
您的应用还可以请求已持久保存且仍存在于应用存储空间中的所有锚点的列表:
val uuids = Anchor.getPersistedAnchorUuids(session)