Jetpack XR 用 ARCore を使用して平面を検出する

Jetpack XR 向け ARCore は、ユーザーの環境内の平面を検出し、ポーズ、サイズ、向きなどの情報を提供できます。これにより、アプリでテーブルなどのオブジェクトを配置するサーフェスを見つけることができます。

ARCore for Jetpack XR セッションを作成する

Jetpack XR セッションの ARCore を通じて平面情報にアクセスします。Session を取得するには、セッションのライフサイクルを理解するをご覧ください。

セッションを構成する

XR セッションでは、平面検出はデフォルトで有効になっていません。平面トラッキングを有効にするには、セッションを構成して PlaneTrackingMode.HORIZONTAL_AND_VERTICAL モードを設定します。

val newConfig = session.config.copy(
    planeTracking = Config.PlaneTrackingMode.HORIZONTAL_AND_VERTICAL,
)
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. */)
}

認識された平面の状態を取得する

Jetpack XR 向け ARCore は、平面の状態を StateFlow を通じて提供します。この StateFlow は平面の状態を出力します。セッションで平面をサブスクライブすると、平面が追加、更新、削除されたときにアプリに通知されます。

Plane.subscribe(session).collect { planes ->
    // Planes have changed; update plane rendering
}

プレーンには次のプロパティがあります。

  • label: 特定の Plane のセマンティックな説明。WALLFLOORCEILINGTABLE のいずれかになります。
  • centerPose: 検出された平面の中心のポーズ。
  • extents: 検出された平面の寸法(メートル単位)。
  • vertices: 平面を近似する凸多角形の頂点のリスト。

平面に対してヒットテストを行う

ヒットテストは、セッションでトラッキングされたオブジェクトとレイの交点を計算する方法です。ヒットテストの一般的な用途は、テーブルをポイントして、その場所にオブジェクトを配置することです。ヒットテストを行うと、ヒット オブジェクトのリストが返されます。つまり、ヒットテストは最初にヒットしたオブジェクトで停止しません。ただし、多くの場合、特定のタイプの最初のヒット オブジェクトのみに関心があることがあります。

ヒットテストを実行するには、RayInteraction.hitTest() を使用します。

val results = androidx.xr.arcore.hitTest(session, ray)
// When interested in the first Table hit:
val tableHit = results.firstOrNull {
    val trackable = it.trackable
    trackable is Plane && trackable.state.value.label == Plane.Label.TABLE
}