Используйте здания и местность вокруг себя в Unity

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 содержит информацию о здании:

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