Streetscape Geometri API'leri, bir sahnedeki arazi, bina veya diğer yapıların geometrisini sağlar. Geometri, isabet testi API'leri aracılığıyla AR içeriği yerleştirmek, gizlemek veya oluşturmak için kullanılabilir. Sokak Manzarası Geometrisi verileri, Google Street View görüntüleri aracılığıyla elde edilir.
Örneği deneyin
Coğrafi örnek uygulama, Streetscape geometrilerinin nasıl alınacağını ve oluşturulacağını gösterir.
Geospatial API'yi ayarlama
Sokak Görünümü Geometrisi'ni kullanmak için projenizde Coğrafi API'yi ayarlamanız gerekir. Geospatial API'yi ayarlamak için Geospatial API'yi etkinleştirme başlıklı makaledeki talimatları uygulayın.
Sokak Manzarası Geometrisini Etkinleştirme
Geospatial API, GeospatialMode
GeospatialMode.Enabled
ve StreetscapeGeometryMode
StreetscapeGeometryMode.Enabled
olarak ayarlandığında Streetscape Geometry verilerini alır.
ARCore oturumunda sokak manzarası geometrisini alma
BirGameObject
'a ARStreetscapeGeometryManager
bileşeni ekleyin. Cadde Manzarası Geometrileri eklendiğinde, güncellendiğinde veya kaldırıldığında ARStreetscapeGeometryManager.StreetscapeGeometriesChanged
etkinliği tetiklenir.
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
hakkında bilgi edinme
ARStreetscapeGeometry
, bir bina hakkında bilgi içerir:
-
ARStreetscapeGeometry.streetscapeGeometryType
StreetscapeGeometry'yi arazi veya bina olarak tanımlar. -
ARStreetscapeGeometry.mesh
Bu araziye veya binaya karşılık gelen bir poligonMesh
elde edin. -
ARStreetscapeGeometry.quality
Ağın kalitesini sağlar. Ayrıntı düzeyleri CityGML 2.0 standardında açıklanmıştır.
Bina LOD 1
BuildingLOD1
, düz bir üst yüzeye doğru yukarı doğru uzatılmış bina ayak izlerinden oluşur. Bina yükseklikleri doğru olmayabilir.
Bina LOD 2
BuildingLOD2
daha yüksek doğruluk oranına sahip geometriye sahiptir. Örgü duvarlar ve çatılar, binanın şekline daha uygun olur. Bacalar veya çatı havalandırmaları gibi daha küçük özellikler, ağın dışına çıkabilir.
Mesh
hakkında bilgi edinme
Mesh
, sokak manzarası geometrisinin yüzey yeniden yapılandırmasını temsil eden bir poligon örgüsüdür.
Mesh
ve MeshRenderer
başlıklı makaleleri inceleyin. Normallerin varsayılan olarak hesaplanmadığını unutmayın. Normalleri hesaplamak için Mesh.RecalculateNormals()
bölümüne bakın.
AR içeriğini ARStreetscapeGeometry
'a ekleme
ARStreetscapeGeometry.mesh
'teki köşe noktalarının yakınında belirli bir duruşta bir ankraj oluşturmak için ARAnchorManager.AddAnchor()
simgesini kullanın. Bu ankraj, izleme durumunu üst öğeden ARStreetscapeGeometry
devralır.
ARStreetscapeGeometry
ile isabet testi yapın
ARRaycastManagerExtensions.RaycastStreetscapeGeometry
, Streetscape geometrisine karşı isabet testi yapmak için kullanılabilir. Kesişimler bulunursa XRRaycastHit
, isabet edilen konumla ilgili poz bilgilerinin yanı sıra isabet edilen ARStreetscapeGeometry
öğesine referans içerir. Bu Streetscape Geometrisi, kendisine bağlı bir ankraj oluşturmak için ARAnchorManager.AddAnchor()
öğesine iletilebilir.
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);
}
}
Coğrafi Derinlik'i etkinleştirme
Coğrafi Derinlik, derinlik verilerini iyileştirmek için Streetscape Geometrisini yerel sensör girişiyle birleştirir. Coğrafi Derinlik etkinleştirildiğinde, çıkış derinliği ve ham derinlik resimleri, yerel olarak gözlemlenen derinliğe ek olarak rasterleştirilmiş sokak manzarası geometrisini içerecek şekilde değiştirilir. Bu, derinlik özelliğini kullanarak pozların doğruluğunu artırabilir.