Faça um teste de hit para determinar o posicionamento correto de um objeto 3D na cena. O posicionamento correto garante que o conteúdo de RA seja renderizado no tamanho adequado (aparente).
Tipos de resultados de hits
Um teste de hit pode gerar quatro tipos diferentes de resultados de hit, conforme a tabela a seguir.
Tipo de resultado de hit | Descrição | Orientações | Caso de uso | Chamadas de método |
---|---|---|---|---|
Profundidade (AR_TRACKABLE_DEPTH_POINT ) |
Usa informações de profundidade de toda a cena para determinar a profundidade e a orientação corretas de um ponto | Perpendicular à superfície 3D | Colocar um objeto virtual em uma superfície arbitrária (não apenas em pisos e paredes) |
O ArDepthMode precisa estar ativado para que isso funcione.ArFrame_hitTest , verifique se há ArDepthPoint s na lista de devolução.
|
Avião (AR_TRACKABLE_PLANE ) |
atinge superfícies horizontais e/ou verticais para determinar a profundidade e orientação corretas de um ponto. | Perpendicular à superfície 3D | Coloque um objeto em um plano (solo ou parede) usando a geometria completa do plano. Escala correta precisa imediatamente. Substituto do teste de hit de profundidade |
ArFrame_hitTest , verifique se há ArPlane s na lista de devolução.
|
Ponto de recurso (AR_TRACKABLE_POINT ) |
Baseia-se em recursos visuais ao redor do ponto de toque do usuário para determinar a posição e a orientação corretas de um ponto. | Perpendicular à superfície 3D | Colocar um objeto em uma superfície arbitrária (não apenas em pisos e paredes) |
ArFrame_hitTest , verifique se há ArPoint s na lista de devolução.
|
Posicionamento instantâneo (AR_TRACKABLE_INSTANT_PLACEMENT_POINT ) |
Usa o espaço da tela para posicionar o conteúdo. Inicialmente usa a profundidade estimada fornecida pelo app. Funciona instantaneamente, mas a pose e a profundidade real mudam quando o ARCore consegue determinar a geometria real da cena. | +Y apontando para cima, oposto à gravidade | Colocar um objeto em um plano (solo ou parede) usando a geometria completa do avião, em que o posicionamento rápido é fundamental e a experiência pode tolerar profundidade e escala iniciais desconhecidas |
ArFrame_hitTestInstantPlacement
|
Realizar um teste de hit padrão
Chame ArFrame_hitTest
para realizar um teste de 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); }
Filtre os resultados de hits com base no tipo em que você tem interesse. Por exemplo, se você quiser se concentrar em ArPlane
s:
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);
Realizar um teste de hit usando um raio e uma direção arbitrários
Eles normalmente são tratados como raios da câmera do dispositivo ou da câmera, mas é possível usar ArFrame_hitTestRay
para realizar um teste de hit com um raio arbitrário nas coordenadas do espaço mundial, em vez de um ponto na tela.
Anexar uma âncora a um HitResult
Quando você receber um resultado de hit, use a pose dele como entrada para inserir conteúdo de RA na sua cena. Use ArHitResult_acquireNewAnchor
para criar uma nova Âncora no local do hit.
O que vem em seguida?
- Confira o app de exemplo
hello_ar_c
(link em inglês) no GitHub.