
API-интерфейсы Streetscape Geometry предоставляют геометрию местности, зданий или других структур в сцене. Геометрию можно использовать для окклюзии, рендеринга или размещения AR-контента с помощью API-интерфейсов проверки попадания. Данные Streetscape Geometry получены с помощью изображений Google Street View.
Попробуйте образец
Пример приложения Geospatial демонстрирует, как получить и визуализировать геометрию Streetscape.
Настройте геопространственный API
Чтобы использовать Streetscape Geometry, вам необходимо настроить Geospatial API в своем проекте. Следуйте инструкциям по включению Geospatial API , чтобы настроить Geospatial API.
Включить геометрию уличного пейзажа
Geospatial API получает данные Streetscape Geometry, когда для GeospatialMode установлено значение GeospatialMode.Enabled , а для StreetscapeGeometryMode установлено значение StreetscapeGeometryMode.Enabled .

Получите геометрию Streetscape в сеансе ARCore
Добавьте компонентARStreetscapeGeometryManager в GameObject . При добавлении, обновлении или удалении геометрии Streetscape запускается событие 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;
}
Понимание ARStreetscapeGeometry
ARStreetscapeGeometry содержит информацию о здании:
-
ARStreetscapeGeometry.streetscapeGeometryType
Идентифицирует StreetscapeGeometry как местность или здание. -
ARStreetscapeGeometry.mesh
Получите полигональнуюMesh, соответствующую этой местности или зданию. -
ARStreetscapeGeometry.quality
Обеспечивает качество данных сетки. Уровни детализации описаны в стандарте CityGML 2.0 .
Здание ЛОД 1
BuildingLOD1 состоит из контуров зданий, вытянутых вверх до плоской вершины. Высота здания может быть неточной.

Здание ЛОД 2
BuildingLOD2 будет иметь более точную геометрию. Сетчатые стены и крыши будут более точно соответствовать форме здания. Меньшие элементы, такие как дымоходы или вентиляционные отверстия на крыше, все еще могут выступать за пределы сетки.

Понимание Mesh
Mesh — это полигональная сетка, представляющая поверхностную реконструкцию геометрии уличного пейзажа. См. Mesh и MeshRenderer . Обратите внимание, что нормали не рассчитываются по умолчанию; см. Mesh.RecalculateNormals() , чтобы вычислить их.
Прикрепите контент AR к ARStreetscapeGeometry
Используйте ARAnchorManager.AddAnchor() для создания привязки в заданной позе рядом с вершинами в ARStreetscapeGeometry.mesh . Этот якорь унаследует свое состояние отслеживания от родительского ARStreetscapeGeometry . Выполните проверку попадания по ARStreetscapeGeometry
ARRaycastManagerExtensions.RaycastStreetscapeGeometry можно использовать для проверки соответствия геометрии Streetscape. Если пересечения обнаружены, XRRaycastHit содержит информацию о положении места попадания, а также ссылку на ARStreetscapeGeometry , в который было совершено попадание. Эту геометрию Streetscape можно передать в ARAnchorManager.AddAnchor() чтобы создать прикрепленную к ней якорь.
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);
}
}
Включить геопространственную глубину
Geospatial Depth сочетает в себе геометрию уличного пейзажа с данными местных датчиков для улучшения данных о глубине. Когда геопространственная глубина включена, выходные изображения глубины и необработанные изображения глубины изменяются, чтобы включать в себя растровую геометрию уличного пейзажа в дополнение к локально наблюдаемой глубине. Это может повысить точность поз с использованием глубины.