Treffertests in der Android NDK-App durchführen

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 (AR_TRACKABLE_DEPTH_POINT) 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.

ArFrame_hitTest, sieh in der Rückgabeliste nach ArDepthPoints
Ebene (AR_TRACKABLE_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 ArFrame_hitTest, prüfen Sie in der Rückgabeliste nach ArPlane
Elementpunkt (AR_TRACKABLE_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). ArFrame_hitTest, prüfen Sie in der Rückgabeliste nach ArPoint
Instant-Placement (AR_TRACKABLE_INSTANT_PLACEMENT_POINT) 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. ArFrame_hitTestInstantPlacement

Standard-Treffertest durchführen

Rufen Sie ArFrame_hitTest auf, um einen Treffertest durchzuführen.

ArHitResultList* hit_result_list = NULL;
ArHitResultList_create(ar_session, &hit_result_list);
CHECK(hit_result_list);
if (is_instant_placement_enabled) {
  ArFrame_hitTestInstantPlacement(ar_session, ar_frame, x, y,
                                  k_approximate_distance_meters,
                                  hit_result_list);
} else {
  ArFrame_hitTest(ar_session, ar_frame, x, y, hit_result_list);
}

Filtern Sie Trefferergebnisse nach Typ. Wenn Sie sich beispielsweise auf ArPlane-Werte konzentrieren möchten:

int32_t hit_result_list_size = 0;
ArHitResultList_getSize(ar_session, hit_result_list, &hit_result_list_size);

// 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.
ArHitResult* ar_hit_result = NULL;
for (int32_t i = 0; i < hit_result_list_size; ++i) {
  ArHitResult* ar_hit = NULL;
  ArHitResult_create(ar_session, &ar_hit);
  ArHitResultList_getItem(ar_session, hit_result_list, i, ar_hit);

  if (ar_hit == NULL) {
    LOGE("No item was hit.");
    return;
  }

  ArTrackable* ar_trackable = NULL;
  ArHitResult_acquireTrackable(ar_session, ar_hit, &ar_trackable);
  ArTrackableType ar_trackable_type = AR_TRACKABLE_NOT_VALID;
  ArTrackable_getType(ar_session, ar_trackable, &ar_trackable_type);
  // Creates an anchor if a plane was hit.
  if (ar_trackable_type == AR_TRACKABLE_PLANE) {
    // Do something with this hit result. For example, create an anchor at
    // this point of interest.
    ArAnchor* anchor = NULL;
    ArHitResult_acquireNewAnchor(ar_session, ar_hit, &anchor);

    // TODO: Use this anchor in your AR experience.

    ArAnchor_release(anchor);
    ArHitResult_destroy(ar_hit);
    ArTrackable_release(ar_trackable);
    break;
  }
  ArHitResult_destroy(ar_hit);
  ArTrackable_release(ar_trackable);
}
ArHitResultList_destroy(hit_result_list);

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 ArFrame_hitTestRay verwenden, um einen Treffertest mit einem beliebigen Strahl in Weltraumkoordinaten statt eines Punkts auf dem Bildschirm durchzuführen.

Anker an HitResult anhängen

Sobald Sie ein Trefferergebnis haben, können Sie dessen Pose als Eingabe verwenden, um AR-Inhalte in Ihrer Szene zu platzieren. Erstellen Sie mit ArHitResult_acquireNewAnchor einen neuen Anker an der Trefferposition.

Nächste Schritte