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
حاوی اطلاعاتی در مورد یک ساختمان است:
-
ARStreetscapeGeometry.streetscapeGeometryType
StreetscapeGeometry را به عنوان زمین یا ساختمان شناسایی می کند. -
ARStreetscapeGeometry.mesh
یکMesh
چند ضلعی که با این زمین یا ساختمان مطابقت دارد به دست آورید. -
ARStreetscapeGeometry.quality
کیفیت داده های مش را ارائه می دهد. سطوح جزئیات در استاندارد CityGML 2.0 توضیح داده شده است.
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 بهبود بخشد.