Testuj trafienia w aplikacji NDK na Androida

Przeprowadź test działań, aby określić prawidłowe położenie obiektu 3D w scenie. Dzięki odpowiednim umiejscowieniu treści AR renderowane są w odpowiednim (widocznym) rozmiarze.

Typy wyników działań

Test działań może zwrócić 4 rodzaje wyników działań, jak pokazano w tabeli poniżej.

Typ wyniku działania Opis Orientacja Przypadek użycia Wywołania metod
Głębokość (AR_TRACKABLE_DEPTH_POINT) Określa prawidłową głębokość i orientację punktu, korzystając z informacji o głębi z całej sceny Prostokątna do powierzchni 3D Umieść wirtualny obiekt na dowolnej powierzchni (nie tylko na podłodze i ścianach). Aby to zadziałało, musisz włączyć ArDepthMode.

ArFrame_hitTest, sprawdź, czy na liście zwrotów znajduje się ArDepthPoint
Samolot (AR_TRACKABLE_PLANE) uderza w powierzchnię poziomą lub pionową, aby określić właściwą głębokość i orientację punktu. Prostokątna do powierzchni 3D Możesz umieścić obiekt na płaszczyźnie (podłodze lub ścianie), korzystając z pełnej geometrii samolotu. Wymaga natychmiastowej prawidłowej skali. Zastępcza wersja testowa trafień typu Depth ArFrame_hitTest, sprawdź, czy na liście zwrotów znajduje się ArPlane
Punkt cechy (AR_TRACKABLE_POINT) Zależy od elementów wizualnych związanych z punktem kliknięcia w celu określenia jego prawidłowej pozycji i orientacji Prostokątna do powierzchni 3D Umieść obiekt na dowolnej powierzchni (nie tylko na podłodze i ścianach). ArFrame_hitTest, sprawdź, czy na liście zwrotów znajduje się ArPoint
Szybkie miejsce docelowe (AR_TRACKABLE_INSTANT_PLACEMENT_POINT) Zajmuje miejsce na ekranie do umieszczania treści. Początkowo używana jest szacunkowa głębokość podana przez aplikację. Działa od razu, ale położenie i rzeczywista głębia zmienią się, gdy ARCore zdoła określić prawdziwą geometrię sceny +Y w górę, przeciwnie do grawitacji Umieść obiekt na płaszczyźnie (podłoga lub ściana) przy użyciu pełnej geometrii samolotu w sytuacji, gdy szybkie umieszczenie danych ma kluczowe znaczenie. Działanie aplikacji może tolerować nieznaną początkową głębokość i skalę. ArFrame_hitTestInstantPlacement

Przeprowadź standardowy test trafień

Wywołaj metodę ArFrame_hitTest, aby przeprowadzić 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ń na podstawie typu, który Cię interesuje. Jeśli na przykład chcesz skupić się na elementach 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ń, używając dowolnego promienia i kierunku

Testy trafień są zwykle traktowane jako promienie z aparatu urządzenia lub aparatu urządzenia, ale możesz użyć ArFrame_hitTestRay do przeprowadzenia testu trafienia, używając dowolnego promienia we współrzędnych kosmicznych zamiast punktu na ekranie.

Dołącz kotwicę do wyniku działania

Gdy otrzymasz wynik działania, możesz użyć jego pozycji jako danych wejściowych, by umieścić treści AR w swojej scenie. Użyj narzędzia ArHitResult_acquireNewAnchor, aby utworzyć nową kotwicę w miejscu działania.

Co dalej?

  • Zapoznaj się z przykładową aplikacją hello_ar_c na GitHubie.