Thêm môi trường không gian vào ứng dụng

Các thiết bị XR được hỗ trợ
Hướng dẫn này giúp bạn xây dựng các trải nghiệm cho những loại thiết bị XR sau.
Thiết bị đeo đầu XR
Kính thông minh XR có dây

Trong SDK Jetpack XR, môi trường không gian là môi trường xung quanh sống động mà bạn có thể thêm vào ứng dụng để tuỳ chỉnh nền của cảnh ảo. Môi trường không gian chỉ hiển thị khi ứng dụng ở chế độ Toàn bộ không gian.

Tổng quan về môi trường không gian

A SpatialEnvironment dùng để quản lý các lựa chọn ưu tiên về môi trường không gian của ứng dụng. Đây là một tổ hợp của hình ảnh skybox độc lập và hình học được chỉ định bằng glTF. Bạn chỉ có thể đặt một hình ảnh skybox và một tệp hình học glTF mỗi lần.

Skybox đại diện cho hình ảnh mà người dùng nhìn thấy xung quanh họ trong cảnh ảo, tạo ra ảo ảnh về môi trường nền ở xa, chẳng hạn như bầu trời, núi hoặc cảnh quan thành phố. Người dùng không thể tương tác hoặc đến gần skybox. SDK Jetpack XR hỗ trợ skybox hình cầu theo tiêu chuẩn OpenEXR. Ngoài việc cung cấp nền sống động cho ứng dụng, skybox EXR còn cung cấp ánh sáng dựa trên hình ảnh (IBL) cho các mô hình 3D do ứng dụng của bạn tải. Để biết thêm thông tin, hãy tham khảo hướng dẫn làm việc với mô hình 3D.

Môi trường không gian cũng có thể bao gồm nội dung hình học 3D theo tiêu chuẩn glTF. Hình học môi trường được tải theo cách này sẽ tự động căn chỉnh với sàn nhà trong thế giới thực. Hình học môi trường là một cách tuyệt vời để tăng tính chân thực cho môi trường của bạn thông qua các thành phần nền trước và nền giữa hoà vào skybox với hiệu ứng thị sai.

Trong hướng dẫn thiết kế cho môi trường không gian, bạn có thể tìm hiểu về các loại thành phần mà bạn có thể dùng để tạo môi trường không gian và cách tạo môi trường không gian an toàn và thú vị.

Bạn có thể đặt môi trường không gian của ứng dụng thành một trong 3 cấu hình sau:

  • Sự kết hợp giữa hình ảnh skybox và hình học glTF.
  • Bề mặt truyền qua, trong đó môi trường được hiển thị là nguồn cấp dữ liệu trực tiếp từ camera hướng ra ngoài của thiết bị. Ở độ mờ tối đa, bề mặt truyền qua này sẽ che khuất hoàn toàn skybox và hình học.
  • Cấu hình hỗn hợp, trong đó bề mặt truyền qua không ở độ mờ tối đa cũng không ở độ mờ bằng 0. Trong trường hợp này, bề mặt truyền qua trở nên bán trong suốt và hoà trộn alpha với skybox và hình học ở phía sau.

Các chức năng không gian cho môi trường không gian

  • SpatialCapabilities: Đại diện cho các chức năng không gian của phiên hiện tại. Một số chức năng không gian có liên quan đến môi trường không gian.

  • SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL: Cho biết liệu hoạt động có thể bật hoặc tắt tính năng truyền qua tại thời điểm hiện tại hay không.

  • SPATIAL_CAPABILITY_APP_ENVIRONMENT: Cho biết liệu hoạt động có thể đặt môi trường không gian riêng tại thời điểm hiện tại hay không.

Nhập và tải tài nguyên môi trường không gian

Tài nguyên glTF và EXR cho môi trường không gian được tải không đồng bộ bằng cách sử dụng lớp Session.

Tạo tài nguyên glTF

Bạn có thể tạo tài nguyên glTF dưới dạng GltfModel, trong đó glTF được tải từ một tệp cục bộ. Bạn có thể dùng GltfModel làm một phần của môi trường ứng dụng không gian.

val environmentGeometry = GltfModel.create(session, Paths.get("DayGeometry.glb"))

Tạo tài nguyên ánh sáng dựa trên hình ảnh

Bạn có thể tạo tài nguyên ánh sáng dựa trên hình ảnh dưới dạng ImageBasedLightingAsset, trong đó ánh sáng được tải từ một tệp cục bộ. Bạn có thể dùng ImageBasedLightingAsset với cmgen để tạo tệp ZIP của IBL cho skybox. Hãy xem hướng dẫn của chúng tôi về cách tối ưu hoá thành phần môi trường để biết thêm thông tin chi tiết.

val lightingForSkybox = ImageBasedLightingAsset.createFromZip(session, Paths.get("BlueSkyboxLighting.zip"))

Đặt SpatialEnvironmentPreference cho ứng dụng của bạn

Thuộc tính preferredSpatialEnvironment kiểm soát môi trường không gian ưu tiên cho một ứng dụng. Khi thuộc tính này được dùng để đặt lựa chọn ưu tiên, thuộc tính này sẽ không gây ra thay đổi ngay lập tức, trừ phi isPreferredSpatialEnvironmentActive đã là true. Sau khi thiết bị chuyển sang trạng thái mà nền XR có thể thay đổi và SpatialCapabilities.SPATIAL_CAPABILITY_APP_ENVIRONMENT khả năng có sẵn, môi trường không gian ưu tiên cho ứng dụng sẽ tự động hiển thị.

