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

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

Typy punktów odniesienia geoprzestrzennych

Istnieją 3 rodzaje punktów odniesienia geoprzestrzennego, które inaczej obsługują wysokość:

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

  2. Punkty kotwiczenia na lądzie:
    Punkty kotwiczenia na lądzie umożliwiają umieszczanie treści tylko za pomocą szerokości i długości geograficznej z wysokością w stosunku do terenu w danym miejscu. Wysokość jest określana względem podłoża lub podłogi zgodnie z danymi VPS.

  3. Kotwice dachowe:
    Kotwice dachowe umożliwiają umieszczanie treści na podstawie szerokości i długości geograficznej i wysokości względem dachu budynku. Wysokość jest określana w odniesieniu do szczytu budynku znanej z funkcji Streetscape Geometry. Domyślnie jest to wysokość terenu, jeśli obiekt nie znajduje się na budynku.

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
Czy musi być rozwiązany na serwerze? Nie Tak Tak

Wymagania wstępne

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

Umieszczenie kotwic geoprzestrzennych

Każdy typ kotwicy 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 wyniku 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 pozycję poziomą, wysokość i obrot kwaterniony określone przez Ziemię względem układu współrzędnych wschód-góra-południe na transformację AR względem współrzędnych świata GL.

Wybierz metodę odpowiednią do Twojego przypadku użycia

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

  • Jeśli używasz geometrii Streetscape, dołącz treści do budynku za pomocą testu kolizji.
  • Zamiast punktów kotwiczenia WGS84 użyj punktów kotwiczenia Teren lub Dach, ponieważ wykorzystują one wartości wysokości określone przez Mapy Google.

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

Długość i szerokość 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. Dzięki temu możesz wizualnie umieszczać wciągające treści 3D za pomocą Map Google w Edytorze Unity. Szerokość geograficzną, długość geograficzną, obrót i wysokość treści obliczymy automatycznie.
  • Użyj Map Google
  • Użyj Google Earth. Pamiętaj, że uzyskanie tych współrzędnych za pomocą Google Earth, a nie Google Maps, spowoduje powstanie marginesu błędu wynoszącego do kilku metrów.
  • Przejdź do lokalizacji fizycznej

Użyj Map Google

Aby uzyskać współrzędne geograficzne lokalizacji w Mapach Google:

  1. Otwórz Mapy Google na komputerze.

  2. Wybierz Warstwy > Więcej.

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

    Wymusi to widok z perspektywy 2D i wyeliminuje możliwe błędy, które mogą być spowodowane pod kątem widoku 3D.

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

Korzystanie z Google Earth

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

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

  1. Otwórz Google Earth na komputerze stacjonarnym.

  2. Kliknij menu hamburgera  i wybierz Styl mapy.

  3. Przesuń przełącznik Budynki 3D, aby go wyłączyć.

  4. Po wyłączeniu przełącznika Budynki 3D kliknij ikonę szpilki , aby dodać punkt na mapie w wybranej lokalizacji.

  5. Określ projekt, w którym chcesz umieścić 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 zawiera informacje o szerokości geograficznej, długości geograficznej i wysokości znaku geograficznego 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.

Pobieranie kwaterniony 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 wschodnia-góra-północ (EUS) na układ współrzędnych wschodnia-góra-północ (EUS). X+ punkty na wschód, Y+ punkty w górę i Z+ punkty 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. Opiera się na przekształceniu i orientacji, które musi zostać umiejscowiony w świecie rzeczywistym. 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 obrotu kwateranionowego.

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.

Umieszczenie punktu odniesienia WGS84 w świecie rzeczywistym

Określanie wysokości lokalizacji

Istnieje kilka sposobów na określenie wysokości lokalizacji na potrzeby umieszczania punktów kotwiczenia:

  • Jeśli lokalizacja kotwicy znajduje się fizycznie blisko użytkownika, możesz użyć wysokości podobnej do wysokości urządzenia użytkownika.
  • Gdy poznasz długość i szerokość geograficzną, użyj interfejsu Elevation API, aby uzyskać wysokość na podstawie specyfikacji EGM96. Aby porównać wysokość z wysokością GARGeospatialTransform, musisz przekonwertować wysokość w interfejsie API Map Google EGM96 na WGS84. Zapoznaj się z narzędziem GeoidEval, które ma zarówno interfejs wiersza poleceń, jak i interfejs HTML. Interfejs Maps API domyślnie podaje szerokość i długość geograficzną zgodnie ze specyfikacją WGS84.
  • Szerokość geograficzną, długość geograficzną i wysokość lokalizacji możesz sprawdzić w Google Earth. To da Ci margines błędu do kilku metrów. W pliku KML używaj współrzędnych geograficznych i wysokości z tagów <coordinates>, nie z tagów <LookAt>.
  • Jeśli istniejąca kotwica jest w pobliżu i nie znajdujesz się na stromym zboczu, możesz użyć wysokości z GARGeospatialTransform kamery bez korzystania z innego źródła, takiego jak interfejs Maps API.

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 do terenu

Kotwica terenu to rodzaj kotwicy, która umożliwia umieszczanie obiektów AR za pomocą tylko szerokości i długości geograficznej, wykorzystując informacje z VPS do określenia dokładnej wysokości nad poziomem morza.

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

Wyniki na płaszczyźnie są opcjonalne i nie są wymagane do korzystania z reklam zakotwiczonych. Pamiętaj, że używane są tylko płaszczyzny poziome. Płaszczyzny poziome pomogą w dynamicznym dopasowywaniu punktów kotwiczenia terenu do podłoża.

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

Tworzenie kotwicy 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

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

Stan Opis
GARFutureStatePending Operacja jest nadal w toku.
GARFutureStateDone Operacja została zakończona i wyniki są dostępne.
GARFutureStateCancelled Operacja została anulowana.

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

Wartość GARTerrainAnchorState należy do operacji asynchronicznej i jest częścią końcowego wyniku 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

Dachowe punkty kotwiczenia to rodzaj punktu kotwiczenia i są bardzo podobne do punktów kotwiczenia na terenie. 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

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

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 w 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];

Sprawdzanie stanu przyszłości

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

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

Wartość GARRooftopAnchorState należy do operacji asynchronicznej i jest częścią końcowego wyniku 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?