Treffertests in Ihrer Android-App durchführen

Führen Sie einen Hit-Test durch, um die korrekte Platzierung eines 3D-Objekts in Ihrer Szene zu bestimmen. Durch die richtige Platzierung wird sichergestellt, dass der AR-Inhalt in der richtigen (sichtbaren) Größe gerendert wird.

Trefferergebnistypen

Ein Treffertest kann vier verschiedene Arten von Trefferergebnissen liefern, wie in der folgenden Tabelle dargestellt.

Trefferergebnistyp Beschreibung Ausrichtung Anwendungsfall Methodenaufrufe
Tiefe (DepthPoint) Ermittelt anhand von Tiefeninformationen aus der gesamten Szene die korrekte Tiefe und Ausrichtung eines Punkts. Senkrecht zur 3D-Oberfläche Virtuelles Objekt auf einer beliebigen Oberfläche platzieren (nicht nur auf Böden und Wänden) Dies funktioniert nur, wenn ArDepthMode aktiviert ist.

Frame.hitTest(…), in der Rückgabeliste nach DepthPoint suchen
Plane Trifft auf horizontale und/oder vertikale Oberflächen, um die richtige Tiefe und Ausrichtung eines Punkts zu bestimmen Senkrecht zur 3D-Oberfläche Platzieren Sie ein Objekt auf einer Ebene (Boden oder Wand) unter Verwendung der vollständigen Geometrie der Ebene. Ich brauche sofort die richtige Waage. Fallback für den Tiefen-Treffertest Frame.hitTest(…), in der Rückgabeliste nach Planes suchen
Featurepunkt (Point) Basiert auf visuellen Funktionen rund um den Punkt, an dem Nutzende tippen, 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(…), suchen Sie in der Rückgabeliste nach Points
Instant-Placement (InstantPlacementPoint) Nutzt Bildschirmfläche, um Inhalte zu platzieren. Verwendet anfangs die von der App bereitgestellte geschätzte Tiefe. Funktioniert sofort, aber Pose und Tiefe ändern sich, sobald ARCore die geometrische Form der Szene bestimmen kann +Y nach oben, gegenüber der Schwerkraft Platzieren Sie ein Objekt auf einer Ebene (Boden oder Wand) unter Verwendung der vollständigen Geometrie der Ebene. Eine schnelle Positionierung ist entscheidend, wobei die anfängliche Tiefe und Skalierung nicht ausreichend toleriert werden kann. Frame.hitTestInstantPlacement(float, float, float)

Standard-Treffertest durchführen

Rufen Sie Frame.hitTest() auf, um einen Treffertest durchzuführen, und verwenden Sie das Dienstprogramm TapHelper, um MotionEvents 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 dem gewünschten Typ. Wenn Sie sich beispielsweise auf DepthPoint 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 einem beliebigen Strahl und einer beliebigen Richtung durchführen

Treffertests werden in der Regel wie Strahlen des Geräts oder der Gerätekamera behandelt. Sie können jedoch mit Frame.hitTest(float[], int, float[], int) einen Treffertest mit einem beliebigen Strahl in Weltraumkoordinaten anstelle eines Bildschirmraumpunkts durchführen.

Mithilfe des Trefferergebnisses einen Anker erstellen

Nachdem du ein Trefferergebnis erhalten hast, kannst du dessen Pose als Eingabe verwenden, um AR-Inhalte in deiner Szene zu platzieren. Erstellen Sie mit HitResult.createAnchor() einen neuen Anchor und achten Sie darauf, dass der Content an die zugrunde liegende Trackable des Trefferergebnisses angehängt wird. Beispielsweise bleibt der Anker bei einem Flugzeug-Trefferergebnis an der erkannten Ebene haften und erscheint so als Teil der realen Welt.

Weiteres Vorgehen