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

Streetscape Geometry API'leri, bir sahnedeki arazinin, binaların veya diğer yapıların geometrisini sunar. Geometri; isabet testi API'leri aracılığıyla AR içeriğini kapamak, oluşturmak veya yerleştirmek için kullanılabilir. Streetscape Geometri verileri, Google Street View görüntüleri aracılığıyla elde edilir.

Örneği deneyin

Coğrafi mekansal örnek uygulama, Streetscape Geometris'lerinin nasıl alınacağını ve oluşturulduğunu gösterir.

Geospatial API'yi ayarlama

Streetscape Geometri'yi kullanmak için projenizde Geospatial API'yi ayarlamanız gerekir. Geospatial API'yi ayarlamak için Geospatial API'yi etkinleştirme bölümündeki talimatları uygulayın.

Streetscape Geometrisini Etkinleştir

Geospatial API, GeospatialMode GeospatialMode.Enabled ve StreetscapeGeometryMode StreetscapeGeometryMode.Enabled olarak ayarlandığında Streetscape Geometri verilerini alır.

ARCore oturumunda Streetscape Geometrisi elde etme

GameObject öğesine bir 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 adlı ürünü anlayın

ARStreetscapeGeometry bir bina hakkında bilgiler içerir:

Bina LOD 1

BuildingLOD1, yukarı doğru düz bir tepeye uzanan bina ayak izlerinden oluşur. Bina yükseklikleri doğru olmayabilir.

Bina LOD 2

BuildingLOD2, geometriye daha iyi uyum sağlar. Örgü duvarlar ve çatılar binanın şekliyle daha uyumlu olacaktır. Bacalar veya çatı menfezleri gibi küçük detaylar yine de ağın dışına kırılabilir.

Mesh adlı ürünü anlayın

Mesh, Streetscape Geometrisinin yüzey yeniden yapısını temsil eden bir poligon örgüdür. Daha fazla bilgi için Mesh ve MeshRenderer başlıklı makaleleri inceleyin. Normallerin varsayılan olarak hesaplanmadığını unutmayın. Bunları hesaplamak için Mesh.RecalculateNormals() sayfasını inceleyin.

ARStreetscapeGeometry'e artırılmış gerçeklik içeriği ekleme

ARStreetscapeGeometry.mesh alt bölgesinde köşelerin yakınında belirli bir pozda bir çapa oluşturmak için ARAnchorManager.AddAnchor() aracını kullanın. Bu sabit, izleme durumunu üst öğeden (ARStreetscapeGeometry) devralacak.

ARStreetscapeGeometry ile isabet testi yapın.

ARRaycastManagerExtensions.RaycastStreetscapeGeometry, Streetscape Geometry'de isabet testi yapmak için kullanılabilir. Kesişmeler bulunursa XRRaycastHit, isabet konumuyla ilgili poz bilgilerinin yanı sıra isabet alan ARStreetscapeGeometry için bir referans içerir. Bu Streetscape Geometrisi, kendisine ekli bir çapa oluşturulması için ARAnchorManager.AddAnchor()'e 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 Derinliği Etkinleştir

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 görüntüleri, yerel olarak gözlemlenen derinliğe ek olarak pikselleştirilmiş Streetscape Geometrisi içerecek şekilde değiştirilir. Bu, Derinlik özelliği kullanılarak pozların doğruluğunu artırabilir.