از ساختمان ها و زمین های اطراف خود در یونیتی استفاده کنید

API های Streetscape Geometry هندسه زمین، ساختمان ها یا سایر سازه ها را در یک صحنه ارائه می دهند. هندسه را می توان برای انسداد، رندر یا قرار دادن محتوای واقعیت افزوده از طریق APIهای تست ضربه استفاده کرد. داده‌های Streetscape Geometry از طریق تصاویر نمای خیابان Google به دست می‌آیند.

نمونه را امتحان کنید

برنامه نمونه Geospatial نحوه بدست آوردن و رندر Streetscape Geometries را نشان می دهد.

Geospatial API را تنظیم کنید

برای استفاده از Streetscape Geometry، باید Geospatial API را در پروژه خود راه اندازی کنید. دستورالعمل‌های فعال کردن Geospatial API برای راه‌اندازی Geospatial API را دنبال کنید.

هندسه Streetscape را فعال کنید

Geospatial API زمانی که GeospatialMode روی GeospatialMode.Enabled و StreetscapeGeometryMode روی StreetscapeGeometryMode.Enabled تنظیم شده باشد، داده های Streetscape Geometry را به دست می آورد.

هندسه Streetscape را در جلسه ARCore بدست آورید

یک جزء ARStreetscapeGeometryManager را به GameObject اضافه کنید. هنگامی که Streetscape Geometries اضافه، به‌روزرسانی یا حذف می‌شود، رویداد ARStreetscapeGeometryManager.StreetscapeGeometriesChanged فعال می‌شود.

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 را درک کنید

ARStreetscapeGeometry حاوی اطلاعاتی در مورد یک ساختمان است:

LOD ساختمان 1

BuildingLOD1 متشکل از ردپای ساختمان است که به سمت بالا به بالای یک صفحه صاف اکسترود شده است. ارتفاع ساختمان ممکن است نادرست باشد.

ساختمان LOD 2

BuildingLOD2 هندسه وفاداری بالاتری خواهد داشت. دیوارها و سقف های مشبک بیشتر با شکل ساختمان مطابقت دارند. ویژگی‌های کوچک‌تر مانند دودکش‌ها یا دریچه‌های سقف ممکن است همچنان در خارج از مش قرار بگیرند.

Mesh را درک کنید

Mesh یک شبکه چند ضلعی است که نمایانگر بازسازی سطحی از هندسه Streetscape است. Mesh و MeshRenderer ببینید. توجه داشته باشید که نرمال ها به طور پیش فرض محاسبه نمی شوند. برای محاسبه آنها به Mesh.RecalculateNormals() مراجعه کنید.

محتوای AR را به ARStreetscapeGeometry متصل کنید

از ARAnchorManager.AddAnchor() برای ایجاد یک لنگر در یک موقعیت مشخص نزدیک رئوس در ARStreetscapeGeometry.mesh استفاده کنید. این لنگر وضعیت ردیابی خود را از ARStreetscapeGeometry والد به ارث می برد.

یک تست ضربه در برابر ARStreetscapeGeometry انجام دهید

ARRaycastManagerExtensions.RaycastStreetscapeGeometry را می توان برای تست ضربه در برابر Streetscape Geometry استفاده کرد. اگر تقاطع هایی پیدا شد، XRRaycastHit حاوی اطلاعات پوزیشن در مورد مکان ضربه و همچنین ارجاعی به ARStreetscapeGeometry است که ضربه زده شده است. این هندسه Streetscape را می توان به ARAnchorManager.AddAnchor() منتقل کرد تا یک لنگر متصل به آن ایجاد کند.

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);
  }
}

عمق مکانی را فعال کنید

Geospatial Depth هندسه Streetscape را با ورودی حسگر محلی ترکیب می‌کند تا داده‌های عمق را افزایش دهد. وقتی Geospatial Depth فعال است، عمق خروجی و تصاویر عمق خام اصلاح می‌شوند تا علاوه بر عمق مشاهده‌شده به‌صورت محلی، هندسه نمای خیابان شطرنجی‌شده را نیز شامل شود. این ممکن است دقت ژست‌ها را با استفاده از Depth بهبود بخشد.