Kotwice geoprzestrzenne to typ kotwic, które umożliwiają umieszczanie treści 3D w świecie rzeczywistym.
Rodzaje kotwic geoprzestrzennych
Istnieją 3 typy kotwic geoprzestrzennych, które w różny sposób określają wysokość:
Reklamy zakotwiczone WGS84:
Reklamy zakotwiczone WGS84 pozwalają umieszczać treści 3D na dowolnej szerokości geograficznej, długości i wysokości.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 ziemi lub piętra, co jest znane przez VPS.Reklamy zakotwiczone dachowe:
Kotwice dachowe umożliwiają umieszczanie treści tylko na podstawie szerokości geograficznej długość geograficzna i wysokość w odniesieniu do dachu budynku w danym miejscu. Wysokość jest określana w odniesieniu do szczytu budynku o znanej nazwie autor: Streetscape Geometry. Jeśli nie zostanie umieszczona na budynku, domyślnie będzie 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 dachów określonych przez Mapy Google |
Wymaga rozwiązania przez serwer? | Nie | Tak | Tak |
Wymagania wstępne
Zanim przejdziesz dalej, włącz interfejs Geospatial API.
Umieść kotwice geoprzestrzenne
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 działań
Kotwica geoprzestrzenna możesz też utworzyć na podstawie wyniku testu działań.
Zastosuj pozycję z testu działań i przekształć ją w GeospatialPose
. Służy do umieszczania dowolnego z 3 opisanych typów reklam zakotwiczonych.
Uchwyć pozycję geoprzestrzenną w pozycji AR
AREarthManager.Convert(Pose)
zapewnia dodatkowy sposób określania szerokości i długości geograficznej przez przekształcenie pozycji AR na pozycję geoprzestrzenną.
Uzyskaj pozę AR w pozycji geoprzestrzennej
AREarthManager.Convert(GeospatialPose)
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 pozycję AR w odniesieniu do współrzędnych świata GL.
Wybierz metodę odpowiednią do Twojego zastosowania
Każda metoda tworzenia reklamy zakotwiczonej wiąże się z korzyściami, o których trzeba pamiętać:
- Jeśli korzystasz z funkcji Geometria Streetscape, za pomocą testów zgodności dołączonych treści do budynku.
- Preferuj reklamy zakotwiczone terenu / dachu zamiast reklam zakotwiczonych WGS84, ponieważ korzystają z 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żna obliczyć na 3 sposoby:
- Korzystaj z Kreatora danych geoprzestrzennych, aby oglądać i wzbogacać świat za pomocą treści 3D bez konieczności fizycznego odwiedzania lokalizacji. Dzięki temu możesz wizualnie umieszczać wciągające treści 3D za pomocą Map Google w Edytorze Unity. Szerokość, długość geograficzna, obrót i wysokość treści zostaną obliczone automatycznie.
- Użyj Map Google
- Korzystanie z 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:
Otwórz Mapy Google na komputerze.
Przejdź do Warstwy > Więcej.
Zmień Typ mapy na Satelita i usuń zaznaczenie pola 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.
Kliknij lokalizację prawym przyciskiem myszy i wybierz długość lub szerokość geograficzną na mapie, aby skopiować ją 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:
Otwórz Google Earth na komputerze.
Przejdź do menu z hamburgerami
i wybierz Styl mapy.
Przesuń przełącznik Budynki 3D, aby go wyłączyć.
Po wyłączeniu przełącznika Budynki 3D kliknij ikonę pinezki
, aby dodać oznaczenie miejsca w wybranej lokalizacji.
Określ projekt, w którym chcesz umieścić oznaczenie miejsca, i kliknij Zapisz.
W polu Tytuł oznaczenia miejsca wpisz nazwę oznaczenia miejsca.
Kliknij strzałkę wstecz
w panelu projektu i wybierz menu
Więcej czynności.
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ą pozycję kamery, a nie lokalizację.
Przejdź do lokalizacji fizycznej
Możesz obliczyć wysokość lokalizacji, przychodząc do niej fizycznie i wykonując lokalne obserwacje.
Pobierz kwartion rotacji
GeospatialPose.EunRotation
wyodrębnia orientację z pozycji geoprzestrzennej i podaje kwartion reprezentujący macierz obrotu, która przekształca wektor z celu na układ współrzędnych wschód-up-północ (EUN). X+ punkty na wschód, Y+ w górę od grawitacji, a punkty Z+ na północ.
Kotwice 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. Jego umiejscowienie zależy od pozycji i orientacji, które musi znajdować się w świecie rzeczywistym. Pozycja składa się z szerokości, długości i wysokości nad poziomem morza, które są określone w układzie 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. Za podanie tych współrzędnych w przypadku każdej utworzonej kotwicy odpowiada Twoja aplikacja.
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.
- 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ą
GeospatialPose
, musisz przekonwertować wysokość w interfejsie API Map Google EGM96 na WGS84. Zobacz GeoidEval, który zawiera zarówno wiersz 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
GeospatialPose
bez korzystania z innego źródła, np. interfejsu API Map Google.
Tworzenie kotwicy
Po określeniu szerokości i długości geograficznej, wysokości i kwartionu obrotu użyj ARAnchorManagerExtensions.AddAnchor()
w celu zakotwiczenia treści
w określonych przez Ciebie współrzędnych geograficznych.
if (earthTrackingState == TrackingState.Tracking)
{
var anchor =
AnchorManager.AddAnchor(
latitude,
longitude,
altitude,
quaternion);
var anchoredAsset = Instantiate(GeospatialAssetPrefab, anchor.transform);
}
Kotwice terenu
Kotwica terenu to typ zakotwiczenia, 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 wpisywać żądaną wysokość, podaj wysokość nad poziomem terenu. Jeśli wartość wynosi zero, kotwica jest wyrównana z terenem.
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. Poziome płaszczyzny ułatwiają dynamiczne wyrównanie elementów kotwicy terenu do ziemi.
Pamiętaj, że na kotwice terenu mają wpływ właściwości Horizontal
i Horizontal | Vertical
Użyj menu Tryb wykrywania, aby ustawić tryb wykrywania:
Tworzenie kotwicy terenu za pomocą nowego interfejsu Async API
Aby utworzyć i umieścić reklamę zakotwiczoną terenu, wywołaj ARAnchorManagerExtensions.resolveAnchorOnTerrainAsync()
.
Reklama zakotwiczona nie będzie od razu gotowa i trzeba ją rozwiązać. Po rozwiązaniu problemu będzie on dostępny w ResolveAnchorOnTerrainPromise
.
public GameObject TerrainAnchorPrefab;
public void Update()
{
ResolveAnchorOnTerrainPromise terrainPromise =
AnchorManager.ResolveAnchorOnTerrainAsync(
latitude, longitude, altitudeAboveTerrain, eunRotation);
// The anchor will need to be resolved.
StartCoroutine(CheckTerrainPromise(terrainPromise));
}
private IEnumerator CheckTerrainPromise(ResolveAnchorOnTerrainPromise promise)
{
yield return promise;
var result = promise.Result;
if (result.TerrainAnchorState == TerrainAnchorState.Success &&
result.Anchor != null)
{
// resolving anchor succeeded
GameObject anchorGO = Instantiate(TerrainAnchorPrefab,
result.Anchor.gameObject.transform);
anchorGO.transform.parent = result.Anchor.gameObject.transform;
}
else
{
// resolving anchor failed
}
yield break;
}
Sprawdź stan obietnicy
Obietnica będzie mieć powiązany obiekt PromiseState
.
Stan | Opis |
---|---|
Pending |
Operacja jest nadal w toku. |
Done |
Operacja została zakończona i wyniki są dostępne. |
Cancelled |
Operacja została anulowana. |
Sprawdź stan kotwicy terenu dla wyniku obietnica
TerrainAnchorState
należy do operacji asynchronicznej i jest częścią ostatecznego wyniku Promise.
switch (result.TerrainAnchorState)
{
case TerrainAnchorState.Success:
// Anchor has successfully resolved
break;
case TerrainAnchorState.ErrorUnsupportedLocation:
// The requested anchor is in a location that isn't supported by the Geospatial API.
break;
case TerrainAnchorState.ErrorNotAuthorized:
// An error occurred while authorizing your app with the ARCore API. See
// https://developers.google.com/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#terrainanchorstate_errornotauthorized
// for troubleshooting steps.
break;
case TerrainAnchorState.ErrorInternal:
// The Terrain anchor could not be resolved due to an internal error.
break;
default:
break;
}
Kotwy dachowe
Kołki dachowe to rodzaj kotwic, które są bardzo podobne do podanych wyżej kotwic dachowych. Różnica polega na tym, że wysokość należy podać nad dachem, a nie nad poziomem terenu.
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ć reklamę zakotwiczoną na dachu, wywołaj ARAnchorManagerExtensions.resolveAnchorOnRooftopAsync()
. Podobnie jak w przypadku kotwicy terenu, będziesz też mieć dostęp do elementu PromiseState
obietnicy. Potem możesz sprawdzić wynik Promise, aby uzyskać dostęp do RooftopAnchorState
.
public GameObject RooftopAnchorPrefab;
public void Update()
{
ResolveAnchorOnRooftopPromise rooftopPromise =
AnchorManager.ResolveAnchorOnRooftopAsync(
latitude, longitude, altitudeAboveRooftop, eunRotation);
// The anchor will need to be resolved.
StartCoroutine(CheckRooftopPromise(rooftopPromise));
}
private IEnumerator CheckRooftopPromise(ResolveAnchorOnTerrainPromise promise)
{
yield return promise;
var result = promise.Result;
if (result.RooftopAnchorState == RooftopAnchorState.Success &&
result.Anchor != null)
{
// resolving anchor succeeded
GameObject anchorGO = Instantiate(RooftopAnchorPrefab,
result.Anchor.gameObject.transform);
anchorGO.transform.parent = result.Anchor.gameObject.transform;
}
else
{
// resolving anchor failed
}
yield break;
}
Sprawdź stan obietnicy
Z obietnicą będzie powiązany powiązany obiekt PromiseState
(patrz tabela powyżej).
Sprawdzanie stanu kotwicy Rooftop wyniku Promise
RooftopAnchorState
należy do operacji asynchronicznej i jest częścią ostatecznego wyniku Promise.
switch (result.RooftopAnchorState)
{
case TerrainAnchorState.Success:
// Anchor has successfully resolved
break;
case RooftopAnchorState.ErrorUnsupportedLocation:
// The requested anchor is in a location that isn't supported by the Geospatial API.
break;
case RooftopAnchorState.ErrorNotAuthorized:
// An error occurred while authorizing your app with the ARCore API. See
// https://developers.google.com/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#terrainanchorstate_errornotauthorized
// for troubleshooting steps.
break;
case RooftopAnchorState.ErrorInternal:
// The Rooftop anchor could not be resolved due to an internal error.
break;
default:
break;
}
Co dalej?
- Upewnij się, że znasz limit wykorzystania interfejsu API geoprzestrzenny.