Usar edifícios e terrenos ao seu redor no Unity

As APIs Streetscape Geometry fornecem a geometria do terreno, edifícios ou outras estruturas em uma cena. A geometria pode ser usada para oclusão, renderização ou colocação de conteúdo de RA por meio de APIs de teste de hit. Os dados do Streetscape Geometry são obtidos por meio de imagens do Google Street View.

Testar o exemplo

O app de exemplo Geospatial demonstra como receber e renderizar geometrias do Streetscape.

Configurar a API Geospatial

Para usar o Streetscape Geometry, você precisará configurar a API Geospatial no seu projeto. Siga as instruções em Como ativar a API Geospatial para configurar a API Geospatial.

Ativar Streetscape Geometry

A API Geospatial recebe os dados do Streetscape Geometry quando GeospatialMode está definido como GeospatialMode.Enabled e StreetscapeGeometryMode está definido como StreetscapeGeometryMode.Enabled.

Obter Streetscape Geometry em uma sessão do ARCore

Adicione um componente ARStreetscapeGeometryManager a um GameObject. Quando Geometrias do Streetscape são adicionadas, atualizadas ou removidas, o evento ARStreetscapeGeometryManager.StreetscapeGeometriesChanged é acionado.

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;
}

Entender o ARStreetscapeGeometry

ARStreetscapeGeometry contém informações sobre uma construção:

Edifício LOD 1

BuildingLOD1 consiste em plantas extruídas para cima até um topo plano. A altura das construções pode estar incorreta.

Edifício LOD 2

BuildingLOD2 terá uma geometria de maior fidelidade. Paredes e telhados de malha vão se aproximar mais do formato do edifício. Recursos menores, como chaminés ou aberturas no telhado, ainda podem sair da rede mesh.

Entender o Mesh

Mesh é uma malha de polígonos que representa uma reconstrução de superfície do Streetscape Geometry. Consulte Mesh e MeshRenderer. Os valores normais não são calculados por padrão. consulte Mesh.RecalculateNormals() para fazer o cálculo.

Anexar conteúdo de RA a um ARStreetscapeGeometry

Use ARAnchorManager.AddAnchor() para criar uma âncora em uma determinada posição perto de vértices no ARStreetscapeGeometry.mesh. Esta âncora herdará o estado de acompanhamento do ARStreetscapeGeometry pai.

Executar um teste de hit em ARStreetscapeGeometry

ARRaycastManagerExtensions.RaycastStreetscapeGeometry pode ser usado para fazer um teste de hit em relação ao Streetscape Geometry. Se houver cruzamentos, XRRaycastHit conterá informações de pose sobre o local do hit, bem como uma referência ao ARStreetscapeGeometry que foi atingido. Esse Streetscape Geometry pode ser transmitido a ARAnchorManager.AddAnchor() para criar uma âncora anexada a ele.

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);
  }
}

Ativar profundidade geoespacial

A profundidade geoespacial combina a geometria Streetscape Geometry. com entrada de sensor local para aprimorar os dados de profundidade. Quando a opção "Geospatial Depth" está ativada, a profundidade de saída e as imagens de profundidade bruta são modificadas para incluir a imagem rasterizada Streetscape Geometry, além da profundidade observada localmente. Isso pode melhorar a precisão das poses usando a Profundidade.