Realizar testes de hit no app Android NDK

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á ArDepthPoints 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á ArPlanes 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á ArPoints 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 ArPlanes:

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.