Używanie kotwic geoprzestrzennych do określania pozycji rzeczywistych treści w iOS

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

Typy punktów odniesienia geoprzestrzennych

Istnieją 3 typy kotwic geoprzestrzennych, które w różny sposób określają wysokość:

  1. Punkty kotwiczenia WGS84:
    punkty kotwiczenia WGS84 umożliwiają umieszczanie treści 3D na dowolnej szerokości geograficznej, długości geograficznej i wysokości.

  2. Elementy zakotwiczone terenu:
    Kotwice terenu umożliwiają umieszczanie treści tylko na podstawie szerokości geograficznej długość geograficzna i wysokość w odniesieniu do terenu w danej pozycji. Wysokość jest określana względem podłoża lub podłogi zgodnie z danymi VPS.

  3. Punkty kotwiczenia na dachu:
    Punkty kotwiczenia na dachu umożliwiają umieszczanie treści tylko za pomocą współrzędnych geograficznych (szerokość i długość) z wysokością względną do dachu budynku w tej pozycji. Wysokość jest określana względem szczytu budynku zgodnie z danymi z Streetscape Geometry. Jeśli nie jest umieszczona na budynku, domyślnie jest wyświetlana wysokość ukształtowania terenu.

WGS84 Teren Dach
Pozycja w poziomie Szerokość geograficzna, długość geograficzna Szerokość geograficzna, długość geograficzna Szerokość geograficzna, długość geograficzna
Pozycja 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
Wymaga rozwiązania przez serwer? Nie Tak Tak

Wymagania wstępne

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

Umieszczenie kotwic geoprzestrzennych

Każdy typ kotwic ma dedykowane interfejsy API do ich tworzenia. Więcej informacji znajdziesz w artykule Typy kotwic geoprzestrzennych.

Tworzenie kotwicy na podstawie testu trafień

Możesz też utworzyć punkt odniesienia geoprzestrzennego na podstawie wyników testu trafień. Użyj przekształcenia z testu działań i przekształć ją w GARGeospatialTransform. Używaj go do umieszczania dowolnego z 3 opisanych typów kotwic.

Pobieranie przekształcenia geoprzestrzennego z przekształcenia AR

GARSession.geospatialTransformFromTransform:error: udostępnia dodatkowy sposób określania szerokości i długości geograficznej przez konwertowanie przekształcenia AR na przekształcenie geoprzestrzenne.

Pobieranie przekształcenia AR z przekształcenia geoprzestrzennego

GARSession.transformFromGeospatialCoordinate:altitude:eastUpSouthQTarget:error: konwertuje określone przez Ziemię położenie poziome, wysokość i obrót kwartionowy względem ramki współrzędnych wschód-południe na transformację AR w odniesieniu do współrzędnych świata GL.

Wybierz metodę odpowiednią do Twojego zastosowania

Każda metoda tworzenia kotwicy ma związane z nią kompromisy, o których warto pamiętać:

  • Jeśli korzystasz z funkcji Geometria Streetscape, za pomocą testów zgodności dołączonych treści do budynku.
  • Preferuj kotwice w systemie terenu lub dachu nad reklamami WGS84, ponieważ korzystają z wartości wysokości określanych przez Mapy Google.

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

Szerokość i długość geograficzną lokalizacji można obliczyć na 3 sposoby:

  • Korzystaj z Kreatora geoprzestrzennego, aby wyświetlać i rozszerzać świat o treści 3D bez konieczności fizycznego przemieszczania się do danej lokalizacji. Pozwala to wizualnie umieszczać w mapach Google w Edytorze Unity treści angażujące 3D. Szerokość, długość geograficzna, obrót i wysokość treści zostaną obliczone automatycznie.
  • Użyj Map Google
  • Użyj Google Earth. Pamiętaj, że uzyskanie tych współrzędnych w Google Earth, a nie w Mapach Google, powoduje margines błędu do kilku metrów.
  • Przejdź do lokalizacji fizycznej

Użyj Map Google

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

  1. Otwórz Mapy Google na komputerze.

  2. Kliknij Warstwy > Więcej.

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

    Spowoduje to wymuszenie perspektywy 2D i wyeliminowanie ewentualnych błędów, które mogłyby wystąpić w przypadku widoku 3D pod kątem.

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

