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 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 (AR_TRACKABLE_DEPTH_POINT) Verwendet Tiefeninformationen aus der gesamten Szene, um die korrekte Tiefe und Ausrichtung eines Punkts zu bestimmen. Senkrecht zur 3D-Oberfläche Virtuelles Objekt auf einer beliebigen Oberfläche platzieren (nicht nur auf Böden und Wänden) Das funktioniert nur, wenn ArDepthMode aktiviert ist.

ArFrame_hitTest, in der Rückgabeliste nach ArDepthPoint suchen
Flugzeug (AR_TRACKABLE_PLANE) Treffer 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 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 ArFrame_hitTest, suchen Sie in der Rückgabeliste nach ArPlanes
Featurepunkt (AR_TRACKABLE_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). ArFrame_hitTest, suchen Sie in der Rückgabeliste nach ArPoints
Instant-Placement (AR_TRACKABLE_INSTANT_PLACEMENT_POINT) 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. Hier ist eine schnelle Positionierung von entscheidender Bedeutung und die Erfahrung kann eine unbekannte anfängliche Tiefe und Skalierung tolerieren. 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 dem gewünschten Typ. Wenn Sie sich beispielsweise auf ArPlanes 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 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 ArFrame_hitTestRay einen Treffertest mit einem beliebigen Strahl in Weltraumkoordinaten anstelle eines Bildschirmraumpunkts durchführen.

Einen Anker an ein HitResult anhängen

Nachdem du ein Trefferergebnis erhalten hast, kannst du dessen Pose als Eingabe verwenden, um AR-Inhalte in deiner Szene zu platzieren. Erstellen Sie mit ArHitResult_acquireNewAnchor einen neuen Anker an der Trefferposition.

Weiteres Vorgehen