Führen Sie einen Treffertest durch, um die korrekte Position eines 3D-Objekts in Ihrer Szene zu bestimmen. Durch die richtige Platzierung wird sichergestellt, dass die AR-Inhalte in der richtigen (offenen) Größe gerendert werden.
Trefferergebnistypen
Ein Treffertest kann zu vier verschiedenen Arten von Trefferergebnissen führen, wie in der folgenden Tabelle dargestellt.
Trefferergebnistyp | Beschreibung | Ausrichtung | Anwendungsfall | Methodenaufrufe |
---|---|---|---|---|
Tiefe (DepthPoint ) |
Es werden Tiefeninformationen aus der gesamten Szene verwendet, um die korrekte Tiefe und Ausrichtung eines Punkts zu bestimmen. | Senkrecht zur 3D-Oberfläche | Platziere ein virtuelles Objekt auf einer beliebigen Oberfläche (nicht nur auf Böden und Wänden). |
ArDepthMode muss aktiviert sein, damit dies funktioniert.Frame.hitTest(…) , sieh in der Rückgabeliste nach DepthPoint s
|
Plane |
trifft auf horizontale und/oder vertikale Oberflächen, um die korrekte Tiefe und Ausrichtung eines Punkts zu bestimmen | Senkrecht zur 3D-Oberfläche | Platzieren Sie ein Objekt mithilfe der kompletten Geometrie des Flugzeugs auf einer Ebene (Boden oder Wand). Die richtige Skala muss sofort korrigiert werden. Fallback für den Depth-Treffertest |
Frame.hitTest(…) , prüfen Sie in der Rückgabeliste nach Plane
|
Elementpunkt (Point ) |
Es basiert auf visuellen Elementen um den Punkt herum, an dem der Nutzer tippt, um die korrekte Position und Ausrichtung eines Punkts zu bestimmen. | Senkrecht zur 3D-Oberfläche | Platzieren Sie ein Objekt auf einer beliebigen Oberfläche (nicht nur auf Böden und Wänden). |
Frame.hitTest(…) , prüfen Sie in der Rückgabeliste nach Point
|
Instant-Placement (InstantPlacementPoint ) |
Nutzt Platz auf dem Bildschirm, um Inhalte zu platzieren. Zu Beginn wird die von der App zur Verfügung gestellte geschätzte Tiefe verwendet. Funktioniert sofort, aber Pose und tatsächliche Tiefe ändern sich, sobald ARCore die Geometrie der Szene ermittelt hat. | +Y nach oben, gegenüber der Schwerkraft | Platzieren Sie ein Objekt unter Verwendung der kompletten Geometrie auf einer Ebene (Boden oder Wand), wobei eine schnelle Platzierung entscheidend ist und das Erlebnis eine unbekannte anfängliche Tiefe und Größe tolerieren kann. |
Frame.hitTestInstantPlacement(float, float, float)
|
Standard-Treffertest durchführen
Rufen Sie Frame.hitTest()
auf, um einen Treffertest durchzuführen und mit dem TapHelper
-Dienstprogramm MotionEvent
aus der AR-Ansicht abzurufen.
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) }
Filtern Sie Trefferergebnisse nach Typ. Wenn Sie sich beispielsweise auf DepthPoint
-Werte konzentrieren möchten:
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. }
Treffertest mit beliebiger Strahlung und Richtung durchführen
Treffertests werden normalerweise als Strahlen der Kamera des Geräts oder des Geräts behandelt. Sie können jedoch Frame.hitTest(float[], int, float[], int)
verwenden, um einen Treffertest mit einem beliebigen Strahl in Weltraumkoordinaten statt eines Punkts auf dem Bildschirm durchzuführen.
Anker anhand des Trefferergebnisses erstellen
Sobald Sie ein Trefferergebnis haben, können Sie dessen Pose als Eingabe verwenden, um AR-Inhalte in Ihrer Szene zu platzieren. Verwenden Sie HitResult.createAnchor()
, um ein neues Anchor
-Objekt zu erstellen. Achten Sie darauf, dass der Inhalt an die zugrunde liegende Trackable
des Trefferergebnisses angehängt wird. Der Anker bleibt beispielsweise für ein Trefferergebnis der Ebene „Ebene“ mit der erkannten Ebene verbunden und scheint daher Teil der realen Welt zu sein.
Nächste Schritte
- Sehen Sie sich die Beispiel-Apps
hello_ar_java
undhello_ar_kotlin
auf GitHub an.