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 сочетает в себе геометрию уличного пейзажа с данными местных датчиков для улучшения данных о глубине. Когда геопространственная глубина включена, выходные изображения глубины и необработанные изображения глубины изменяются, чтобы включать растровую геометрию уличного пейзажа в дополнение к локально наблюдаемой глубине. Это может повысить точность поз с использованием глубины.