Esecuzione di hit test nella tua app per Android

Esegui un hit test per determinare il posizionamento corretto di un oggetto 3D nella scena. Un posizionamento corretto assicura che i contenuti AR vengano visualizzati con le dimensioni appropriate (apparenti).

Tipi di risultati di hit

Un hit test può restituire quattro tipi diversi di risultati, come mostrato nella seguente tabella.

Tipo di risultato di hit Descrizione Orientamento Caso d'uso Chiamate al metodo
Profondità (DepthPoint) Utilizza le informazioni di profondità provenienti dall'intera scena per determinare la profondità e l'orientamento corretti di un punto Perpendicolare alla superficie 3D Posiziona un oggetto virtuale su una superficie arbitraria (non solo su pavimenti e pareti) ArDepthMode deve essere abilitato affinché questa funzionalità funzioni.

Frame.hitTest(…), controlla se nell'elenco dei resi sono presenti DepthPoint
Plane Colpisce superfici orizzontali e/o verticali per determinare la profondità e l'orientamento corretti di un punto Perpendicolare alla superficie 3D Posiziona un oggetto su un piano (pavimento o parete) utilizzando la geometria completa del piano. Serve immediatamente la bilancia corretta. Fallback per l'hit test di profondità Frame.hitTest(…), cerca Plane nell'elenco per i resi
Punto di caratteristica (Point) Si basa sulle caratteristiche visive attorno al punto di tocco dell'utente per determinare la posizione e l'orientamento corretti di un punto Perpendicolare alla superficie 3D Posiziona un oggetto su una superficie arbitraria (non solo su pavimenti e pareti) Frame.hitTest(…), cerca Point nell'elenco per i resi
Posizionamento istantaneo (InstantPlacementPoint) Utilizza lo spazio sullo schermo per posizionare i contenuti. Utilizza inizialmente la profondità stimata fornita dall'app. Funziona all'istante, ma la posa e la profondità effettiva cambieranno una volta che ARCore sarà in grado di determinare la geometria effettiva della scena +Y rivolto verso l'alto, opposto alla gravità Posiziona un oggetto su un piano (pavimento o parete) utilizzando la geometria completa del piano dove il posizionamento rapido è fondamentale e l'esperienza può tollerare profondità e scala iniziali sconosciute Frame.hitTestInstantPlacement(float, float, float)

Esecuzione di un hit test standard

Chiama Frame.hitTest() per eseguire un hit test, utilizzando l'utilità TapHelper per ottenere MotionEvent dalla visualizzazione 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)
  }

Filtra i risultati degli hit in base al tipo che ti interessa. Ad esempio, se vuoi concentrarti sugli 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.
}

Eseguire un hit test utilizzando un raggio e una direzione arbitrari

Gli hit-test vengono generalmente considerati come raggi provenienti dalla fotocamera del dispositivo o del dispositivo, ma puoi utilizzare Frame.hitTest(float[], int, float[], int) per eseguire un hit test utilizzando un raggio arbitrario nelle coordinate spaziali anziché un punto dello spazio dello schermo.

Creare un ancoraggio utilizzando il risultato dell'hit

Una volta ottenuto il risultato di un hit, puoi utilizzare la sua posa come input per posizionare i contenuti AR nella scena. Utilizza HitResult.createAnchor() per creare una nuova Anchor, assicurandoti che il contenuto venga collegato al riquadro Trackable sottostante del risultato dell'hit. Ad esempio, l'ancoraggio rimarrà attaccato al piano rilevato per il risultato di un hit da Piano e risulterà quindi far parte del mondo reale.

Passaggio successivo