Używaj kotwic geoprzestrzennych do określania pozycji rzeczywistych treści w pakiecie Android NDK

Kotwice geoprzestrzenne to typ kotwic, które umożliwiają umieszczanie treści 3D w świecie rzeczywistym.

Typy kotwic geoprzestrzennych

Istnieją 3 typy kotwic geoprzestrzennych, z których każdy inaczej obsługuje wysokość:

  1. Kotwice WGS84:
    Kotwice WGS84 umożliwiają umieszczanie treści 3D o dowolnej szerokości, długości geograficznej i wysokości.

  2. Kotwice terenu:
    Zakotwiczone elementy terenu umożliwiają umieszczanie treści wyłącznie na podstawie szerokości i długości geograficznej oraz wysokości zależnej od terenu w danej pozycji. Wysokość jest określana względem ziemi lub piętra, zgodnie ze wskazówką VPS.

  3. Kotwice na dachu:
    Kotwice na dachu umożliwiają umieszczanie treści tylko przy użyciu szerokości i długości geograficznej, w stosunku do wysokości dachu budynku. Wysokość jest określana w odniesieniu do szczytu budynku, co jest znane przez narzędzie Streetscape Geometry. Jeśli nie ustawisz wysokości na budynku, domyślnie ustawiona będzie wysokość terenu.

WGS84 Teren Dach
Pozycja w poziomie Szerokość geograficzna, długość geograficzna Szerokość geograficzna, długość geograficzna Szerokość geograficzna, długość geograficzna
Położenie w pionie Względem wysokości WGS84 Względem poziomu terenu określonego przez Mapy Google Względem poziomu dachu określonego przez Mapy Google
Problem wymaga rozwiązania z serwera? Nie Tak Tak

Wymagania wstępne

Zanim przejdziesz dalej, włącz interfejs Geospatial API.

Umieść kotwice geoprzestrzenne

Każdy typ kotwicy używa specjalnych interfejsów API do ich tworzenia. Więcej informacji znajdziesz w artykule Typy zakotwiczonych kotwic geoprzestrzennych.

Tworzenie kotwicy z testu trafień

Możesz też utworzyć kotwicę geoprzestrzenną na podstawie wyniku testu działań. Użyj pozycji z testu działań i przekonwertuj ją na ArGeospatialPose. Możesz w niej umieścić dowolny z 3 opisanych typów zakotwiczenia.

Zdjęcie geoprzestrzenne w pozycji AR

ArEarth_getGeospatialPose() zapewnia dodatkowy sposób określania szerokości i długości geograficznej przez przekształcanie pozycji AR na pozycję geoprzestrzenną.

Zdjęcia AR w pozycji geoprzestrzennej

ArEarth_getPose() konwertuje określone przez Ziemi położenie w poziomie, wysokość i obrót kwantonu względem układu współrzędnych wschód-południe na położenie AR w odniesieniu do współrzędnych globalnych w GL.

Wybierz metodę odpowiednią do Twojego zastosowania

Każda metoda tworzenia kotwicy ma pewne ograniczenia, o których warto pamiętać:

  • Jeśli używasz funkcji Streetscape Geometry, przeprowadź test trafień, aby dołączyć treści do budynku.
  • Kotwice do terenu i na dachach preferują od kotwic z WGS84, ponieważ używają wartości wysokości określonych przez Mapy Google.

Określanie szerokości i długości geograficznej lokalizacji

Długość i szerokość geograficzną lokalizacji możesz obliczyć na 3 sposoby:

  • Korzystaj z Kreatora geoprzestrzennego, by przeglądać i wzbogacać świat o materiały 3D bez konieczności fizycznego odwiedzania konkretnej lokalizacji. Dzięki temu możesz umieścić atrakcyjne treści 3D, korzystając z Map Google w edytorze Unity. Szerokość i długość geograficzna, obrót oraz wysokość nad poziomem morza zostaną obliczone automatycznie.
  • Użyj Map Google
  • korzystać z Google Earth, Pamiętaj, że uzyskanie tych współrzędnych w Google Earth, a nie w Mapach Google, spowoduje błąd z błędem sięgającym do kilku metrów.
  • Przejdź do lokalizacji fizycznej

Użyj Map Google

