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à (AR_TRACKABLE_DEPTH_POINT ) |
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) |
Affinché funzioni, è necessario attivare ArDepthMode .ArFrame_hitTest , controlla se sono presenti ArDepthPoint nell'elenco dei resi
|
Aereo (AR_TRACKABLE_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à |
ArFrame_hitTest , cerca ArPlane nell'elenco dei resi
|
Punto in evidenza (AR_TRACKABLE_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) |
ArFrame_hitTest , cerca ArPoint nell'elenco dei resi
|
Posizionamento istantaneo (AR_TRACKABLE_INSTANT_PLACEMENT_POINT ) |
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 rivolta verso l'alto, in posizione opposta 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 |
ArFrame_hitTestInstantPlacement
|
Eseguire un hit-test standard
Chiama ArFrame_hitTest
per eseguire un test degli hit.
ArHitResultList* hit_result_list = NULL; ArHitResultList_create(ar_session, &hit_result_list); CHECK(hit_result_list); if (is_instant_placement_enabled) { ArFrame_hitTestInstantPlacement(ar_session, ar_frame, x, y, k_approximate_distance_meters, hit_result_list); } else { ArFrame_hitTest(ar_session, ar_frame, x, y, hit_result_list); }
Filtra i risultati degli hit in base al tipo che ti interessa. Ad esempio, per concentrarti sulle ArPlane
:
int32_t hit_result_list_size = 0; ArHitResultList_getSize(ar_session, hit_result_list, &hit_result_list_size); // 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. ArHitResult* ar_hit_result = NULL; for (int32_t i = 0; i < hit_result_list_size; ++i) { ArHitResult* ar_hit = NULL; ArHitResult_create(ar_session, &ar_hit); ArHitResultList_getItem(ar_session, hit_result_list, i, ar_hit); if (ar_hit == NULL) { LOGE("No item was hit."); return; } ArTrackable* ar_trackable = NULL; ArHitResult_acquireTrackable(ar_session, ar_hit, &ar_trackable); ArTrackableType ar_trackable_type = AR_TRACKABLE_NOT_VALID; ArTrackable_getType(ar_session, ar_trackable, &ar_trackable_type); // Creates an anchor if a plane was hit. if (ar_trackable_type == AR_TRACKABLE_PLANE) { // Do something with this hit result. For example, create an anchor at // this point of interest. ArAnchor* anchor = NULL; ArHitResult_acquireNewAnchor(ar_session, ar_hit, &anchor); // TODO: Use this anchor in your AR experience. ArAnchor_release(anchor); ArHitResult_destroy(ar_hit); ArTrackable_release(ar_trackable); break; } ArHitResult_destroy(ar_hit); ArTrackable_release(ar_trackable); } ArHitResultList_destroy(hit_result_list);
Eseguire un hit-test utilizzando un raggio e una direzione arbitrari
In genere gli hit test vengono trattati come raggi provenienti dalla fotocamera del dispositivo o del dispositivo, ma puoi utilizzare ArFrame_hitTestRay
per condurre un hit test utilizzando un raggio arbitrario nelle coordinate dello spazio globale invece di un punto nello spazio sullo schermo.
Collegamento di un anchor a un HitResult
Una volta ottenuto un risultato, puoi utilizzare la sua posa come input per posizionare contenuti AR nella scena. Utilizza ArHitResult_acquireNewAnchor
per creare un nuovo Ancoraggio nella posizione dell'hit.
Passaggi successivi
- Dai un'occhiata all'app di esempio
hello_ar_c
su GitHub.