Korzystanie z Google Earth

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

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

  1. Otwórz Google Earth na komputerze stacjonarnym.

  2. Przejdź do menu z 3 kreskami i wybierz Styl mapy.

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

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

  5. Określ projekt, który ma zawierać oznaczenie miejsca, i kliknij Zapisz.

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

  7. Kliknij strzałkę wstecz w panelu projektu i wybierz menu Więcej czynności.

  8. W menu wybierz Eksportuj jako plik KML.

Plik KLM raportuje szerokość, długość i wysokość oznaczenia miejsca w tagu <coordinates> 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ą położenie kamery, a nie lokalizację.

Przejdź do lokalizacji fizycznej

Możesz obliczyć wysokość lokalizacji, przychodząc do niej fizycznie i przeprowadzając lokalne obserwacje.

Pobierz kwartion rotacji

GARGeospatialTransform.eastUpSouthQTarget wyodrębnia orientację z transformacji geoprzestrzennej i wyprowadza kwadrant reprezentujący macierz obrotu, która przekształca wektor z docelowego układu współrzędnych w układ współrzędnych wschód-góra-północ (EUS). X+ wskazuje na wschód, Y+ na górę, a Z+ na południe. Wartości są zapisywane w kolejności {x, y, z, w}.

Punkty kotwiczenia WGS84

Reklamy zakotwiczone WGS84 to typ kotwicy, który umożliwia umieszczanie treści 3D na dowolnej szerokości, długości i wysokości. Do umieszczenia w świecie rzeczywistym potrzebuje transformacji i orientacji. Pozycja składa się z szerokości geograficznej, długości geograficznej i wysokości, które są określone w systemie współrzędnych WGS84. Orientacja składa się z rotacji w kwartionach.

Wysokość jest podawana w metrach nad elipsoidą WGS84, więc poziom gruntu nie wynosi zero. Twoja aplikacja jest odpowiedzialna za podanie tych współrzędnych w przypadku każdej utworzonej kotwicy.

Umieść kotwicę WGS84 w świecie rzeczywistym

Określanie wysokości lokalizacji

Istnieje kilka sposobów na określenie wysokości lokalizacji na potrzeby umieszczania reklam zakotwiczonych:

  • Jeśli kotwica znajduje się fizycznie blisko użytkownika, możesz użyć wysokości podobnej do wysokości jego urządzenia.
  • Po uzyskaniu współrzędnych geograficznych użyj interfejsu Elevation API, aby uzyskać wysokość na podstawie specyfikacji EGM96. Aby porównać wysokość w systemie EGM96 interfejsu Maps API z wysokośćami w systemie WGS84, musisz przekonwertować wysokość w systemie EGM96 interfejsu Maps API na wysokość w systemie WGS84. Zapoznaj się z narzędziem GeoidEval, które ma zarówno interfejs wiersza poleceń, jak i interfejs HTML. Interfejs Maps API bezpośrednio raportuje szerokość i długość geograficzną zgodnie ze specyfikacją WGS84.
  • Długość i szerokość geograficzną lokalizacji oraz wysokość możesz sprawdzić w Google Earth. Dzięki temu margines błędu wynosi do kilku metrów. Użyj szerokości i długości geograficznej i wysokości z tagów <coordinates>, a nie z tagów <LookAt> w pliku KML.
  • Jeśli znajdujący się w pobliżu obiekt zakotwiczony znajduje się oraz nie jesteś na stromym zboczu, możesz użyć wysokości z aparatu GARGeospatialTransform bez korzystania z innego źródła, np. interfejsu API Map Google.

Tworzenie kotwicy

Gdy masz już szerokość, długość, wysokość i kwaternion obrotu, użyj atrybutu createAnchorWithCoordinate:altitude:eastUpSouthQAnchor:error:, aby zakotwiczyć treści w określonych przez siebie współrzędnych geograficznych.

  NSError *error = nil;
  GARAnchor *anchor = [self.garSession createAnchorWithCoordinate:coordinate
                                                         altitude:altitude
                                               eastUpSouthQAnchor:eastUpSouthQAnchor
                                                            error:&error];

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 i wykorzystuje informacje z VPS do określenia dokładnej wysokości nad poziomem gruntu.

Zamiast podawać żądaną wysokość, podajesz wysokość nad rzeźbą terenu. Jeśli ustawisz wartość 0, kotwica będzie na poziomie terenu.

Ustawianie trybu wyszukiwania samolotu

