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

Streetscape Geometry API ให้เรขาคณิตของภูมิประเทศ อาคาร หรือโครงสร้างอื่นๆ ในฉาก เรขาคณิตนี้สามารถใช้สำหรับการบดบัง การแสดงผล หรือการวางเนื้อหา AR ผ่าน Hit-Test API ข้อมูลเรขาคณิตของสภาพแวดล้อมบนท้องถนนจะมาจากภาพถ่ายของ Google Street View

ลองใช้ตัวอย่าง

แอปตัวอย่างเชิงพื้นที่จะสาธิตวิธีรับและแสดงผลเรขาคณิตของภาพถนน

ตั้งค่า Geospatial API

หากต้องการใช้เรขาคณิตของภาพถนน คุณจะต้องตั้งค่า Geospatial API ในโปรเจ็กต์ ทําตามวิธีการในการเปิดใช้ Geospatial API เพื่อตั้งค่า Geospatial API

เปิดใช้เรขาคณิตของภาพถนน

API ทางภูมิศาสตร์จะรับข้อมูลเรขาคณิตของ Streetscape เมื่อตั้งค่า 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 กับ ARStreetscapeGeometry

คุณใช้ ARRaycastManagerExtensions.RaycastStreetscapeGeometry เพื่อทดสอบกับเรขาคณิตของ Streetscape ได้ หากพบจุดตัด 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);
  }
}

เปิดใช้ความลึกของภูมิสารสนเทศ

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