Mendeteksi bidang menggunakan ARCore untuk Jetpack XR

ARCore untuk Jetpack XR dapat mendeteksi permukaan datar di lingkungan pengguna dan memberikan informasi tentang permukaan tersebut seperti pose, ukuran, dan orientasinya. Hal ini dapat membantu aplikasi Anda menemukan platform seperti meja untuk menempatkan objek.

Membuat sesi ARCore untuk Jetpack XR

Mengakses informasi bidang melalui sesi XR ARCore untuk Jetpack. Lihat Memahami siklus proses Sesi untuk mendapatkan Session.

Mengonfigurasi Sesi

Deteksi bidang tidak diaktifkan secara default pada sesi XR. Untuk mengaktifkan pelacakan bidang, konfigurasikan sesi dan tetapkan mode 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. */)
}

Mengambil status bidang yang dirasakan

ARCore untuk Jetpack XR menyediakan status bidang melalui StateFlow yang memancarkan status bidang. Berlangganan ke pesawat dalam sesi akan memberi tahu aplikasi Anda saat pesawat ditambahkan, diperbarui, atau dihapus.

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

Pesawat memiliki properti berikut:

Melakukan hit-test terhadap bidang

Hit test adalah metode untuk menghitung persimpangan sinar dengan objek yang dilacak oleh sesi. Aplikasi umum dari uji hit adalah mengarahkan ke meja dan menempatkan objek di lokasi tersebut. Melakukan hit-test akan menghasilkan daftar objek yang terkena. Dengan kata lain, uji kecocokan tidak berhenti pada objek pertama yang terkena. Namun, sering kali Anda hanya tertarik dengan hit objek pertama dari jenis tertentu.

Untuk melakukan hit-test, gunakan Interaction.hitTest() dengan 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
}