Aby sprawdzić długość i szerokość geograficzną lokalizacji w Mapach Google:

  1. Otwórz Mapy Google na komputerze.

  2. Kliknij kolejno Warstwy > Więcej.

  3. Zmień Typ mapy na Satelita i odznacz pole Widok kuli ziemskiej w lewym dolnym rogu ekranu.

    Powoduje to wymuszenie widoku 2D i wyeliminowanie ewentualnych błędów, które mogą wynikać z widoku 3D pod kątem.

  4. Na mapie kliknij lokalizację prawym przyciskiem myszy i wybierz długość i szerokość geograficzną, aby skopiować ją do schowka.

Korzystanie z Google Earth

W Google Earth możesz obliczyć szerokość i długość geograficzną lokalizacji, klikając lokalizację w interfejsie i odczytując dane ze szczegółów oznaczenia miejsca.

Aby sprawdzić długość i szerokość geograficzną lokalizacji w Google Earth:

  1. Otwórz Google Earth na komputerze.

  2. Przejdź do menu i wybierz Styl mapy.

  3. Wyłącz przełącznik Budynki 3D.

  4. Po przełączeniu przełącznika Budynki 3D kliknij ikonę pinezki , aby dodać oznaczenie miejsca w wybranej lokalizacji.

  5. Określ projekt, w którym ma znajdować się oznaczenie miejsca, i kliknij Zapisz.

  6. W polu Tytuł wpisz nazwę oznaczenia miejsca.

  7. Kliknij strzałkę wstecz w panelu projektu i wybierz menu Więcej działań.

  8. Z menu wybierz Eksportuj jako plik KML.

Plik KLM podaje w tagu <coordinates> szerokość i długość geograficzną oraz wysokość nad poziomem morza, rozdzielone przecinkami, w ten sposób:

<coordinates>-122.0755182435043,37.41347299422944,7.420342565583832</coordinates>

Nie używaj szerokości i długości geograficznej z tagów <LookAt>, które określają pozycję kamery, a nie jej lokalizację.

Przejdź do lokalizacji fizycznej

Aby obliczyć wysokość w danym miejscu, możesz się tam udać i zrobić lokalne obserwacje.

Pobierz kwaternion obrotu

ArGeospatialPose_getEastUpSouthQuaternion() wyodrębnia orientację z pozycji geoprzestrzennej i generuje kwaternion, który reprezentuje macierz rotacji, która przekształca wektor z celu w układ współrzędnych wschód-południ (EUS). X+ punktów na wschód, Y+ punktów na południe, Z+ punktów na południe. Wartości są zapisywane w kolejności {x, y, z, w}.

Kotwice WGS84

Kotwica WGS84 to typ kotwicy, który umożliwia umieszczenie treści 3D o dowolnej szerokości, długości geograficznej i wysokości. Opiera się on na pozycji i orientacji, które trzeba umieścić w świecie rzeczywistym. Położenie obejmuje szerokość i długość geograficzną oraz wysokość, które są określane w układzie współrzędnych WGS84. Orientacja składa się z obrotu kwantonu.

Wysokość jest podawana w metrach powyżej referencyjnej elipsoidy WGS84, tak aby poziom gruntu nie miał wartości zero. Twoja aplikacja jest odpowiedzialna za podanie tych współrzędnych dla każdej utworzonej kotwicy.

Umieść kotwicę WGS84 w świecie rzeczywistym

Określanie wysokości lokalizacji

Istnieje kilka sposobów na określenie wysokości, na której będą umieszczane kotwice:

  • Jeśli lokalizacja kotwicy znajduje się fizycznie blisko użytkownika, możesz użyć wysokości podobnej do wysokości urządzenia użytkownika.
  • Po określeniu szerokości i długości geograficznej użyj interfejsu Elevation API, aby określić wysokość na podstawie specyfikacji EGM96. Aby porównać wysokość z wysokością ArGeospatialPose, musisz przekonwertować wysokość interfejsu API Map Google EGM96 na WGS84. Zapoznaj się z narzędziem GeoidEval, które zawiera zarówno wiersz poleceń, jak i interfejs HTML. Interfejs API Map Google od razu raportuje szerokość i długość geograficzną zgodnie ze specyfikacją WGS84.
  • Szerokość i długość geograficzną oraz wysokość nad poziomem morza możesz uzyskać w Google Earth. Spowoduje to wystąpienie błędu z błędem do kilku metrów. Użyj szerokości i długości geograficznej oraz wysokości z tagów <coordinates>, a nie z tagów <LookAt> w pliku KML.
  • Jeśli istniejąca kotwica znajduje się w pobliżu i jeśli nie jesteś na stromym zboczu, możesz użyć wysokości ArGeospatialPose kamery bez innego źródła, takiego jak interfejs API Map Google.

