Streetscape Geometry API menyediakan geometri medan, bangunan, atau struktur lainnya dalam sebuah tampilan. Geometri dapat digunakan untuk oklusi, rendering, atau menempatkan konten AR melalui hit-test API. Data Streetscape Geometry diperoleh melalui gambar Google Street View.
Mencoba contoh
Aplikasi contoh Geospasial menunjukkan cara mendapatkan dan merender Streetscape Geometry.
Menyiapkan Geospatial API
Untuk menggunakan Streetscape Geometry, Anda harus menyiapkan Geospatial API di project. Ikuti petunjuk di Mengaktifkan Geospatial API untuk menyiapkan Geospatial API.
Mengaktifkan Streetscape Geometry
Geospatial API memperoleh data Streetscape Geometry saat GeospatialMode
ditetapkan ke GeospatialMode.Enabled
dan StreetscapeGeometryMode
ditetapkan ke StreetscapeGeometryMode.Enabled
.
Mendapatkan Streetscape Geometry dalam sesi ARCore
Tambahkan komponenARStreetscapeGeometryManager
ke GameObject
. Saat Geometri Streetscape 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
Mendapatkan poligonMesh
yang sesuai dengan medan atau bangunan ini. -
ARStreetscapeGeometry.quality
Memberikan kualitas data mesh. Tingkat detail dijelaskan dalam standar CityGML 2.0.
Membangun LOD 1
BuildingLOD1
terdiri dari jejak bangunan yang diekstrusi ke atas hingga bagian atasnya datar. Ketinggian bangunan mungkin tidak akurat.
Membangun LOD 2
BuildingLOD2
akan memiliki geometri fidelitas yang lebih tinggi. Dinding dan atap mesh akan lebih cocok dengan bentuk bangunan. Fitur yang lebih kecil seperti cerobong asap atau ventilasi atap mungkin masih menembus di luar mesh.
Memahami Mesh
Mesh
adalah mesh poligon yang mewakili rekonstruksi permukaan Streetscape Geometry.
Lihat Mesh
dan MeshRenderer
. Perhatikan bahwa 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 vertex di ARStreetscapeGeometry.mesh
. Anchor ini akan mewarisi status pelacakannya dari ARStreetscapeGeometry
induk.
Melakukan hit-test terhadap ARStreetscapeGeometry
ARRaycastManagerExtensions.RaycastStreetscapeGeometry
dapat digunakan untuk melakukan hit-test terhadap Streetscape Geometry. Jika persimpangan ditemukan, XRRaycastHit
akan berisi informasi pose tentang lokasi hit serta referensi ke ARStreetscapeGeometry
yang dihit. Streetscape Geometry ini dapat diteruskan ke ARAnchorManager.AddAnchor()
untuk membuat anchor yang terpasang padanya.
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 kualitas data kedalaman. Saat Geospatial Depth diaktifkan, kedalaman output dan gambar kedalaman mentah diubah untuk menyertakan Streetscape Geometry yang dirasterkan selain kedalaman yang diamati secara lokal. Tindakan ini dapat meningkatkan akurasi pose menggunakan Depth.