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

API Hình học của cảnh quan đường phố cung cấp hình dạng của địa hình, toà nhà hoặc các cấu trúc khác trong một cảnh. Hình dạng có thể được dùng để che khuất, hiển thị hoặc đặt nội dung AR thông qua API kiểm tra lượt truy cập. Dữ liệu Hình học của cảnh quan đường phố được thu thập thông 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 đườ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 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 tính năng 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.

Thu thập Hình học đường phố trong phiên ARCore

Thêm thành phần ARStreetscapeGeometryManager vào GameObject. Thời gian Hình học cảnh quan đường phố được thêm, cập nhật hoặc xoá, 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à:

LOD 1 của toà nhà

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

Xây dựng LOD 2

BuildingLOD2 sẽ có độ chân thực cao hơn. Tường và mái bằng 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 hơi trên mái vẫn có thể chọc ra ngoài lưới.

Tìm hiểu về Mesh

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

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

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

Thực hiện kiểm thử lượt truy cập đối với ARStreetscapeGeometry

Bạn có thể sử dụng ARRaycastManagerExtensions.RaycastStreetscapeGeometry để kiểm tra nhấn theo Streetscape Geometry. Nếu tìm thấy các giao lộ, XRRaycastHit chứa thông tin tư thế về vị trí va chạm cũng như tham chiếu đến ARStreetscapeGeometry đã bị nhấn. Bạn có thể truyền hình ảnh cảnh quan đường phố này đến ARAnchorManager.AddAnchor() để tạo một điểm 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 tính năng Độ 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 độ sâu. Khi tính năng Độ sâu không gian địa lý được bật, độ sâu đầu ra và hình ảnh chiều sâu thô được sửa đổi để bao gồm Hình học cảnh quan đường phố được tạo điểm ảnh ngoài độ sâu 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 tính năng Chiều sâu.