Realizar testes de hit no app Android

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 (DepthPoint) 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.

Frame.hitTest(…), verifique se há DepthPoints na lista de devolução.
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 Frame.hitTest(…), verifique se há Planes na lista de devolução.
Ponto de recurso (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) Frame.hitTest(…), verifique se há Points na lista de devolução.
Posicionamento instantâneo (InstantPlacementPoint) 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 Frame.hitTestInstantPlacement(float, float, float)

Realizar um teste de hit padrão

Chame Frame.hitTest() para realizar um teste de hit usando o utilitário TapHelper para extrair MotionEvents da visualização em RA.

Java

MotionEvent tap = tapHelper.poll();
if (tap == null) {
  return;
}

if (usingInstantPlacement) {
  // When using Instant Placement, the value in APPROXIMATE_DISTANCE_METERS will determine
  // how far away the anchor will be placed, relative to the camera's view.
  List<HitResult> hitResultList =
      frame.hitTestInstantPlacement(tap.getX(), tap.getY(), APPROXIMATE_DISTANCE_METERS);
  // Hit-test results using Instant Placement will only have one result of type
  // InstantPlacementResult.
} else {
  List<HitResult> hitResultList = frame.hitTest(tap);
  // TODO: Filter hitResultList to find a hit result of interest.
}

Kotlin

val tap = tapHelper.poll() ?: return
val hitResultList =
  if (usingInstantPlacement) {
    // When using Instant Placement, the value in APPROXIMATE_DISTANCE_METERS will determine
    // how far away the anchor will be placed, relative to the camera's view.
    frame.hitTestInstantPlacement(tap.x, tap.y, APPROXIMATE_DISTANCE_METERS)
    // Hit-test results using Instant Placement will only have one result of type
    // InstantPlacementResult.
  } else {
    frame.hitTest(tap)
  }

Filtre os resultados de hits com base no tipo em que você tem interesse. Por exemplo, se você quiser se concentrar em DepthPoints:

Java

// 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.
for (HitResult hit : hitResultList) {
  Trackable trackable = hit.getTrackable();
  if (trackable instanceof DepthPoint) { // Replace with any type of trackable type
    // Do something with this hit result. For example, create an anchor at this point of
    // interest.
    Anchor anchor = hit.createAnchor();
    // TODO: Use this anchor in your AR experience.
    break;
  }
}

Kotlin

// 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.
val firstHitResult =
  hitResultList.firstOrNull { hit ->
    when (val trackable = hit.trackable!!) {
      is DepthPoint -> true // Replace with any type of trackable type
      else -> false
    }
  }
if (firstHitResult != null) {
  // Do something with this hit result. For example, create an anchor at this point of interest.
  val anchor = firstHitResult.createAnchor()
  // TODO: Use this anchor in your AR experience.
}

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 Frame.hitTest(float[], int, float[], int) para realizar um teste de hit com um raio arbitrário nas coordenadas do espaço mundial, em vez de um ponto na tela.

Criar uma âncora usando o resultado do hit

Quando você receber um resultado de hit, use a pose dele como entrada para inserir conteúdo de RA na sua cena. Use HitResult.createAnchor() para criar um novo Anchor, garantindo que o conteúdo seja anexado ao Trackable subjacente do resultado do hit. Por exemplo, para o resultado de um acidente de avião, a âncora permanece presa ao plano detectado, parecendo fazer parte do mundo real.

O que vem em seguida?