Interfejsy Streetscape Geometry API zapewniają geometrię terenu, budynków i innych obiektów w scenie. Geometrii można używać do przesłonięcia, renderowania i umieszczania treści AR za pomocą interfejsów API do testów trafień. Dane geometryczne Streetscape uzyskuje się ze zdjęć Google Street View.
Zobacz fragment
Przykładowa aplikacja do geoprzestrzeni pokazuje, jak uzyskać i wyrenderować geometrie Streetscape.
Konfigurowanie interfejsu Geospatial API
Aby korzystać z funkcji Streetscape Geometry, musisz skonfigurować w projekcie interfejs Geospatial API. Aby skonfigurować interfejs Geospatial API, postępuj zgodnie z instrukcjami włączania interfejsu Geospatial API.
Włącz geometrię Streetscape
Interfejs Geospatial API pobiera dane Streetscape Geometry, gdy GeospatialMode
ma wartość GeospatialMode.Enabled
, a StreetscapeGeometryMode
jest ustawiona na StreetscapeGeometryMode.Enabled
.
Uzyskiwanie geometrii Streetscape w sesji ARCore
Dodaj komponentARStreetscapeGeometryManager
do elementu GameObject
. Kiedy
Geometrie Streetscape są dodawane, aktualizowane lub usuwane, a potem wywoływane jest zdarzenie ARStreetscapeGeometryManager.StreetscapeGeometriesChanged
.
public Material streetscapeGeometryMaterial;
List<ARStreetscapeGeometry> _addedStreetscapeGeometries = new List<ARStreetscapeGeometry>();
List<ARStreetscapeGeometry> _updatedStreetscapeGeometries = new List<ARStreetscapeGeometry>();
List<ARStreetscapeGeometry> _removedStreetscapeGeometries = new List<ARStreetscapeGeometry>();
public void OnEnable()
{
StreetscapeGeometryManager.StreetscapeGeometriesChanged +=
GetStreetscapeGeometry;
}
public void Update() {
foreach (ARStreetscapeGeometry streetscapegeometry in _addedStreetscapeGeometries)
{
GameObject renderObject = new GameObject(
"StreetscapeGeometryMesh", typeof(MeshFilter), typeof(MeshRenderer));
if (renderObject)
{
renderObject.transform.position = streetscapegeometry.pose.position;
renderObject.transform.rotation = streetscapegeometry.pose.rotation;
renderObject.GetComponent<MeshFilter>().mesh = streetscapegeometry.mesh;
renderObject.GetComponent<MeshRenderer>().material = streetscapeGeometryMaterial;
}
}
}
public void OnDisable()
{
StreetscapeGeometryManager.StreetscapeGeometriesChanged -=
GetStreetscapeGeometry;
}
private void GetStreetscapeGeometry(ARStreetscapeGeometriesChangedEventArgs eventArgs)
{
_addedStreetscapeGeometries = eventArgs.Added;
_updatedStreetscapeGeometries = eventArgs.Updated;
_removedStreetscapeGeometries = eventArgs.Removed;
}
Informacje o ARStreetscapeGeometry
ARStreetscapeGeometry
zawiera informacje o budynku:
-
ARStreetscapeGeometry.streetscapeGeometryType
Identyfikuje obiekt StreetscapeGeometry jako teren lub budynek. -
ARStreetscapeGeometry.mesh
Znajdź wielokątMesh
odpowiadający temu terenowi lub budynku. -
ARStreetscapeGeometry.quality
Zapewnia jakość danych sieci typu mesh. Poziomy szczegółowości znajdziesz w standardzie CityGML 2.0.
Budynek – LOD 1
BuildingLOD1
to kontury budynków rozciągnięte w górę na płaskie dach. Wysokość budynków może być niedokładna.
Budynek LOD 2
BuildingLOD2
będzie mieć wyższą dokładność geometrii. Ściany z siatki i dachy będą lepiej dopasowane do kształtu budynku. Mniejsze elementy, takie jak kominy czy otwory dachowe, mogą nadal pojawiać się na zewnątrz siatki.
Informacje o Mesh
Mesh
to wielokątna siatka reprezentująca zrekonstruowaną powierzchnię geometrii Streetscape.
Zobacz Mesh
i MeshRenderer
. Pamiętaj, że normy nie są obliczane domyślnie.
zobacz Mesh.RecalculateNormals()
, aby je obliczyć.
Załączanie treści AR do ARStreetscapeGeometry
Użyj narzędzia ARAnchorManager.AddAnchor()
, aby utworzyć reklamę zakotwiczoną w danej pozycji przy wierzchołkach komponentu ARStreetscapeGeometry.mesh
. Ta kotwica odziedziczy stan śledzenia z elementu nadrzędnego ARStreetscapeGeometry
.
Przeprowadź test trafień na ARStreetscapeGeometry
ARRaycastManagerExtensions.RaycastStreetscapeGeometry
może służyć do testowania trafień pod kątem geometrii Streetscape. Po znalezieniu przecięć parametr XRRaycastHit
zawiera informacje o położeniu dotyczące lokalizacji działania oraz odwołanie do trafienia ARStreetscapeGeometry
. Tę geometrię Streetscape można przekazać do obiektu ARAnchorManager.AddAnchor()
, aby utworzyć dołączoną do niej kotwicę.
Vector2 screenTapPosition = Input.GetTouch(0).position;
List<XRRaycastHit> hitResults = new List<XRRaycastHit>();
if (RaycastManager.RaycastStreetscapeGeometry(screenTapPosition, ref hitResults)){
ARStreetscapeGeometry streetscapegeometry =
StreetscapeGeometryManager.GetStreetscapeGeometry(hitResults[0].trackableId);
if (streetscapegeometry != null)
{
ARAnchor anchor = StreetscapeGeometryManager.AttachAnchor(streetscapegeometry, hitResults[0].pose);
}
}
Włącz głębię geoprzestrzenną
Głębokość geoprzestrzenna łączy geometrię Streetscape z lokalnym czujnikiem w celu ulepszenia danych o głębi. Gdy włączona jest funkcja Głębokość geoprzestrzenna, Obrazy głębi wyjściowej i nieprzetworzonej głębi są modyfikowane tak, by oprócz lokalnie obserwowanej głębi uwzględnić zrasteryzowaną geometrię Streetscape. Może to poprawić dokładność pozycji z wykorzystaniem głębi.