Menjalankan hit-test di aplikasi Android

Lakukan hit-test untuk menentukan penempatan objek 3D yang benar di pemandangan Anda. Penempatan yang benar memastikan konten AR dirender pada ukuran yang sesuai (jelas).

Jenis hasil hit

Hit-test dapat menghasilkan empat jenis hasil hit yang berbeda, seperti yang ditunjukkan oleh tabel berikut.

Jenis hasil hit Deskripsi Orientasi Kasus penggunaan Panggilan metode
Tebal (DepthPoint) Menggunakan informasi kedalaman dari seluruh adegan untuk menentukan kedalaman dan orientasi titik yang benar Tegak lurus dengan permukaan 3D Meletakkan objek virtual di atas permukaan sembarang tempat (tidak hanya di lantai dan dinding) ArDepthMode harus diaktifkan agar fitur ini berfungsi.

Frame.hitTest(…), periksa DepthPoint dalam daftar pengembalian
Plane Menabrak permukaan horizontal dan/atau vertikal untuk menentukan kedalaman dan orientasi titik yang benar Tegak lurus terhadap permukaan 3D Tempatkan objek di bidang (lantai atau dinding) menggunakan geometri penuh bidang. Perlu timbangan yang benar segera. Penggantian untuk hit-test Depth Frame.hitTest(…), periksa Plane dalam daftar pengembalian
Poin fitur (Point) Mengandalkan fitur visual di sekitar titik yang diketuk pengguna untuk menentukan posisi dan orientasi titik yang benar Tegak lurus dengan permukaan 3D Meletakkan objek di permukaan sembarang tempat (tidak hanya di lantai dan dinding) Frame.hitTest(…), periksa Point dalam daftar pengembalian
Penempatan Instan (InstantPlacementPoint) Menggunakan ruang layar untuk menempatkan konten. Awalnya menggunakan perkiraan kedalaman yang disediakan oleh aplikasi. Dapat langsung berfungsi, tetapi pose dan kedalaman sebenarnya akan berubah setelah ARCore dapat menentukan geometri adegan yang sebenarnya +Y menunjuk ke atas, berlawanan dengan gravitasi Letakkan objek di bidang (lantai atau dinding) menggunakan geometri penuh bidang yang memerlukan penempatan cepat, dan pengalamannya dapat menoleransi kedalaman dan skala awal yang tidak diketahui Frame.hitTestInstantPlacement(float, float, float)

Menjalankan hit-test standar

Panggil Frame.hitTest() untuk melakukan hit-test, menggunakan utilitas TapHelper untuk mendapatkan MotionEvent dari tampilan AR.

Java

MotionEvent tap = tapHelper.poll();
if (tap == null) {
  return;
}

if (usingInstantPlacement) {
  // When using Instant Placement, the value in APPROXIMATE_DISTANCE_METERS will determine
  // how far away the anchor will be placed, relative to the camera's view.
  List<HitResult> hitResultList =
      frame.hitTestInstantPlacement(tap.getX(), tap.getY(), APPROXIMATE_DISTANCE_METERS);
  // Hit-test results using Instant Placement will only have one result of type
  // InstantPlacementResult.
} else {
  List<HitResult> hitResultList = frame.hitTest(tap);
  // TODO: Filter hitResultList to find a hit result of interest.
}

Kotlin

val tap = tapHelper.poll() ?: return
val hitResultList =
  if (usingInstantPlacement) {
    // When using Instant Placement, the value in APPROXIMATE_DISTANCE_METERS will determine
    // how far away the anchor will be placed, relative to the camera's view.
    frame.hitTestInstantPlacement(tap.x, tap.y, APPROXIMATE_DISTANCE_METERS)
    // Hit-test results using Instant Placement will only have one result of type
    // InstantPlacementResult.
  } else {
    frame.hitTest(tap)
  }

Filter hasil hit berdasarkan jenis yang Anda minati. Misalnya, jika Anda ingin berfokus pada DepthPoint:

Java

// Returned hit-test results are sorted by increasing distance from the camera or virtual ray's
// origin.
// The first hit result is often the most relevant when responding to user input.
for (HitResult hit : hitResultList) {
  Trackable trackable = hit.getTrackable();
  if (trackable instanceof DepthPoint) { // Replace with any type of trackable type
    // Do something with this hit result. For example, create an anchor at this point of
    // interest.
    Anchor anchor = hit.createAnchor();
    // TODO: Use this anchor in your AR experience.
    break;
  }
}

Kotlin

// Returned hit-test results are sorted by increasing distance from the camera or virtual ray's
// origin.
// The first hit result is often the most relevant when responding to user input.
val firstHitResult =
  hitResultList.firstOrNull { hit ->
    when (val trackable = hit.trackable!!) {
      is DepthPoint -> true // Replace with any type of trackable type
      else -> false
    }
  }
if (firstHitResult != null) {
  // Do something with this hit result. For example, create an anchor at this point of interest.
  val anchor = firstHitResult.createAnchor()
  // TODO: Use this anchor in your AR experience.
}

Melakukan hit-test menggunakan sinar dan arah arbitrer

Hit-test biasanya diperlakukan sebagai sinar dari perangkat atau kamera perangkat, tetapi Anda dapat menggunakan Frame.hitTest(float[], int, float[], int) untuk melakukan hit-test menggunakan sinar arbitrer dalam koordinat ruang dunia, bukan titik ruang layar.

Membuat Anchor menggunakan hasil hit

Setelah memiliki hasil hit, Anda dapat menggunakan posenya sebagai input untuk meletakkan konten AR di tampilan. Gunakan HitResult.createAnchor() untuk membuat Anchor baru, yang memastikan bahwa konten dilampirkan ke Trackable dasar hasil hit. Misalnya, anchor akan tetap terpasang ke bidang yang terdeteksi untuk hasil hit Bidang, sehingga tampak seperti bagian dari dunia nyata.

Langkah selanjutnya