Effectuer des tests de positionnement dans votre application Android

Effectuez un hit-test pour déterminer la position correcte d'un objet 3D dans la scène. Un emplacement correct garantit que le contenu RA est affiché à la taille (apparente) appropriée.

Types de résultats de l'appel

Un test de positionnement peut générer quatre types de résultats d'appel différents, comme le montre le tableau suivant.

Type de résultat de l'appel Description Orientation Cas d'utilisation Appels de méthode
Profondeur (DepthPoint) Utilise les informations de profondeur de l'ensemble de la scène pour déterminer la profondeur et l'orientation correctes d'un point. Perpendiculaire à la surface 3D Placez un objet virtuel sur une surface arbitraire (pas seulement sur un sol ou un mur) ArDepthMode doit être activé pour que cela fonctionne.

Frame.hitTest(…), recherchez des DepthPoint dans la liste renvoyée
Plane Intervient sur des surfaces horizontales et/ou verticales afin de déterminer la profondeur et l'orientation correctes d'un point Perpendiculaire à la surface 3D Placez un objet sur un plan (sol ou mur) en utilisant la géométrie complète du plan. Mise à l'échelle immédiate requise Remplacement du test de positionnement de profondeur Frame.hitTest(…), recherchez les Plane dans la liste renvoyée
Point caractéristique (Point) S'appuie sur les caractéristiques visuelles autour du point sur lequel l'utilisateur appuie pour déterminer la position et l'orientation correctes d'un point Perpendiculaire à la surface 3D Placer un objet sur une surface arbitraire (et pas seulement sur le sol ou les murs) Frame.hitTest(…), recherchez les Point dans la liste renvoyée
Emplacement instantané (InstantPlacementPoint) Utilise l'espace à l'écran pour placer le contenu. Utilise initialement la profondeur estimée fournie par l'application. Fonctionne instantanément, mais la position et la profondeur réelle changeront une fois qu'ARCore sera en mesure de déterminer la géométrie réelle de la scène +Y pointant vers le haut, à l'opposé de la gravité Placer un objet sur un plan (sol ou mur) à l'aide de la géométrie complète du plan lorsque le placement rapide est essentiel et que l'expérience peut tolérer une profondeur et une échelle initiales inconnues Frame.hitTestInstantPlacement(float, float, float)

Effectuer un test de positionnement standard

Appelez Frame.hitTest() pour effectuer un test de positionnement à l'aide de l'utilitaire TapHelper pour obtenir des MotionEvent à partir de la vue 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)
  }

Filtrez les résultats d'appel en fonction du type qui vous intéresse. Par exemple, si vous souhaitez vous concentrer sur les DepthPoint:

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

Réaliser un test de positionnement en utilisant un rayon et une direction arbitraires

Les tests de collision sont généralement traités comme des rayons provenant de l'appareil ou de sa caméra, mais vous pouvez utiliser Frame.hitTest(float[], int, float[], int) pour effectuer un test de collision à l'aide d'un rayon arbitraire dans les coordonnées de l'espace mondial au lieu d'un point dans l'espace de l'écran.

Créer une ancre à l'aide du résultat de l'appel

Une fois que vous avez obtenu un résultat de hit, vous pouvez utiliser sa position comme entrée pour placer le contenu en RA dans votre scène. Utilisez HitResult.createAnchor() pour créer un Anchor, en vous assurant que le contenu est associé au Trackable sous-jacent du résultat de l'appel. Par exemple, l'ancre restera attachée au plan détecté pour un résultat de hit de plan, et apparaîtra donc comme faisant partie du monde réel.

Étapes suivantes