Jetpack XR 用 ARCore でアンカーを作成する

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 を基準に解釈することも、解釈しないようにすることもできます。

トラッキング可能オブジェクトを基準とするアンカーを作成する

アンカーが TrackablePlane など)を基準に作成されている場合、アンカーは、空間を移動するときに、アタッチされた 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 があります。TrackableStateTrackingTrackable は、Pose がシステムによってアクティブに更新されます。PausedTrackable は将来 Tracking になる可能性がありますが、StoppedTrackableTracking になることはありません。

セッション全体でアンカーを保持する

永続化されていないアンカーは、セッションが破棄されると消えます。アンカーを保持することで、アプリはプライベート アプリデータにそのアンカーの位置を記憶します。このアンカーは後続のセッションで取得でき、世界中の同じ場所に固定されます。

アンカーを保持するには、次のように 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)