Przeprowadź hit-test, aby określić prawidłowe położenie obiektu 3D w scenie. Prawidłowe umieszczenie zapewnia, że treści AR są renderowane w odpowiednim (widocznym) rozmiarze.
Typy wyników
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 | prostopadle 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 .Frame.hitTest(…) , sprawdź, czy na liście zwrotów znajdują się DepthPoint
|
Plane |
uderza w powierzchnię poziomą lub pionową, aby określić właściwą głębokość i orientację punktu. | prostopadle 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 działań na podstawie typu, który Cię interesuje. Jeśli np. chcesz się skupić 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ń, używając dowolnego promienia i kierunku
Testy kolizji są zwykle traktowane jako promienie pochodzące z urządzenia lub jego kamery, ale możesz użyć Frame.hitTest(float[], int, float[], int)
, aby przeprowadzić test kolizji, używając dowolnego promienia w układzie współrzędnych świata zamiast punktu w układzie współrzędnych ekranu.
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 elementu HitResult.createAnchor()
, aby utworzyć nowy element Anchor
, który zapewni dołączenie treści do elementu Trackable
wyniku dopasowania. Na przykład kotwica pozostanie przypięta do wykrytego samolotu w przypadku wyniku „samolot”, dzięki czemu będzie wyglądać jak część rzeczywistego świata.
Co dalej?
- Zobacz przykładowe aplikacje
hello_ar_java
ihello_ar_kotlin
na GitHubie.