В Jetpack XR SDK пространственные среды – это иммерсивные окружения, которые можно добавить в приложение, чтобы настроить фон виртуальной сцены. Пространственное окружение видно, только когда приложение находится в режиме полного пространства.
Обзор пространственных сред
SpatialEnvironment управляет настройками пространственной среды приложения. Она состоит из отдельного изображения скайбокса и геометрии, заданной в формате glTF. Одновременно можно задать только одно изображение скайбокса и один файл геометрии glTF.
Скайбокс – это изображение, которое пользователь видит вокруг себя в виртуальной сцене. Оно создает иллюзию удаленного фона, например неба, гор или городского пейзажа. Пользователь не может взаимодействовать с ним или приблизиться к нему. Jetpack XR SDK поддерживает сферические скайбоксы в стандарте OpenEXR. Помимо создания иммерсивного фона для приложения, скайбокс EXR также обеспечивает освещение на основе изображения (IBL) для 3D-моделей, загруженных вашим приложением. Дополнительную информацию можно найти в руководстве по работе с 3D-моделями.
Пространственные среды также могут включать контент с 3D-геометрией в формате glTF. Загруженная таким образом геометрия окружения будет автоматически выровнена по реальному полу. Геометрия окружения – отличный способ сделать окружение более реалистичным за счет элементов переднего и среднего плана, которые сливаются со скайбоксом с эффектом параллакса.
В руководстве по дизайну пространственных сред вы можете узнать о разных типах объектов, которые можно использовать для создания пространственных сред, и о том, как создавать безопасные и приятные пространственные среды.
Вы можете выбрать одну из трех конфигураций пространственной среды:
- Комбинация изображения скайбокса и геометрии glTF.
- Сквозная поверхность, на которой отображается окружение, транслируемое с внешних камер устройства. При полной непрозрачности эта сквозная поверхность полностью закрывает скайбокс и геометрию.
- Смешанная конфигурация, при которой сквозная поверхность не является ни полностью непрозрачной, ни полностью прозрачной. В этом случае сквозная поверхность становится полупрозрачной и смешивается с небом и геометрией за ней.
Пространственные возможности для пространственных сред
SpatialCapability– пространственные возможности текущего сеанса. Некоторые пространственные возможности актуальны для пространственных сред.SpatialCapability.PASSTHROUGH_CONTROL– указывает, может ли действие в данный момент включить или отключить сквозной режим.SpatialCapability.APP_ENVIRONMENT– указывает, может ли действие задавать собственную пространственную среду в текущий момент времени.
Импорт и загрузка ресурсов пространственной среды
Ресурсы glTF и EXR для пространственного окружения загружаются асинхронно с помощью класса Session.
Как создать ресурс glTF
Ресурс glTF можно создать как GltfModel, загрузив glTF из локального файла. GltfModel можно использовать как часть среды пространственного приложения.
val environmentGeometry = GltfModel.create(session, Paths.get("DayGeometry.glb"))
Создание ресурса освещения на основе изображения
Ресурс освещения на основе изображения можно создать как ImageBasedLightingAsset, где освещение загружается из локального файла.
ImageBasedLightingAsset можно использовать с cmgen, чтобы создать ZIP-файл IBL для скайбоксов. Подробнее об этом рассказывается в руководстве по оптимизации объектов окружения.
val lightingForSkybox = ImageBasedLightingAsset.createFromZip(session, Paths.get("BlueSkyboxLighting.zip"))
Как настроить SpatialEnvironmentPreference для приложения
Свойство preferredSpatialEnvironment управляет предпочтительной пространственной средой для приложения. Если это свойство используется для настройки предпочтения, оно не вызывает немедленных изменений, если только isPreferredSpatialEnvironmentActive уже не имеет значение true. Когда устройство перейдет в состояние, в котором можно изменить фон XR, и станет доступна функция SpatialCapability.APP_ENVIRONMENT, автоматически отобразится предпочтительная пространственная среда для приложения.
Если задать для параметра значение null, предпочтительная пространственная среда будет отключена и вместо нее будет использоваться среда по умолчанию.
Если заданный объект SpatialEnvironmentPreference не равен null, но все его свойства равны null, то пространственная среда будет состоять из черного скайбокса и не будет иметь геометрии.
Чтобы получать уведомления об изменениях состояния SpatialEnvironment, используйте addOnSpatialEnvironmentChangedListener.
Как пользоваться отчетом
Этот фрагмент кода создает ресурсы геометрии среды и скайбокса, а затем задает настройки пространственной среды. Этот параметр будет сохранен и применен, когда у приложения появится возможность настраивать собственную среду.
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. }
Дополнительные возможности
Если вам нужен более точный контроль над средой, вы можете включить проверки SpatialCapability и реализовать addOnSpatialEnvironmentChangedListener, чтобы определить, когда вы хотите задать предпочтения пространственной среды.
Задайте PassthroughOpacityPreference для пространственной среды приложения.
Один из компонентов иммерсивного виртуального фона приложения – это сквозная поверхность. В этом случае в качестве фона используется изображение с камер устройства, направленных наружу.
setPassthroughOpacityPreference используется, чтобы задать предпочтительную прозрачность сквозной передачи для приложения. Этот метод только задает предпочтение и не приводит к немедленному изменению, если только не доступна функция SpatialCapability.PASSTHROUGH_CONTROL. Когда устройство перейдет в состояние, в котором можно изменить прозрачность сквозного режима, и будет доступна функция SpatialCapability.PASSTHROUGH_CONTROL, предпочтительная прозрачность сквозного режима для приложения будет применена автоматически.
Значения непрозрачности сквозной камеры варьируются от 0.0f (нулевая непрозрачность, при которой сквозная камера не видна) до 1.0f (полная непрозрачность, при которой сквозная камера скрывает пространственную среду). Параметр setPassthroughOpacityPreference – это число с плавающей запятой, которое может быть равно null. Если задать значение null, это будет означать, что у приложения нет предпочтений по прозрачности сквозного режима и управление им будет передано системе.
Как пользоваться отчетом
Этот фрагмент кода задает настройки прозрачности сквозного режима. Эта настройка будет сохранена и применена, когда в приложении появится возможность устанавливать прозрачность сквозного режима.
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. }
Дополнительные возможности
Если вам нужен более точный контроль над прозрачностью сквозного режима, вы можете добавить проверки SpatialCapability и слушатель с помощью addOnPassthroughOpacityChangedListener, чтобы определить, когда нужно задать прозрачность.
Оптимизация объектов
При создании объектов для SpatialEnvironment пользователей убедитесь, что они имеют высокое разрешение и разумный размер файла. Подробнее об оптимизации объектов окружения…
Определить текущую прозрачность сквозного режима
val currentPassthroughOpacity = session.scene.spatialEnvironment.currentPassthroughOpacity