Việc đặt lựa chọn ưu tiên thành null sẽ tắt môi trường không gian ưu tiên cho ứng dụng, nghĩa là môi trường hệ thống mặc định sẽ hiển thị.

Nếu SpatialEnvironmentPreference đã cho không phải là giá trị rỗng, nhưng tất cả thuộc tính của nó đều là giá trị rỗng, thì môi trường không gian sẽ bao gồm một skybox màu đen và không có hình học.

Để nhận thông báo về các thay đổi đối với trạng thái SpatialEnvironment, hãy dùng addOnSpatialEnvironmentChangedListener.

Cách sử dụng cơ bản

Đoạn mã này tạo các tài nguyên hình học môi trường và skybox, sau đó đặt lựa chọn ưu tiên về môi trường không gian. Lựa chọn ưu tiên này sẽ được ghi nhớ và sẽ được áp dụng khi ứng dụng có chức năng đặt môi trường riêng.

val spatialEnvironmentPreference =
    SpatialEnvironment.SpatialEnvironmentPreference(lightingForSkybox, environmentGeometry)
session.scene.spatialEnvironment.preferredSpatialEnvironment = spatialEnvironmentPreference
if (session.scene.spatialEnvironment.isPreferredSpatialEnvironmentActive) {
    // The environment was successfully updated and is now visible, and any listeners
    // specified using addOnSpatialEnvironmentChangedListener will be notified.
} else {
    // The passthrough opacity preference was successfully set, but not
    // immediately visible. The passthrough opacity change will be applied
    // when the activity has the SPATIAL_CAPABILITY_APP_ENVIRONMENT capability.
    // Then, any listeners specified using addOnSpatialEnvironmentChangedListener
    // will be notified.
}

Cách sử dụng nâng cao

Đối với các trường hợp sử dụng nâng cao hơn mà bạn cần kiểm soát chặt chẽ hơn môi trường, bạn có thể kết hợp các lượt kiểm tra SpatialCapabilities và triển khai một addOnSpatialEnvironmentChangedListener để xác định thời điểm bạn muốn đặt lựa chọn ưu tiên về môi trường không gian.

Đặt PassthroughOpacityPreference cho môi trường không gian của ứng dụng

Một trong các thành phần của nền ảo sống động của ứng dụng là bề mặt truyền qua. Trong trường hợp này, nền được hiển thị là nguồn cấp dữ liệu trực tiếp từ camera hướng ra ngoài của thiết bị.

setPassthroughOpacityPreference dùng để đặt độ mờ truyền qua ưu tiên cho một ứng dụng. Phương thức này chỉ đặt một lựa chọn ưu tiên và không gây ra thay đổi ngay lập tức, trừ phi khả năng SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL có sẵn. Sau khi thiết bị chuyển sang trạng thái mà độ mờ nhìn xuyên qua có thể thay đổi và khả năng SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL có sẵn, độ mờ nhìn xuyên qua ưu tiên cho ứng dụng sẽ tự động được áp dụng.

Các giá trị cho lựa chọn ưu tiên về độ mờ truyền qua nằm trong khoảng từ 0.0f (độ mờ bằng 0, trong đó bề mặt truyền qua không hiển thị) đến 1.0f (độ mờ tối đa, trong đó bề mặt truyền qua ẩn môi trường không gian). Tham số setPassthroughOpacityPreference là một giá trị float có thể rỗng. Việc đặt giá trị thành giá trị rỗng cho biết rằng ứng dụng không có lựa chọn ưu tiên về độ mờ truyền qua và sẽ trả lại quyền kiểm soát truyền qua cho hệ thống.

Cách sử dụng cơ bản

Đoạn mã này đặt lựa chọn ưu tiên về độ mờ truyền qua. Lựa chọn ưu tiên này sẽ được ghi nhớ và sẽ được áp dụng khi ứng dụng có chức năng đặt độ mờ truyền qua.

session.scene.spatialEnvironment.preferredPassthroughOpacity = 1.0f
if (session.scene.spatialEnvironment.currentPassthroughOpacity == 1.0f) {
    // The passthrough opacity request succeeded and should be visible now, and any listeners
    // specified using addOnPassthroughOpacityChangedListener will be notified.
} else {
    // The passthrough opacity preference was successfully set, but not
    // immediately visible. The passthrough opacity change will be applied
    // when the activity has the
    // SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL capability.
    // Then, any listeners specified using addOnPassthroughOpacityChangedListener
    // will be notified.
}

Cách sử dụng nâng cao

Đối với các trường hợp sử dụng nâng cao hơn mà bạn cần kiểm soát chặt chẽ hơn độ mờ truyền qua, bạn có thể kết hợp các lượt kiểm tra SpatialCapabilities và thêm trình nghe bằng addOnPassthroughOpacityChangedListener để xác định thời điểm bạn muốn đặt lựa chọn ưu tiên về độ mờ truyền qua.

Tối ưu hoá thành phần

Khi tạo các thành phần để thiết lập SpatialEnvironment cho người dùng, hãy đảm bảo rằng các thành phần có độ phân giải chất lượng cao mà vẫn duy trì kích thước tệp hợp lý. Để tìm hiểu thêm, hãy xem hướng dẫn của chúng tôi về cách tối ưu hoá thành phần Môi trường.

Xác định độ mờ truyền qua hiện tại

val currentPassthroughOpacity = session.scene.spatialEnvironment.currentPassthroughOpacity

Xem thêm