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

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

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

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

セッションを構成する

プレーン検出は、XR セッションではデフォルトで有効になっていません。プレーン トラッキングを有効にするには、セッションを構成します。

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

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

Jetpack XR の ARCore は、平面の状態を出力する StateFlow を介して平面の状態を提供します。セッションで飛行機に登録すると、飛行機が追加、更新、削除されたときにアプリに通知されます。

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

平面には次のプロパティがあります。

  • label: 特定の Plane のセマンティックな記述。WallFloorCeilingTable のいずれかです。
  • centerPose: 検出された平面の中心の姿勢。
  • extents: 検出された平面の寸法(メートル単位)。
  • vertices: 平面を近似する凸多角形の頂点のリスト。

プレーンに対してヒットテストを実行する

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

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

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
}