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