Wyszukiwanie samolotów jest opcjonalne i nie jest wymagane do korzystania z kotwic. Pamiętaj, że używane są tylko płaszczyzny poziome. Poziome płaszczyzny ułatwiają dynamiczne wyrównanie elementów kotwicy terenu do podłoża.

Użyj opcji ARWorldTrackingConfiguration.PlaneDetection, aby wybrać sposób wykrywania samolotów przez aplikację.

Tworzenie punktu kotwicznego terenu za pomocą nowego interfejsu Async API

Aby utworzyć i umieścić punkt odniesienia terenu, wybierz GARSession.createAnchorWithCoordinate:altitudeAboveTerrain:eastUpSouthQAnchor:completionHandler:error:.

Kotwica nie będzie gotowa od razu i musi zostać rozwiązana. Gdy problem zostanie rozwiązany, będzie dostępny w sekcji GARCreateAnchorOnTerrainFuture.

GARCreateAnchorOnTerrainFuture *future = [self.garSession createAnchorWithCoordinate:coordinate
                                                                altitudeAboveTerrain:altitude
                                                                  eastUpSouthQAnchor:eastUpSouthQTarget
                                                                   completionHandler:^(GARAnchor *anchor, GARTerrainAnchorState state) {
                                                                     // handle completion
                                                                   }
                                                                               error:&error];

Sprawdzanie stanu przyszłości

Z przyszłością będzie powiązany GARFutureState.

Stan Opis
GARFutureStatePending Operacja jest nadal w stanie oczekiwania.
GARFutureStateDone Operacja została zakończona, a jej wynik jest dostępny.
GARFutureStateCancelled Operacja została anulowana.

Sprawdź stan kotwicy terenu w przyszłości.

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

switch (future.resultTerrainAnchorState) {
  case GARTerrainAnchorStateSuccess:
    // Terrain anchor finished resolving.
    break;
  case GARTerrainAnchorStateErrorUnsupportedLocation:
    // The requested anchor is in a location that isn't supported by the Geospatial API.
    break;
  case GARTerrainAnchorStateErrorNotAuthorized:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/ios/group/GARTerrainAnchorState#garterrainanchorstateerrornotauthorized
    // for troubleshooting steps.
    break;
  case GARTerrainAnchorStateErrorInternal:
    // The Terrain anchor could not be resolved due to an internal error.
    break;
  default:
    break;
}

Kotwice dachowe

Rooftop anchors Hero

Kołki dachowe to rodzaj kotwic, które są bardzo podobne do opisanych wyżej kotwic dachowych. Różnica polega na tym, że podasz wysokość nad dachem, a nie nad terenem.

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

Kotwica nie będzie gotowa od razu i musi zostać rozwiązana.

Aby utworzyć i umieścić punkt kotwiczenia na dachu, wybierz GARSession.createAnchorWithCoordinate:altitudeAboveRooftop:eastUpSouthQAnchor:completionHandler:error:. Podobnie jak w przypadku kotwicy terenu, uzyskasz też dostęp do GARFutureState przyszłości. Następnie możesz sprawdzić wynik z przyszłości, aby uzyskać dostęp do GARRooftopAnchorState.

GARCreateAnchorOnRooftopFuture *future = [self.garSession createAnchorWithCoordinate:coordinate
                                                                altitudeAboveRooftop:altitude
                                                                  eastUpSouthQAnchor:eastUpSouthQTarget
                                                                   completionHandler:^(GARAnchor *anchor, GARRooftopAnchorState state) {
                                                                     // handle completion
                                                                   }
                                                                               error:&error];

Sprawdź przyszłość

Przyszłość będzie miała powiązaną wartość GARFutureState. Więcej informacji znajdziesz w tabeli powyżej.

Sprawdź stan kotwicy dachu w przyszłości.

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

switch (future.resultRooftopAnchorState) {
  case GARRooftopAnchorStateSuccess:
    // Rooftop anchor finished resolving.
    break;
  case GARRooftopAnchorStateErrorUnsupportedLocation:
    // The requested anchor is in a location that isn't supported by the Geospatial API.
    break;
  case GARRooftopAnchorStateErrorNotAuthorized:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/ios/group/GARRooftopAnchorState#garrooftopanchorstateerrornotauthorized
    // for troubleshooting steps.
    break;
  case GARRooftopAnchorStateErrorInternal:
    // The Rooftop anchor could not be resolved due to an internal error.
    break;
  default:
    break;
}

Co dalej?