アンカーは、現実世界での位置と向きを表します。オブジェクトをアンカーにアタッチすると、オブジェクトが現実世界にリアルに配置されたように見え、アプリがフレームごとにロジックを実行する必要がなくなるため、電力を節約できます。
セッションにアクセスする
Jetpack XR の ARCore Session を使用してアンカーを作成します。Jetpack Compose for XR を使用して空間 UI を拡張する場合は、Jetpack Compose for XR からセッションにアクセスします。Jetpack SceneCore ライブラリの空間化されたエンティティを操作する場合は、Jetpack XR Runtime からセッションにアクセスします。
セッションを構成する
アンカーの作成と読み込みにセッションの構成は必要ありません。ただし、アンカーの永続性は XR セッションでデフォルトで有効になっていません。アンカーをローカル ストレージに保存して読み込むには、セッションを構成して AnchorPersistenceMode.LOCAL モードを設定します。
val newConfig = Config.Builder(session.config) .setAnchorPersistence(AnchorPersistenceMode.LOCAL) .build() 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 は、アンカーを付加できる Trackable です。
Anchorable を基準にアンカーを作成する
Plane などの Anchorable を基準にアンカーを作成すると、アンカーは空間内を移動する際に、アタッチされた Anchorable に追従します。
val anchor = plane.createAnchor(pose)
ワールドに固定されたアンカーを作成する
ワールドに固定されたアンカーを作成するには、Anchorable にアタッチしないでください。このタイプのアンカーは、空間に浮遊するポイントにのみ使用してください。セッションの不動オブジェクトの位置の推定値は時間とともに変化するためです。
val anchor = Anchor.create(session, pose)
エンティティをアンカーにアタッチする
この位置にモデルをレンダリングするには、GltfModel を作成し、その親を AnchorSpace に設定します。
AnchorSpace.create(session, anchor).apply { parent = session.scene.activitySpace addChild(entity) }
TrackingState について
各 Trackable には TrackingState があり、使用する前に確認する必要があります。TrackableState が Tracking の Trackable は、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)