Esegui un hit-test per determinare il corretto posizionamento di un oggetto 3D nella scena. Il posizionamento corretto garantisce che i contenuti AR vengano visualizzati con le dimensioni (apparenti) appropriate.
Tipi di risultati relativi agli hit
Un test di hit può produrre quattro diversi tipi di risultati, come illustrato nella tabella seguente.
Tipo di risultato hit | Descrizione | Orientamento | Caso d'uso | Chiamate al metodo |
---|---|---|---|---|
Profondità (DepthPoint ) |
Utilizza le informazioni sulla profondità dell'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) |
A questo scopo, è necessario attivare ArDepthMode .Frame.hitTest(…) , controlla se sono presenti DepthPoint nell'elenco dei resi
|
Plane |
Colpisce le 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 muro) utilizzando l'intera geometria dell'aereo. È necessaria immediatamente la bilancia corretta. Riserva per l'hit test di profondità |
Frame.hitTest(…) , cerca Plane nell'elenco dei resi
|
Punto di riferimento (Point ) |
Si basa su caratteristiche visive intorno al punto del tocco di un 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 dei resi
|
Posizionamento istantaneo (InstantPlacementPoint ) |
Utilizza lo spazio sullo schermo per posizionare i contenuti. Inizialmente viene utilizzata la profondità stimata fornita dall'app. Funziona immediatamente, ma la posa e la profondità effettiva cambieranno quando 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 muro) utilizzando l'intera geometria dell'aereo, dove il posizionamento rapido è fondamentale e l'esperienza può tollerare profondità e scala iniziali sconosciute |
Frame.hitTestInstantPlacement(float, float, float)
|
Eseguire un hit-test standard
Chiama Frame.hitTest()
per eseguire un hit test utilizzando l'utilità TapHelper
per ottenere MotionEvent
dalla vista 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 sui 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
In genere, i test di hit vengono trattati come raggi dal dispositivo o dalla fotocamera del dispositivo, ma puoi utilizzare Frame.hitTest(float[], int, float[], int)
per eseguire un test di hit utilizzando un raggio arbitrario nelle coordinate dello spazio mondiale anziché un punto nello spazio dello schermo.
Creare un'ancora utilizzando il risultato della hit
Una volta ottenuto un risultato, puoi utilizzare la sua posa come input per posizionare contenuti AR nella scena. Utilizza HitResult.createAnchor()
per creare una nuova Anchor
, assicurandoti che i contenuti vengano allegati al codice Trackable
sottostante del risultato dell'hit. Ad esempio, l'ancora rimarrà collegata all'aereo rilevato per un risultato di impatto con aereo, quindi sembrerà far parte del mondo reale.
Passaggi successivi
- Dai un'occhiata alle app di esempio
hello_ar_java
ehello_ar_kotlin
su GitHub.