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

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

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);
  }
}

เปิดใช้ความชัดลึกเชิงพื้นที่

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