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

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 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 hình ảnh tổng hợp của hình ảnh hộp ảo độc lập và hình học do glTF chỉ định. Mỗi lần chỉ có thể đặt một hình ảnh hộp trời và một tệp hình học glTF.

Hộp trời (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ôi trường nền ở xa, chẳng hạn như bầu trời, núi hoặc cảnh thành phố. Người dùng không thể tương tác hoặc đến gần hộp trời. SDK Jetpack XR hỗ trợ hộp bầu trời 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, hộp ảo EXR cũng cung cấp ánh 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ăn chỉnh với sàn 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 kết hợp với hộp trời 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ể sử dụng để tạo môi trường không gian cũng như 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 ba cấu hình sau:

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

Các tính năng không gian cho môi trường không gian

  • SpatialCapabilities: Biểu thị các tính năng không gian của phiên hiện tại. Một số chức năng không gian nhất định 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 tải 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 hay không tại thời điểm hiện tại.

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ộ trong lớp Session. Các tệp này phải được lưu trữ trong thư mục tài sản.

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ể sử dụng GltfModel như một phần của môi trường ứng dụng không gian.

// assume that session is a Session that has been previously created
val environmentGeometryFuture = session.createGltfResourceAsync("DayGeometry.glb")

val environmentGeometry = environmentGeometryFuture.await()

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ể sử dụng ExrImage như một phần của môi trường ứng dụng không gian để vẽ hộp bầu trời.

// assume that session is a Session that has been previously created
val skyboxExrFuture = session.createExrImageResourceAsync("BlueSkybox.exr")

val skyboxExr = skyboxExrFuture.await()

Đặt SpatialEnvironmentPreference cho ứng dụng

setSpatialEnvironmentPreference được dùng để đặt môi trường không gian ưu tiên cho một ứng dụng. Phương thức này chỉ đặt một tuỳ chọn ưu tiên và không gây ra thay đổi tức thì trừ phi isSpatialEnvironmentPreferenceActive đã là true. Khi thiết bị chuyển sang trạng thái có thể thay đổi nền XR và có sẵn tính năng SpatialCapabilities.SPATIAL_CAPABILITY_APP_ENVIRONMENT, môi trường không gian ưu tiên cho ứng dụng sẽ tự động hiển thị.

Việc đặt tuỳ chọn thành rỗng sẽ vô hiệu hoá 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ả 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 hộp trăng 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 sử dụng addOnSpatialEnvironmentChangedListener.

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

Đoạn mã này tạo hình học môi trường và tài nguyên hộp ảo, sau đó đặt tuỳ chọn 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 của riêng ứng dụng.

// Assume that session is a Session that has been previously created

// Create a GLTFResource
val environmentGeometry = session.createGltfResourceAsync("DayGeometry.glb").await()

// Create an ExrImage for the skybox
val skyboxExr = session.createExrImageResourceAsync("BlueSkybox.exr").await()

val spatialEnvironmentPreference = SpatialEnvironmentPreference(skyboxExr, environmentGeometry)

val preferenceResult = session.spatialEnvironment.setSpatialEnvironmentPreference(spatialEnvironmentPreference)

if (preferenceResult ==  SpatialEnvironment.SetSpatialEnvironmentPreferenceChangeApplied()) {
   // The environment was successfully updated and is now visible, and any listeners
   // specified using addOnSpatialEnvironmentChangedListener will be notified.
} else if (preferenceResult == SpatialEnvironment.SetSpatialEnvironmentPreferenceChangePending()) {
    // The environment is in the process of being updated. Once visible, 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 môi trường chặt chẽ hơn, 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 cho ứ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 tải. 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ờ truyền qua ưu tiên cho một ứng dụng. Phương thức này chỉ đặt một tuỳ chọn ưu tiên và không gây ra thay đổi tức thì trừ phi có chức năng SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL. Khi thiết bị chuyển sang trạng thái có thể thay đổi độ mờ truyền xuyên và có sẵn tính năng SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL, độ mờ truyền xuyên ưu tiên cho ứng dụng sẽ được tự động áp dụng.

Giá trị cho tuỳ chọn độ mờ truyền tải nằm trong khoảng từ 0.0f (độ mờ bằng 0, bề mặt truyền tải không hiển thị) đến 1.0f (độ mờ đầy đủ, bề mặt truyền tải ẩn môi trường không gian). Tham số setPassthroughOpacityPreference là một số thực có thể nhận giá trị rỗng. Việc đặt giá trị thành rỗng 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.

// Assume that session is a Session that has been previously created

val preferenceResult = session.spatialEnvironment.setPassthroughOpacityPreference(1.0f)

if (preferenceResult ==  SpatialEnvironment.SetPassthroughOpacityPreferenceChangeApplied()) {
  // The passthrough opacity request succeeded and should be visible now, and any listeners specified using addOnPassthroughOpacityChangedListener
  // will be notified
} else if (preferenceResult == SpatialEnvironment.SetPassthroughOpacityPreferenceChangePending()) {
  // 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, trong đó 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 bước kiểm tra SpatialCapabilities và triển khai addOnPassthroughOpacityChangedListener để xác định thời điểm bạn muốn đặt tuỳ chọn độ mờ truyền qua.

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

Khi tạo thành phần để thiết lập SpatialEnvironment của người dùng, bạn cần đảm bảo rằng các thành phần của mình đạt được độ phân giải chất lượng cao trong khi vẫn duy trì kích thước tệp hợp lý. Bạn nên đảm bảo rằng glb của mình sử dụng mipmap và hoạ tiết ktx2. Bạn cũng cần chú ý đến số lượng đa giác trong tệp glb, vì số lượng đa giác cao có thể dẫn đến mức tiêu thụ điện năng không cần thiết. Phần lớn kích thước tệp của hầu hết các thực thể SpatialEnvironment đều đến từ hình ảnh dùng cho Skybox. Để đảm bảo hình ảnh được tối ưu hoá, hãy chạy các thành phần đó thông qua một công cụ tối ưu hoá (ví dụ: ktx).

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

val currentPassthroughOpacity =  session.spatialEnvironment.getCurrentPassthroughOpacity()

Xem thêm