ใช้สิ่งปลูกสร้างและภูมิประเทศรอบตัวคุณใน Unity

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 มีข้อมูลเกี่ยวกับอาคาร ดังนี้

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