Realiza una prueba de posicionamiento para determinar la ubicación correcta de un objeto 3D en tu escena. La posición correcta garantiza que el contenido de RA se renderice en el tamaño adecuado (aparente).
Tipos de resultados de hits
Una prueba de posicionamiento puede generar cuatro tipos diferentes de resultados, como se muestra en la siguiente tabla.
Tipo de resultado de hit | Descripción | Orientación | Caso de uso | de llamadas a métodos |
---|---|---|---|---|
Profundidad (AR_TRACKABLE_DEPTH_POINT ) |
Usa la información de profundidad de toda la escena para determinar la profundidad y la orientación correctas de un punto. | Perpendicular a la superficie 3D | Colocar un objeto virtual en una superficie arbitraria (no solo en pisos y paredes) |
ArDepthMode debe estar habilitado para que funcione.ArFrame_hitTest , verifica si hay ArDepthPoint en la lista de devoluciones.
|
Avión (AR_TRACKABLE_PLANE ) |
Golpea superficies horizontales o verticales para determinar la profundidad y la orientación correctas de un punto | Perpendicular a la superficie 3D | Coloca un objeto en un plano (piso o pared) usando la geometría completa del plano. Se necesita la báscula correcta de inmediato. Resguardo para la prueba de posicionamiento de profundidad |
ArFrame_hitTest , busca ArPlane en la lista de devoluciones.
|
Punto del atributo (AR_TRACKABLE_POINT ) |
Se basa en características visuales en el punto en el que un usuario presiona para determinar la posición y orientación correctas de un punto. | Perpendicular a la superficie 3D | Colocar un objeto en una superficie arbitraria (no solo en pisos y paredes) |
ArFrame_hitTest , busca ArPoint en la lista de devoluciones.
|
Posición instantánea (AR_TRACKABLE_INSTANT_PLACEMENT_POINT ) |
Usa el espacio de la pantalla para colocar contenido. Inicialmente, usa la profundidad estimada que proporciona la app. Funciona al instante, pero la pose y la profundidad real cambiarán una vez que ARCore pueda determinar la geometría real de la escena | +Y apuntando hacia arriba, opuesto a la gravedad | Coloca un objeto en un plano (piso o pared) con la geometría completa del plano, donde la ubicación rápida es fundamental y la experiencia puede tolerar profundidad y escala iniciales desconocidas. |
ArFrame_hitTestInstantPlacement
|
Realiza una prueba de posicionamiento estándar
Llama a ArFrame_hitTest
para realizar una prueba de posicionamiento.
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 los resultados de las hits según el tipo que te interesa. Por ejemplo, si quieres enfocarte en los elementos ArPlane
, haz lo siguiente:
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);
Realiza una prueba de posicionamiento con un rayo y una dirección arbitrarios
Por lo general, las pruebas de posicionamiento se tratan como rayos provenientes del dispositivo o la cámara del dispositivo, pero puedes usar ArFrame_hitTestRay
para realizar una prueba de posicionamiento con un rayo arbitrario en coordenadas de espacio mundial en lugar de un punto de espacio en la pantalla.
Cómo adjuntar un ancla a un HitResult
Una vez que obtengas un resultado de hit, puedes usar su pose como entrada para colocar contenido de RA en tu escena. Usa ArHitResult_acquireNewAnchor
para crear una ancla nueva en la ubicación del hit.
¿Qué sigue?
- Consulta la app de ejemplo de
hello_ar_c
en GitHub.