API-интерфейсы Streetscape Geometry предоставляют геометрию местности, зданий или других структур в сцене. Геометрию можно использовать для окклюзии, рендеринга или размещения AR-контента с помощью API-интерфейсов проверки попадания. Данные Streetscape Geometry получены с помощью изображений Google Street View.
Попробуйте образец
Пример приложения geospatial_java демонстрирует, как получить и визуализировать геометрию Streetscape.
Настройте геопространственный API
Чтобы использовать Streetscape Geometry, вам необходимо настроить Geospatial API в своем проекте. Следуйте инструкциям по включению Geospatial API, чтобы настроить Geospatial API.
Включить геометрию уличного пейзажа
Geospatial API получает данные Streetscape Geometry, когда для GeospatialMode
установлено значение GeospatialMode.ENABLED
, а StreetscapeGeometryMode
установлено значение StreetscapeGeometryMode.ENABLED
.
Ява
Config config = session.getConfig(); // Streetscape Geometry requires the Geospatial API to be enabled. config.setGeospatialMode(Config.GeospatialMode.ENABLED); // Enable Streetscape Geometry. config.setStreetscapeGeometryMode(Config.StreetscapeGeometryMode.ENABLED); session.configure(config);
Котлин
session.configure( session.config.apply { // Streetscape Geometry requires the Geospatial API to be enabled. geospatialMode = Config.GeospatialMode.ENABLED // Enable Streetscape Geometry. streetscapeGeometryMode = Config.StreetscapeGeometryMode.ENABLED } )
Получите геометрию Streetscape в сеансе ARCore
ИспользуйтеSession.getAllTrackables()
и StreetscapeGeometry.class
для фильтрации результатов.Ява
session.getAllTrackables(StreetscapeGeometry.class);
Котлин
session.getAllTrackables(StreetscapeGeometry::class.java)
Понимание StreetscapeGeometry
StreetscapeGeometry
содержит информацию о здании:
-
StreetscapeGeometry.getType()
Идентифицирует StreetscapeGeometry как местность или здание. -
StreetscapeGeometry.getMesh()
Получите полигональнуюMesh
, соответствующую этой местности или зданию. -
StreetscapeGeometry.getMeshPose()
Описывает происхождение геометрии. Все точкиMesh
должны быть преобразованы с помощьюStreetscapeGeometry.getMeshPose()
. -
StreetscapeGeometry.getQuality()
Обеспечивает качество данных сетки. Уровни детализации описаны в стандарте CityGML 2.0 .
Здание ЛОД 1
StreetscapeGeometry.Quality.BUILDING_LOD_1
состоит из контуров зданий, вытянутых вверх до плоской вершины. Высота здания может быть неточной.
Здание ЛОД 2
StreetscapeGeometry.Quality.BUILDING_LOD_2
будет иметь геометрию более высокой точности. Сетчатые стены и крыши будут более точно соответствовать форме здания. Меньшие элементы, такие как дымоходы или вентиляционные отверстия на крыше, все равно могут выступать за пределы сетки.
Понимание Mesh
Mesh
— это полигональная сетка, представляющая поверхностную реконструкцию геометрии уличного пейзажа. Каждая Mesh
включает в себя буфер вершин и буфер индексов:
-
Mesh.getVertexListSize()
Получает количество вершин в этой сетке. -
Mesh.getVertexList()
Получите объединенные позиции вершин сетки в координатах относительноStreetscapeGeometry.getMeshPose()
. -
Mesh.getIndexListSize()
Получает количество индексов в этой сетке. -
Mesh.getIndexList()
Получите индексы вершин, составляющих грань.
Прикрепите контент AR к StreetscapeGeometry
Есть два способа прикрепить AR-контент к Streetscape Geometry:- Включите геопространственную глубину и используйте проверку глубины . Это рекомендуемый и более простой метод.
- Используйте
Trackable.createAnchor()
для создания привязки в заданной позе, прикрепленной кStreetscapeGeometry
. Этот якорь унаследует свое состояние отслеживания от родительскогоStreetscapeGeometry
.
Выполните проверку попадания в StreetscapeGeometry
Frame.hitTest()
можно использовать для проверки соответствия геометрии Streetscape. Если пересечения найдены, HitResult
содержит информацию о позе места удара, а также ссылку на StreetscapeGeometry
, в который был нанесен удар. Эту геометрию Streetscape можно передать в Trackable.createAnchor()
, чтобы создать прикрепленную к ней якорь.
Ява
for (HitResult hit : frame.hitTest(singleTapEvent)) { if (hit.getTrackable() instanceof StreetscapeGeometry) { Pose hitPose = hit.getHitPose(); hit.getTrackable().createAnchor(hitPose); } }
Котлин
for (hit in frame.hitTest(singleTapEvent)) { if (hit.trackable is StreetscapeGeometry) { val hitPose = hit.hitPose hit.trackable.createAnchor(hitPose) } }
Включить геопространственную глубину
Geospatial Depth сочетает в себе геометрию уличного пейзажа с данными местных датчиков для улучшения данных о глубине. Когда геопространственная глубина включена, выходные изображения глубины и необработанные изображения глубины изменяются, чтобы включать в себя растровую геометрию уличного пейзажа в дополнение к локально наблюдаемой глубине. Это может повысить точность поз с использованием глубины.