As APIs Streetscape Geometry oferecem a geometria do terreno, dos edifícios ou de outras estruturas em uma cena. A geometria pode ser usada para oclusão, renderização ou colocação de conteúdo de RA com APIs de teste de hit. Os dados da geometria do Streetscape 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 a geometria do Streetscape, é necessário configurar a API Geospatial no seu projeto. Siga as instruções em Como ativar a API Geospatial para configurar a API Geospatial.
Ativar geometria da paisagem urbana
A API Geospatial acessa dados de geometria do Streetscape quando GeospatialMode
é definido como GeospatialMode.Enabled
e StreetscapeGeometryMode
está definido como StreetscapeGeometryMode.Enabled
.
Conseguir a geometria do Streetscape em uma sessão do ARCore
Adicione um componenteARStreetscapeGeometryManager
a um GameObject
. Quando as geometrias da paisagem urbana 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 um edifício:
-
ARStreetscapeGeometry.streetscapeGeometryType
Identifica a StreetscapeGeometry como terreno ou edifício. -
ARStreetscapeGeometry.mesh
Extraia um polígonoMesh
que corresponda a esse terreno ou edifício. -
ARStreetscapeGeometry.quality
Fornece a qualidade dos dados da malha. Os níveis de detalhamento são descritos no padrão CityGML 2.0.
Construção LOD 1
O BuildingLOD1
consiste na construção de plantações deslocadas para cima em direção a um topo plano. A altura das construções pode ser imprecisa.
Construção LOD 2
BuildingLOD2
terá geometria de maior fidelidade. As paredes e os telhados de malha combinarão melhor com a forma do edifício. Recursos menores, como chaminés ou saídas de ventilação, ainda podem furar para fora da malha.
Entender o Mesh
Mesh
é uma malha de polígonos que representa uma reconstrução de superfície da geometria da paisagem urbana.
Consulte Mesh
e MeshRenderer
. Os normais não são calculados por padrão. Consulte Mesh.RecalculateNormals()
para calculá-los.
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
. Essa âncora vai herdar o estado de rastreamento do ARStreetscapeGeometry
pai.
Realize um teste de hit no ARStreetscapeGeometry
ARRaycastManagerExtensions.RaycastStreetscapeGeometry
pode ser usado para fazer teste de hit com a geometria do Streetscape. Se cruzamentos forem encontrados, XRRaycastHit
vai conter informações de poses sobre o local do hit, bem como uma referência à ARStreetscapeGeometry
que foi atingida. Essa geometria da paisagem urbana pode ser transmitida a ARAnchorManager.AddAnchor()
para criar uma âncora anexada a ela.
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 do Streetscape com a entrada de sensor local para melhorar os dados de profundidade. Quando a profundidade geoespacial está ativada, as imagens de profundidade de saída e de profundidade bruta são modificadas para incluir a geometria rasterizada do Streetscape, além da profundidade observada localmente. Isso pode melhorar a precisão das poses usando a Profundidade.