Menggunakan bangunan dan medan di sekitar Anda di Unity

Streetscape Geometry API menyediakan geometri medan, bangunan, atau struktur lain dalam sebuah pemandangan. Geometri ini dapat digunakan untuk oklusi, rendering, atau penempatan konten AR melalui API hit-test. Data Streetscape Geometry diperoleh melalui gambar Google Street View.

Coba sampel

Aplikasi contoh Geospatial menunjukkan cara mendapatkan dan merender Streetscape Geometries.

Menyiapkan Geospatial API

Untuk menggunakan Streetscape Geometry, Anda harus menyiapkan Geospatial API di project Anda. Ikuti petunjuk tentang cara Mengaktifkan Geospatial API untuk menyiapkan Geospatial API.

Mengaktifkan Streetscape Geometry

Geospatial API memperoleh data Streetscape Geometry jika GeospatialMode ditetapkan ke GeospatialMode.Enabled dan StreetscapeGeometryMode ditetapkan ke StreetscapeGeometryMode.Enabled.

Mendapatkan Streetscape Geometry dalam sesi ARCore

Tambahkan komponen ARStreetscapeGeometryManager ke GameObject. Kapan Streetscape Geometries 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:

LOD Bangunan 1

BuildingLOD1 terdiri dari jejak bangunan yang diekstrusi ke atas hingga datar. Tinggi bangunan mungkin tidak akurat.

LOD Bangunan 2

BuildingLOD2 akan memiliki geometri fidelitas lebih tinggi. Dinding dan atap mesh akan lebih cocok dengan bentuk bangunan. Fitur yang lebih kecil seperti cerobong asap atau ventilasi atap mungkin masih menyembul ke luar mesh.

Memahami Mesh

Mesh adalah mesh poligon yang merepresentasikan 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 verteks di ARStreetscapeGeometry.mesh. Anchor ini akan mewarisi status pelacakannya dari ARStreetscapeGeometry induk.

Menjalankan hit-test terhadap ARStreetscapeGeometry

ARRaycastManagerExtensions.RaycastStreetscapeGeometry dapat digunakan untuk hit-test terhadap Streetscape Geometry. Jika persimpangan ditemukan, XRRaycastHit berisi informasi pose tentang lokasi hit serta referensi ke ARStreetscapeGeometry yang hit. 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);
  }
}

Aktifkan Geospatial Depth

Geospatial Depth menggabungkan Streetscape Geometry dengan input sensor lokal untuk meningkatkan kualitas data kedalaman. Jika Geospatial Depth diaktifkan, gambar kedalaman output dan raw depth dimodifikasi untuk menyertakan Streetscape Geometry yang diraster, selain kedalaman yang diamati secara lokal. Tindakan ini dapat meningkatkan akurasi pose menggunakan Kedalaman.