Anchor は、現実世界での固定された位置と向きを表します。オブジェクトをアンカーに接続すると、オブジェクトが現実世界にリアルに配置されているように見えます。
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
に追従します。
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
があります。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()
を呼び出します。これにより、アプリのストレージからアンカーが削除され、Anchor.load()
の呼び出しで指定された UUID を取得できなくなります。
Anchor.unpersist(session, uuid)
アプリは、アプリのストレージにまだ存在する永続化されたすべてのアンカーのリストをリクエストすることもできます。
val uuids = Anchor.getPersistedAnchorUuids(session)