Testy aplikacji na Androida

Przeprowadź hit-test, 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 metody,
Głębokość (DepthPoint) 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 umieszczanie wirtualnego obiektu na dowolnej powierzchni (nie tylko na podłodze i ścianach); ArDepthMode musi być włączona, aby to działało.

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

Przeprowadź standardowy test trafień

Wywołaj metodę Frame.hitTest(), aby przeprowadzić test trafień, używając narzędzia TapHelper, aby uzyskać wyniki 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 według typu, który Cię interesuje. Jeśli na przykład chcesz skupić się na elementach 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ń, 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ć Frame.hitTest(float[], int, float[], int) do przeprowadzenia testu uderzeniowego, używając dowolnego promienia we współrzędnych kosmicznych zamiast punktu na ekranie.

Tworzenie reklamy zakotwiczonej na podstawie 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 HitResult.createAnchor(), by utworzyć nowy element Anchor, upewniając się, że treść pasuje do Trackable wyniku działania. Na przykład reklama zakotwiczona pozostanie dołączona do wykrytej płaszczyzny wyniku trafienia samolotu, przez co będzie sprawiać wrażenie, że jest częścią świata rzeczywistego.

Co dalej?