Tworzenie kotwicy

Gdy podasz długość i szerokość geograficzną (wysokość, wysokość i kwitanion obrotu), użyj ArEarth_acquireNewAnchor(), aby zakotwiczyć treści w określonych współrzędnych geograficznych.

float eus_quaternion_4[4] = {qx, qy, qz, qw};
if (ar_earth != NULL) {
  ArTrackingState earth_tracking_state = AR_TRACKING_STATE_STOPPED;
  ArTrackable_getTrackingState(ar_session, (ArTrackable*)ar_earth,
                               &earth_tracking_state);
  if (earth_tracking_state == AR_TRACKING_STATE_TRACKING) {
    ArAnchor* earth_anchor = NULL;
    ArStatus status = ArEarth_acquireNewAnchor(ar_session, ar_earth,
        /* location values */
        latitude, longitude, altitude,
        eus_quaternion_4, &earth_anchor);

    // Attach content to the anchor specified by geodetic location and
    // pose.
  }
}

Kotwice terenu

Kotwica terenu to typ kotwicy, który umożliwia umieszczanie obiektów AR tylko na podstawie szerokości i długości geograficznej. Korzystając z informacji z VPS, możesz określić dokładną wysokość nad ziemią.

Zamiast wprowadzać żądaną wysokość, podaje się wysokość nad terenem. Jeśli wartość wynosi zero, kotwica będzie wyrównana względem terenu.

Ustawianie trybu wyszukiwania samolotu

Znajdowanie płaszczyzny jest opcjonalne i nie jest wymagane przy korzystaniu z kotwic. Pamiętaj, że używane są tylko płaszczyzny poziome. Płaszczyny poziome ułatwiają dynamiczne wyrównywanie punktów zakotwiczenia terenu na powierzchni ziemi.

Użyj ArPlaneFindingMode, aby wybrać sposób, w jaki aplikacja ma wykrywać samoloty.

Utwórz kotwicę terenu za pomocą nowego interfejsu Async API

Aby utworzyć i umieścić kotwicę terenu, wywołaj metodę ArEarth_resolveAnchorOnTerrainAsync().

Reklama zakotwiczona nie będzie gotowa od razu i trzeba rozwiązać ten problem. Po rozwiązaniu problemu będzie on dostępny w ArResolveAnchorOnTerrainFuture.

Sprawdź stan zakotwiczenia terenu za pomocą narzędzia ArResolveAnchorOnTerrainFuture_getResultTerrainAnchorState(). Pobierz znalezioną reklamę zakotwiczoną, używając parametru ArResolveAnchorOnTerrainFuture_acquireResultAnchor().

float eus_quaternion_4[4] = {qx, qy, qz, qw};
void* context = NULL;
ArResolveAnchorOnTerrainCallback callback = NULL;
ArResolveAnchorOnTerrainFuture* future = NULL;
if (ar_earth != NULL) {
  ArTrackingState earth_tracking_state = AR_TRACKING_STATE_STOPPED;
  ArTrackable_getTrackingState(ar_session, (ArTrackable*)ar_earth,
                               &earth_tracking_state);
  if (earth_tracking_state == AR_TRACKING_STATE_TRACKING) {
    ArStatus status = ArEarth_resolveAnchorOnTerrainAsync(
        ar_session, ar_earth,
        /* location values */
        latitude, longitude, altitude_above_terrain, eus_quaternion_4,
        context, callback, &future);
  }
}

Poznaj przyszłość

Przyszłość będzie powiązana z elementem ArFutureState.

Stan Opis
AR_FUTURE_STATE_PENDING Operacja jest nadal w toku.
AR_FUTURE_STATE_DONE Operacja została zakończona, a wynik jest dostępny.
AR_FUTURE_STATE_CANCELLED Operacja została anulowana.

Sprawdzanie stanu zakotwiczenia terenu w wyniku Przyszłość

