Realizar testes de hit no app Android NDK

Faça um teste de hit para determinar o posicionamento correto de um objeto 3D na sua cena. O posicionamento correto garante que o conteúdo de RA seja renderizado no tamanho adequado (aparente).

Tipos de resultados de hit

Um teste de hit pode gerar quatro tipos diferentes de resultados de hit, conforme mostrado na tabela a seguir.

Tipo de resultado do hit Descrição Orientação 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 orientação corretas de um ponto. Perpendicular à superfície 3D colocar um objeto virtual em uma superfície arbitrária (não apenas no chão e nas paredes); ArDepthMode precisa estar ativado para que isso funcione.

ArFrame_hitTest, verifique se há ArDepthPoints na lista de retorno.
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 dele. Precisa da balança correta imediatamente. Substituto do teste de hit de profundidade ArFrame_hitTest, verifique se há ArPlanes na lista de retornos.
Ponto de destaque (AR_TRACKABLE_POINT) Baseia-se em recursos visuais ao redor do ponto em que o usuário toca para determinar a posição e orientação corretas de um ponto. Perpendicular à superfície 3D colocar um objeto em uma superfície arbitrária (não apenas no chão e nas paredes); ArFrame_hitTest, verifique se há ArPoints na lista de retornos.
Canal instantâneo (AR_TRACKABLE_INSTANT_PLACEMENT_POINT) Usa o espaço na tela para posicionar 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 Coloque um objeto em um plano (solo ou parede) usando a geometria total dele. Nesse local, o posicionamento rápido é essencial, e a experiência pode tolerar a profundidade e a 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

Os testes de hit costumam ser tratados como raios da câmera do dispositivo ou da câmera, mas é possível usar ArFrame_hitTestRay para conduzir um teste de hit usando um raio arbitrário em coordenadas de espaço mundial em vez de um ponto de espaço na tela.

Anexar uma âncora a um HitResult

Quando você tiver um resultado de hit, poderá usar a posição dele como entrada para colocar 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.