使用 ARCore 為 Jetpack XR 建立錨點

錨點會說明現實世界中的固定位置和方向。 將物件附加至錨點,可讓物件在現實世界中呈現逼真的放置效果。

建立 Jetpack XR 的 ARCore 工作階段

透過 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 建立,例如 Plane,錨點就會在空間中移動時,跟著所連結的 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,並將其父項設為 AnchorEntity

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

瞭解 TrackingState

每個 Trackable 都有 TrackingState,使用前應先檢查。 系統會主動更新具有 Tracking TrackableTrackable PoseTrackableStateTrackable可能會在未來變成 Tracking,但 Stopped 永遠不會變成 TrackingTrackablePausedStopped

在整個工作階段中保留錨點

未保存的錨點會在工作階段終止後消失。應用程式會將錨點儲存在私人應用程式資料中,記住錨點的位置。這個錨點可在後續工作階段中擷取,並錨定在世界上的相同位置。

如要保存錨點,請使用 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)