Unity'de etrafınızdaki bina ve arazileri kullanın

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, gölgelendirmek veya gizlemek için kullanılabilir. Sokak Görünümü Geometrisi verileri, Google Street View görüntüleri aracılığıyla elde edilir.

Örneği deneyin

Coğrafi örnek uygulama, sokak manzarası geometrilerinin nasıl elde edilip oluşturulacağını gösterir.

Coğrafi API'yi ayarlama

Cadde Manzarası 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.

Cadde 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

Bir GameObject'a ARStreetscapeGeometryManager bileşeni ekleyin. Streetscape Geometries 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ındaki bilgileri içerir:

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 kaliteli geometriye sahiptir. Örgü duvarlar ve çatılar, binanın şekline daha uygun olur. Bacalar veya çatı havalandırmaları gibi küçük özellikler yine de 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.

ARStreetscapeGeometry'a AR içeriği 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 öğe ARStreetscapeGeometry'den devralır.

ARStreetscapeGeometry ile isabet testi yapın

ARRaycastManagerExtensions.RaycastStreetscapeGeometry, Streetscape Geometrisi ile isabet testi yapmak için kullanılabilir. Kesişimler bulunursa XRRaycastHit, isabet edilen konumla ilgili poz bilgilerinin yanı sıra isabet edilen ARStreetscapeGeometry'e referans içerir. Bu Streetscape Geometrisi, kendisine bağlı bir ankraj oluşturmak için ARAnchorManager.AddAnchor()'a 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 Sokak Görünümü Geometrisi ile yerel sensör girişini 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.