Testy aplikacji 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ść (DepthPoint) 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.

Frame.hitTest(…), sprawdź, czy na liście zwrotnej znajdują się DepthPoint
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 Frame.hitTest(…), sprawdź na liście zwrotów Plane
Punkt cechy (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). Frame.hitTest(…), sprawdź na liście zwrotów Point
Szybkie miejsce docelowe (InstantPlacementPoint) 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ę. Frame.hitTestInstantPlacement(float, float, float)

Wykonanie standardowego testu trafień

Wywołaj Frame.hitTest(), aby wykonać test działań, korzystając z narzędzia TapHelper, aby uzyskać efekty MotionEvent z widoku AR.

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

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

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 Frame.hitTest(float[], int, float[], int) z wykorzystaniem dowolnego promienia we współrzędnych przestrzeni świata zamiast punktu w przestrzeni ekranu.

Utwórz reklamę zakotwiczoną na podstawie wyniku działania

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. Korzystając z pola HitResult.createAnchor(), utwórz nowy element Anchor, pamiętając, aby był on dołączony do elementu Trackable wyniku działania. Na przykład, na potrzeby wyniku trafienia samolotu, kotwica pozostanie przyłączona do wykrytej płaszczyzny, przez co wydaje się być częścią świata rzeczywistego.

Co dalej?