Testuj trafienia w aplikacji NDK na Androida

Wykonaj test trafień, by określić poprawne położenie obiektu 3D w scenie. Odpowiednie umiejscowienie pozwala zapewnić, że treści AR będą renderowane w odpowiednim (widocznym) rozmiarze.

Typy wyników działań

Test działań może zwrócić wyniki 4 różnych typów działań, które przedstawiliśmy w tabeli poniżej.

Typ wyniku działania Opis Orientacja Przypadek użycia Wywołania metod
Głębokość (AR_TRACKABLE_DEPTH_POINT) Wykorzystuje informacje o głębi z całej sceny, aby określić prawidłową głębokość i orientację punktu Prostopadła do powierzchni 3D umieszczać wirtualny obiekt na dowolnej powierzchni (nie tylko na podłodze i ścianach); Aby to było możliwe, musisz włączyć ArDepthMode.

ArFrame_hitTest, sprawdź, czy na liście zwrotnej znajdują się ArDepthPoint
Samolot (AR_TRACKABLE_PLANE) Uderzenie powierzchni poziomej i/lub pionowej w celu określenia prawidłowej głębokości i orientacji punktu Prostopadła do powierzchni 3D Umieść obiekt na płaszczyźnie (podłodze lub na ścianie), wykorzystując pełną geometrię płaszczyzny. Natychmiastowa poprawna waga. Postaw na testy Depth ArFrame_hitTest, sprawdź na liście zwrotów ArPlane
Punkt cechy (AR_TRACKABLE_POINT) Działanie zależy od elementów wizualnych wokół punktu dotknięcia użytkownika w celu określenia jego prawidłowej pozycji i orientacji. Prostopadła do powierzchni 3D Umieść obiekt na dowolnej powierzchni (nie tylko na podłodze i ścianach). ArFrame_hitTest, sprawdź na liście zwrotów ArPoint
Szybkie miejsce docelowe (AR_TRACKABLE_INSTANT_PLACEMENT_POINT) Do umieszczania treści wykorzystuje miejsce na ekranie. Początkowo używa szacowanej głębokości podanej przez aplikację. Działa od razu, ale położenie i głębokość ulegną zmianie, gdy ARCore ustali rzeczywistą geometrię sceny +Y skierowany w górę, przeciwny do grawitacji Umieść obiekt na płaszczyźnie (podłodze lub na ścianie), wykorzystując pełną geometrię samolotu, gdzie szybkie rozmieszczenie ma kluczowe znaczenie, a doświadczenie może tolerować nieznaną początkową głębokość i skalę. ArFrame_hitTestInstantPlacement

Wykonanie standardowego testu trafień

Wywołaj ArFrame_hitTest, aby wykonać test trafień.

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

Filtruj wyniki działań według typu, który Cię interesuje. Jeśli na przykład chcesz skupić się na 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);

Przeprowadź test trafień przy użyciu dowolnego promienia i kierunku

Testy trafień są zwykle traktowane jako promienie pochodzące z urządzenia lub aparatu urządzenia, ale możesz przeprowadzić test z użyciem ArFrame_hitTestRay z wykorzystaniem dowolnego promienia we współrzędnych przestrzeni świata zamiast punktu w przestrzeni ekranu.

Dołącz kotwicę do HitResult

Po uzyskaniu wyniku działania możesz wykorzystać jego położenie jako dane wejściowe, aby umieścić treści AR w swojej scenie. Użyj narzędzia ArHitResult_acquireNewAnchor, aby utworzyć nową kotwicę w lokalizacji działania.

Co dalej?

  • Sprawdź przykładową aplikację hello_ar_c na GitHubie.