Streetscape Geometry API มีเรขาคณิตของภูมิประเทศ อาคาร หรือโครงสร้างอื่นๆ ในฉาก เรขาคณิตสามารถใช้สำหรับการซ้อนทับ การแสดงภาพ หรือวางเนื้อหา AR ผ่าน API การทดสอบ Hit ข้อมูลเรขาคณิตใน Street View ได้มาจากภาพของ Google Street View
ดูตัวอย่าง
แอปตัวอย่างภูมิสารสนเทศ สาธิตวิธีรับและแสดงผล Streetscape Geometries
ตั้งค่า Geospatial API
ในการใช้ Streetscape Geometry คุณจะต้องตั้งค่า Geospatial API ในโปรเจ็กต์ของคุณ โปรดทำตามวิธีการในการเปิดใช้ Geospatial API เพื่อตั้งค่า Geospatial API
เปิดใช้ Streetscape Geometry
API ทางภูมิศาสตร์จะรับข้อมูลเรขาคณิตของ Streetscape เมื่อตั้งค่า GeospatialMode
เป็น GeospatialMode.Enabled
และตั้งค่า StreetscapeGeometryMode
เป็น StreetscapeGeometryMode.Enabled
รับเรขาคณิตของ Streetscape ในเซสชัน ARCore
เพิ่มคอมโพเนนต์ARStreetscapeGeometryManager
ลงใน GameObject
วันและเวลา
มีการเพิ่ม อัปเดต หรือนำเรขาคณิตของ Streetscape ออก ระบบจะทริกเกอร์เหตุการณ์ 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()
เพื่อสร้าง Anchor ในท่าทางที่กำหนดใกล้กับจุดยอดมุมใน ARStreetscapeGeometry.mesh
Anchor นี้จะรับสถานะการติดตามมาจาก ARStreetscapeGeometry
ระดับบน
ทำการทดสอบ Hit กับ ARStreetscapeGeometry
คุณใช้ ARRaycastManagerExtensions.RaycastStreetscapeGeometry
เพื่อทดสอบกับเรขาคณิตของ Streetscape ได้ หากพบทางแยก XRRaycastHit
จะมีข้อมูลตำแหน่งเกี่ยวกับตำแหน่งของ Hit รวมถึงการอ้างอิง ARStreetscapeGeometry
ที่เกิด Hit เรขาคณิตของ 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);
}
}
เปิดใช้ความลึกของภูมิสารสนเทศ
ความลึกตามพื้นที่ รวมเรขาคณิตของ Streetscape เข้าด้วยกัน พร้อมอินพุตจากเซ็นเซอร์ในตัวเครื่อง เพื่อปรับปรุงข้อมูลความลึก เมื่อเปิดใช้ความลึกของภูมิสารสนเทศ ความลึกของภาพ และภาพความลึกที่เป็นข้อมูลดิบ ได้รับการแก้ไขให้รวมเรขาคณิตของ Streetscape แบบแรสเตอร์ นอกเหนือจากความลึกที่สังเกตได้ในพื้นที่ การทำเช่นนี้อาจเพิ่มความแม่นยำในการโพสท่าโดยใช้ความลึกได้