Streetscape Geometry API menyediakan geometri medan, bangunan, atau struktur lain dalam adegan. Geometri dapat digunakan untuk oklusi, rendering, atau penempatan konten AR melalui API hit-test. Data Streetscape Geometry diperoleh melalui citra Google Street View.
Coba sampel
Aplikasi contoh Geospasial menunjukkan cara mendapatkan dan merender Streetscape Geometri.
Menyiapkan Geospatial API
Untuk menggunakan Streetscape Geometry, Anda harus menyiapkan Geospatial API dalam project. Ikuti petunjuk tentang Mengaktifkan Geospatial API untuk menyiapkan Geospatial API.
Aktifkan Streetscape Geometry
Geospatial API mendapatkan data Streetscape Geometry jika GeospatialMode
disetel ke GeospatialMode.Enabled
dan StreetscapeGeometryMode
disetel ke StreetscapeGeometryMode.Enabled
.
Mendapatkan Streetscape Geometry dalam sesi ARCore
Tambahkan komponenARStreetscapeGeometryManager
ke GameObject
. Saat
Streetscape Geometri ditambahkan, diperbarui, atau dihapus, peristiwa ARStreetscapeGeometryManager.StreetscapeGeometriesChanged
akan dipicu.
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;
}
Memahami ARStreetscapeGeometry
ARStreetscapeGeometry
berisi informasi tentang bangunan:
-
ARStreetscapeGeometry.streetscapeGeometryType
Mengidentifikasi StreetscapeGeometry sebagai medan atau bangunan. -
ARStreetscapeGeometry.mesh
Dapatkan poligonMesh
yang sesuai dengan medan atau bangunan ini. -
ARStreetscapeGeometry.quality
Memberikan kualitas data mesh. Tingkat detail dijelaskan dalam standar CityGML 2.0.
LOD bangunan 1
BuildingLOD1
terdiri dari jejak bangunan yang diekstrusi ke atas hingga datar. Tinggi bangunan mungkin tidak akurat.
LOD 2 bangunan
BuildingLOD2
akan memiliki geometri fidelitas yang lebih tinggi. Dinding dan atap jaring akan lebih mendekati bentuk bangunan. Bagian yang lebih kecil seperti cerobong atau ventilasi atap mungkin masih muncul di luar jaring.
Memahami Mesh
Mesh
adalah mesh poligon yang mewakili rekonstruksi permukaan Geometri Streetscape.
Lihat Mesh
dan MeshRenderer
. Perlu diketahui bahwa nilai normal tidak dihitung secara default;
lihat Mesh.RecalculateNormals()
untuk menghitungnya.
Melampirkan konten AR ke ARStreetscapeGeometry
Gunakan ARAnchorManager.AddAnchor()
untuk membuat anchor pada pose tertentu di dekat verteks di ARStreetscapeGeometry.mesh
. Anchor ini akan mewarisi status pelacakannya dari induk ARStreetscapeGeometry
.
Menjalankan hit-test terhadap ARStreetscapeGeometry
ARRaycastManagerExtensions.RaycastStreetscapeGeometry
dapat digunakan untuk hit-test terhadap Streetscape Geometry. Jika ditemukan persimpangan, XRRaycastHit
berisi informasi pose tentang lokasi hit serta referensi ke ARStreetscapeGeometry
yang dihasilkan. Streetscape Geometry ini dapat diteruskan ke ARAnchorManager.AddAnchor()
untuk membuat anchor yang dilampirkan.
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);
}
}
Mengaktifkan Geospatial Depth
Geospatial Depth menggabungkan Streetscape Geometry dengan input sensor lokal untuk meningkatkan data kedalaman. Jika Geospatial Depth diaktifkan, gambar kedalaman output dan kedalaman mentah akan dimodifikasi untuk menyertakan Streetscape Geometry raster selain kedalaman yang diamati secara lokal. Hal ini dapat meningkatkan akurasi pose menggunakan Depth.