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);
}
}
เปิดใช้ความชัดลึกเชิงพื้นที่
ความลึกเชิงพื้นที่จะรวมเรขาคณิตของภาพถนนเข้ากับอินพุตจากเซ็นเซอร์ในพื้นที่เพื่อปรับปรุงข้อมูลความลึก เมื่อเปิดใช้ความลึกเชิงพื้นที่ภูมิศาสตร์ ระบบจะแก้ไขความลึกเอาต์พุตและรูปภาพความลึกดิบให้รวมเรขาคณิตของภาพถนนแบบแรสเตอร์ไว้ด้วยนอกเหนือจากความลึกที่สังเกตได้ในพื้นที่ ซึ่งอาจช่วยเพิ่มความแม่นยำของท่าทางโดยใช้ข้อมูลความลึก