Streetscape Geometry API ให้เรขาคณิตของภูมิประเทศ อาคาร หรือโครงสร้างอื่นๆ ในฉาก เรขาคณิตนี้สามารถใช้สำหรับการบดบัง การแสดงผล หรือการวางเนื้อหา AR ผ่าน Hit-Test API ข้อมูลเรขาคณิตของสภาพแวดล้อมบนท้องถนนได้รับผ่านภาพจาก Google Street View
ลองใช้ตัวอย่าง
แอปตัวอย่างเชิงพื้นที่จะสาธิตวิธีรับและแสดงผลเรขาคณิตของภาพถนน
ตั้งค่า Geospatial API
หากต้องการใช้เรขาคณิตของภาพถนน คุณจะต้องตั้งค่า Geospatial API ในโปรเจ็กต์ ทําตามวิธีการในการเปิดใช้ Geospatial API เพื่อตั้งค่า Geospatial API
เปิดใช้เรขาคณิตของสภาพแวดล้อมถนน
Geospatial API จะรับข้อมูลเรขาคณิตของภาพถนนเมื่อตั้งค่า GeospatialMode เป็น GeospatialMode.Enabled และตั้งค่า StreetscapeGeometryMode เป็น StreetscapeGeometryMode.Enabled

รับเรขาคณิตของภาพถนนในเซสชัน ARCore
เพิ่มคอมโพเนนต์ARStreetscapeGeometryManager ลงใน GameObject เมื่อมีการเพิ่ม อัปเดต หรือนำเรขาคณิตของพื้นที่สาธารณะออก ระบบจะทริกเกอร์เหตุการณ์ 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 คือเมชรูปหลายเหลี่ยมที่แสดงการจำลองพื้นผิวของเรขาคณิตของภาพถนน
โปรดดูMesh และ MeshRenderer โปรดทราบว่าระบบจะไม่คำนวณนอร์มัลโดยค่าเริ่มต้น โปรดดูMesh.RecalculateNormals() เพื่อคำนวณ
แนบเนื้อหา AR กับ ARStreetscapeGeometry
ใช้ ARAnchorManager.AddAnchor() เพื่อสร้างจุดยึดในท่าทางที่กำหนดไว้ใกล้กับจุดยอดใน ARStreetscapeGeometry.mesh หมุดนี้จะรับสถานะการติดตามมาจาก ARStreetscapeGeometry หลัก
ทำการทดสอบ Hit-Test กับ ARStreetscapeGeometry
ARRaycastManagerExtensions.RaycastStreetscapeGeometry ใช้เพื่อทำการทดสอบการคลิกกับเรขาคณิตของภาพถนนได้ หากพบจุดตัด XRRaycastHit จะมีข้อมูลท่าทางเกี่ยวกับตำแหน่งที่โดน รวมถึงการอ้างอิงถึง ARStreetscapeGeometry ที่โดน เรขาคณิตของภาพถนนนี้สามารถส่งไปยัง 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);
}
}
เปิดใช้ความชัดลึกเชิงพื้นที่
ความลึกเชิงพื้นที่จะรวมเรขาคณิตของภาพถนนเข้ากับอินพุตจากเซ็นเซอร์ในพื้นที่เพื่อปรับปรุงข้อมูลความลึก เมื่อเปิดใช้ความลึกเชิงพื้นที่ภูมิศาสตร์ ระบบจะแก้ไขความลึกเอาต์พุตและรูปภาพความลึกดิบให้รวมเรขาคณิตของภาพถนนแบบแรสเตอร์ไว้ด้วยนอกเหนือจากความลึกที่สังเกตได้ในพื้นที่ ซึ่งอาจช่วยเพิ่มความแม่นยำของท่าทางโดยใช้ข้อมูลความลึก