Realiza pruebas de posicionamiento en tu app para Android

Realiza una hit-test 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 (DepthPoint) 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 esto funcione.

Frame.hitTest(…), verifica si hay DepthPoint en la lista de devoluciones.
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 Frame.hitTest(…), busca Plane en la lista de resultados
Punto del atributo (Point) Se basa en características visuales alrededor del punto en el que el usuario presiona para determinar la posición y la orientación correctas de un punto. Perpendicular a la superficie 3D Colocar un objeto en una superficie arbitraria (no solo en pisos y paredes) Frame.hitTest(…), busca Point en la lista de devoluciones.
Posición instantánea (InstantPlacementPoint) 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. Frame.hitTestInstantPlacement(float, float, float)

Realiza una prueba de posicionamiento estándar

Llama a Frame.hitTest() para realizar una prueba de posicionamiento con la utilidad TapHelper para obtener MotionEvent de la vista de 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)
  }

Filtra los resultados de hits según el tipo que te interese. Por ejemplo, si quieres enfocarte en los elementos DepthPoint, haz lo siguiente:

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.
}

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 Frame.hitTest(float[], int, float[], int) 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.

Crea una ancla con el resultado del hit

Una vez que obtengas un resultado de hit, puedes usar su pose como entrada para colocar contenido de RA en tu escena. Usa HitResult.createAnchor() para crear un Anchor nuevo y asegúrate de que el contenido se adjunte al Trackable subyacente del resultado del hit. Por ejemplo, el ancla permanecerá conectada al plano detectado para un resultado de golpe de avión, por lo que parecerá parte del mundo real.

¿Qué sigue?