锚点描述了现实世界中的固定位置和方向。 将对象附加到锚点有助于使对象看起来像是真实地放置在现实世界中。
创建适用于 Jetpack XR 的 ARCore 会话
通过 ARCore for Jetpack XR 会话创建锚点。请参阅了解会话的生命周期,以获取 Session
。
配置会话
创建和加载锚点不需要配置会话。不过,默认情况下,XR 会话不会启用锚点持久性。如需保留和加载锚点,请配置会话:
val newConfig = session.config.copy( anchorPersistence = Config.AnchorPersistenceMode.Enabled, ) when (val result = session.configure(newConfig)) { is SessionConfigureConfigurationNotSupported -> TODO(/* Some combinations of configurations are not valid. Handle this failure case. */) is SessionConfigurePermissionsNotGranted -> TODO(/* The required permissions in result.permissions have not been granted. */) is SessionConfigureSuccess -> TODO(/* Success! */) }
将内容锚定到空间中的固定位置
锚点是使用 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
,然后再使用。如果 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()
。这会从应用的存储空间中移除锚点,并使给定 UUID 无法检索,以便调用 Anchor.load()
。
Anchor.unpersist(session, uuid)
您的应用还可以请求列出仍存在于应用存储空间中的所有已持久化的锚点:
val uuids = Anchor.getPersistedAnchorUuids(session)