Sử dụng các toà nhà và địa hình xung quanh bạn trên Unity

API Hình học cảnh đường phố cung cấp hình học của địa hình, toà nhà hoặc các cấu trúc khác trong một cảnh. Bạn có thể sử dụng hình học để che khuất, kết xuất hoặc đặt nội dung AR thông qua các API kiểm thử lượt nhấn. Dữ liệu Hình học cảnh quan đường phố được lấy thông qua hình ảnh của Chế độ xem đường phố của Google.

Thử mẫu

Ứng dụng mẫu không gian địa lý minh hoạ cách lấy và kết xuất Hình học cảnh đường phố.

Thiết lập API không gian địa lý

Để sử dụng Streetscape Geometry, bạn cần thiết lập API không gian địa lý trong dự án. Làm theo hướng dẫn về Bật API không gian địa lý để thiết lập API không gian địa lý.

Bật Hình học cảnh quan đường phố

API Không gian địa lý thu thập dữ liệu Hình học cảnh quan đường phố khi GeospatialMode được đặt thành GeospatialMode.EnabledStreetscapeGeometryMode được đặt thành StreetscapeGeometryMode.Enabled.

Nhận Hình học cảnh đường phố trong phiên ARCore

Thêm thành phần ARStreetscapeGeometryManager vào GameObject. Khi bạn thêm, cập nhật hoặc xoá Hình học cảnh quan đường phố, sự kiện ARStreetscapeGeometryManager.StreetscapeGeometriesChanged sẽ được kích hoạt.

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

Tìm hiểu về ARStreetscapeGeometry

ARStreetscapeGeometry chứa thông tin về một toà nhà:

Xây dựng LOD 1

BuildingLOD1 bao gồm các dấu vết của toà nhà được đẩy lên trên đến một đỉnh phẳng. Chiều cao của tòa nhà có thể không chính xác.

Xây dựng LOD 2

BuildingLOD2 sẽ có hình học có độ trung thực cao hơn. Các bức tường và mái lưới sẽ khớp với hình dạng của tòa nhà hơn. Các đặc điểm nhỏ hơn như ống khói hoặc lỗ thông gió trên mái nhà vẫn có thể nhô ra ngoài lưới.

Tìm hiểu về Mesh

Mesh là một lưới đa giác thể hiện quá trình tái tạo bề mặt của Hình học cảnh quan đường phố. Xem MeshMeshRenderer. Xin lưu ý rằng các pháp tuyến không được tính theo mặc định; hãy xem Mesh.RecalculateNormals() để tính các pháp tuyến đó.

Đính kèm nội dung AR vào ARStreetscapeGeometry

Sử dụng ARAnchorManager.AddAnchor() để tạo một neo tại một tư thế nhất định gần các đỉnh trong ARStreetscapeGeometry.mesh. Mục neo này sẽ kế thừa trạng thái theo dõi từ ARStreetscapeGeometry mẹ.

Thực hiện kiểm thử nhấn đối với ARStreetscapeGeometry

Bạn có thể dùng ARRaycastManagerExtensions.RaycastStreetscapeGeometry để kiểm thử nhấn đối với Hình học cảnh quan đường phố. Nếu phát hiện thấy giao điểm, XRRaycastHit sẽ chứa thông tin về tư thế tại vị trí nhấn cũng như tham chiếu đến ARStreetscapeGeometry đã được nhấn. Bạn có thể truyền Hình học cảnh quan đường phố này đến ARAnchorManager.AddAnchor() để tạo một neo được đính kèm vào hình học đó.

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

Bật độ sâu không gian địa lý

Chiều sâu không gian địa lý kết hợp Hình học cảnh đường phố với dữ liệu đầu vào của cảm biến cục bộ để nâng cao dữ liệu chiều sâu. Khi bạn bật tính năng Chiều sâu không gian địa lý, chiều sâu đầu ra và hình ảnh chiều sâu thô sẽ được sửa đổi để bao gồm cả Hình học cảnh đường phố được quét cùng với chiều sâu được quan sát cục bộ. Điều này có thể cải thiện độ chính xác của các tư thế bằng cách sử dụng Độ sâu.