Effectuer des tests de positionnement dans votre application NDK Android

Effectuez un test de positionnement pour déterminer la position correcte d'un objet 3D dans la scène. L'emplacement correct permet de s'assurer que le contenu en RA s'affiche à 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 (AR_TRACKABLE_DEPTH_POINT) 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.

ArFrame_hitTest, recherchez des ArDepthPoint dans la liste renvoyée
Avion (AR_TRACKABLE_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 ArFrame_hitTest, recherchez les ArPlane dans la liste renvoyée
Point caractéristique (AR_TRACKABLE_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 (pas seulement sur un sol ou un mur) ArFrame_hitTest, recherchez les ArPoint dans la liste renvoyée
Emplacement instantané (AR_TRACKABLE_INSTANT_PLACEMENT_POINT) 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, contrairement à la gravité Placer un objet sur un plan (sol ou mur) en utilisant la géométrie complète du plan ArFrame_hitTestInstantPlacement

Effectuer un test de positionnement standard

Appelez ArFrame_hitTest pour effectuer un test de positionnement.

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);
}

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

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);

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

Les tests de positionnement sont généralement traités comme les rayons émis par l'appareil photo de l'appareil ou de l'appareil photo, mais vous pouvez utiliser ArFrame_hitTestRay pour effectuer un test de positionnement en utilisant un rayon arbitraire dans les coordonnées spatiales mondiales au lieu d'un point d'espace d'écran.

Associer une ancre à un HitResult

Une fois que vous obtenez un résultat de hit, vous pouvez utiliser sa position comme entrée pour placer le contenu en RA dans votre scène. Utilisez ArHitResult_acquireNewAnchor pour créer une ancre à l'emplacement du hit.

Étapes suivantes

  • Consultez l'application exemple hello_ar_c sur GitHub.