ArTerrainAnchorState należy do operacji asynchronicznej i jest częścią ostatecznego wyniku typu Future.

switch (terrain_anchor_state) {
  case AR_TERRAIN_ANCHOR_STATE_SUCCESS:
    // A resolving task for this anchor has been successfully resolved.
    break;
  case AR_TERRAIN_ANCHOR_STATE_ERROR_UNSUPPORTED_LOCATION:
    // The requested anchor is in a location that isn't supported by the
    // Geospatial API.
    break;
  case AR_TERRAIN_ANCHOR_STATE_ERROR_NOT_AUTHORIZED:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/c/group/ar-anchor#:~:text=from%20this%20error.-,AR_TERRAIN_ANCHOR_STATE_ERROR_NOT_AUTHORIZED,-The%20authorization%20provided
    // for troubleshooting steps.
    break;
  case AR_TERRAIN_ANCHOR_STATE_ERROR_INTERNAL:
    // The Terrain anchor could not be resolved due to an internal error.
    break;
  default:
    break;
}

Kotwice dachowe

Kotwice dachowe

Kotwice dachowe to rodzaj kotwic, które są bardzo podobne do kotwic terenowych powyżej. Różnica polega na tym, że podajesz wysokość nad dachem, a nie nad powierzchnią terenu.

Utwórz kotwicę na dachu za pomocą nowego interfejsu Async API

Reklama zakotwiczona nie będzie gotowa od razu i trzeba rozwiązać ten problem.

Aby utworzyć i umieścić na dachu kotwicę, wywołaj ArEarth_resolveAnchorOnRooftopAsync(). Podobnie jak w przypadku zakotwiczonych miejsc, masz też dostęp do ArFutureState przyszłości. Następnie możesz sprawdzić wynik Przyszły, aby uzyskać dostęp do ArRooftopAnchorState.

Użyj ArEarth_resolveAnchorOnRooftopAsync(), aby utworzyć ArResolveAnchorOnRooftopFuture.

Sprawdź stan kotwicy na dachu za pomocą narzędzia ArResolveAnchorOnRooftopFuture_getResultRooftopAnchorState().

Pobierz znalezioną reklamę zakotwiczoną, używając parametru ArResolveAnchorOnRooftopFuture_acquireResultAnchor().

float eus_quaternion_4[4] = {qx, qy, qz, qw};
void* context = NULL;
ArResolveAnchorOnRooftopCallback callback = NULL;
ArResolveAnchorOnRooftopFuture* future = NULL;
if (ar_earth != NULL) {
  ArTrackingState earth_tracking_state = AR_TRACKING_STATE_STOPPED;
  ArTrackable_getTrackingState(ar_session, (ArTrackable*)ar_earth,
                               &earth_tracking_state);
  if (earth_tracking_state == AR_TRACKING_STATE_TRACKING) {
    ArStatus status = ArEarth_resolveAnchorOnRooftopAsync(
        ar_session, ar_earth,
        /* location values */
        latitude, longitude, altitude_above_rooftop, eus_quaternion_4,
        context, callback, &future);
  }
}

Poznaj przyszłość

Przyszłość będzie powiązana z elementem ArFutureState (patrz tabela powyżej).

Sprawdź stan zakotwiczenia na dachu w wyniku Przyszłości

ArRooftopAnchorState należy do operacji asynchronicznej i jest częścią ostatecznego wyniku typu Future.

switch (rooftop_anchor_state) {
  case AR_ROOFTOP_ANCHOR_STATE_SUCCESS:
    // A resolving task for this anchor has been successfully resolved.
    break;
  case AR_ROOFTOP_ANCHOR_STATE_ERROR_UNSUPPORTED_LOCATION:
    // The requested anchor is in a location that isn't supported by the
    // Geospatial API.
    break;
  case AR_ROOFTOP_ANCHOR_STATE_ERROR_NOT_AUTHORIZED:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/c/group/ar-anchor#:~:text=from%20this%20error.-,AR_ROOFTOP_ANCHOR_STATE_ERROR_NOT_AUTHORIZED,-The%20authorization%20provided
    // for troubleshooting steps.
    break;
  case AR_ROOFTOP_ANCHOR_STATE_ERROR_INTERNAL:
    // The Rooftop anchor could not be resolved due to an internal error.
    break;
  default:
    break;
}

Co dalej