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

Trong Jetpack XR SDK, 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ỉ xuất hiện khi ứng dụng ở chế độ Toàn không gian.

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

SpatialEnvironment được 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 thành phần kế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 thể hiện hình ảnh mà người dùng nhìn thấy xung quanh họ trong cảnh ảo, tạo ảo giác về một 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. Jetpack XR SDK hỗ trợ skybox hình cầu theo tiêu chuẩn OpenEXR. Ngoài việc cung cấp một phông nền sống động cho ứng dụng, hộp bầu trời EXR còn cung cấp tính năng chiếu sáng dựa trên hình ảnh (IBL) cho các mô hình 3D mà ứ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 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 thông qua các phần tử tiền cảnh và trung cảnh hoà vào skybox bằng 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.
  • Một bề mặt truyền qua, nơi 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ị. Khi có độ mờ hoàn toàn, bề mặt truyền qua này sẽ che khuất hoàn toàn hộp bầu trời và hình học.
  • Một cấu hình hỗn hợp, trong đó bề mặt truyền qua không có độ mờ hoàn toàn, cũng không có độ mờ bằng 0. Trong trường hợp này, bề mặt truyền qua sẽ trở nên bán trong suốt và kết hợp 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: Biểu thị 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 phù hợp với 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 chế độ 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ể thiết lập 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 như 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 hình ảnh EXR

Bạn có thể tạo tài nguyên hình ảnh EXR dưới dạng ExrImage, trong đó EXR được tải từ một tệp cục bộ. Bạn có thể dùng ExrImage 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 = ExrImage.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 có thể thay đổi nền XR và có sẵn chức năng SpatialCapabilities.SPATIAL_CAPABILITY_APP_ENVIRONMENT, môi trường không gian ưu tiên cho ứng dụng sẽ tự động xuất hiện.

Việc đặt lựa chọn ưu tiên thành null sẽ vô hiệu hoá môi trường không gian ưu tiên cho ứng dụng, tức là môi trường hệ thống mặc định sẽ xuất hiện thay thế.

Nếu SpatialEnvironmentPreference đã cho không phải là giá trị rỗng, nhưng tất cả cá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ó thành phần 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 ra 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à áp dụng khi ứng dụng có khả năng thiết lập 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 những 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 đối với môi trường, bạn có thể kết hợp các bước kiểm tra SpatialCapabilities và triển khai 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 những 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 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 được dùng để đặt độ mờ ưu tiên của chế độ truyền qua 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 có sẵn khả năng SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL. Sau khi thiết bị chuyển sang trạng thái có thể thay đổi độ mờ của chế độ truyền qua và có sẵn chức năng SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL, độ mờ của chế độ truyền qua mà ứng dụng ưu tiên sẽ tự động được áp dụng.

Các giá trị cho lựa chọn ưu tiên độ 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ờ hoàn toàn, trong đó bề mặt truyền qua ẩn môi trường không gian). Tham số setPassthroughOpacityPreference là một số thực có thể rỗng. Việc đặt giá trị thành null cho biết ứ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à áp dụng khi ứng dụng có khả 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, khi bạn cần kiểm soát chặt chẽ hơn độ mờ của chế độ truyền qua, bạn có thể kết hợp các chế độ kiểm tra SpatialCapabilities và thêm một trình nghe bằng cách sử dụng addOnPassthroughOpacityChangedListener để xác định thời điểm bạn muốn đặt lựa chọn ưu tiên về độ mờ của chế độ 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ờ hiện tại của chế độ truyền qua

val currentPassthroughOpacity = session.scene.spatialEnvironment.currentPassthroughOpacity

Xem thêm