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

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

Dùng thử mẫu

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

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

Để sử dụng Hình học cảnh đường phố, bạn cần phải thiết lập API Không gian địa lý trong dự án của mình. Làm theo hướng dẫn về cách Bật API không gian địa lý để thiết lập API không gian địa lý.

Bật Hình học phong cảnh đườ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 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 ARStreetscapeGeometry

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

Toà nhà LOD 1

BuildingLOD1 bao gồm phạm vi của toà nhà được nhô lên trên mặt phẳng. Chiều cao của toà nhà có thể không chính xác.

Toà nhà LOD 2

BuildingLOD2 sẽ có hình học độ trung thực cao hơn. Tường và mái lưới sẽ phù hợp hơn với hình dạng của toà nhà. 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ể bị chọc vào bên ngoài lưới.

Tìm hiểu Mesh

Mesh là một lưới đa giác thể hiện bản dựng lại bề mặt của Hình học cảnh quan đường phố. Xem MeshMeshRenderer. 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 chúng.

Đính kèm nội dung thực tế tăng cường (AR) vào ARStreetscapeGeometry

Sử dụng ARAnchorManager.AddAnchor() để tạo điểm neo ở một tư thế cho trước gần các đỉnh trong ARStreetscapeGeometry.mesh. Quảng cáo liên kết này sẽ kế thừa trạng thái theo dõi từ ARStreetscapeGeometry gốc.

Thực hiện thử nghiệm nhấn với ARStreetscapeGeometry

Bạn có thể sử dụng ARRaycastManagerExtensions.RaycastStreetscapeGeometry để kiểm tra nhanh theo Hình học cảnh đường phố. Nếu tìm thấy giao lộ, XRRaycastHit chứa thông tin về tư thế về vị trí bị va chạm cũng như thông tin tham chiếu đến ARStreetscapeGeometry nơi bị va chạm. Bạn có thể truyền Hình học cảnh đường phố này đến ARAnchorManager.AddAnchor() để tạo neo đi kèm.

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ý

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