В SDK Jetpack XR пространственные среды — это иммерсивные среды, которые вы можете добавить в свое приложение, чтобы настроить фон виртуальной сцены. Пространственные среды видны только тогда, когда приложение находится в полном пространстве.
Обзор пространственной среды
SpatialEnvironment
используется для управления настройками пространственной среды приложения. Это комбинация отдельного изображения скайбокса и геометрии, заданной glTF. Одновременно можно установить только одно изображение скайбокса и один файл геометрии glTF.
Скайбокс представляет собой изображение, которое пользователь видит вокруг себя в виртуальной сцене, создавая иллюзию удаленного фонового окружения, например неба, гор или городского пейзажа. Пользователь не может взаимодействовать со скайбоксом или приближаться к нему. Jetpack XR SDK поддерживает сферические скайбоксы в стандарте OpenEXR . Помимо обеспечения иммерсивного фона для вашего приложения, скайбокс EXR также обеспечивает освещение на основе изображения (IBL) для 3D-моделей, загруженных вашим приложением. Дополнительную информацию можно найти в руководстве по работе с 3D-моделями .
Пространственные среды также могут включать в себя содержимое трехмерной геометрии в стандарте glTF . Загруженная таким образом геометрия окружающей среды будет автоматически совмещена с реальным полом. Геометрия окружающей среды — отличный способ добавить реалистичности вашей среде с помощью элементов переднего и среднего плана, которые сливаются с небесным окном с эффектом параллакса.
В руководстве по проектированию пространственных сред вы можете узнать о различных типах ресурсов, которые можно использовать для создания пространственных сред, а также о том, как создавать безопасные и приятные пространственные среды.
Вы можете установить пространственную среду вашего приложения в одну из этих трех конфигураций:
- Комбинация изображения скайбокса и геометрии glTF.
- Проходная поверхность, на которой отображаемая среда представляет собой прямую трансляцию с камер, обращенных наружу, устройства. При полной непрозрачности эта сквозная поверхность полностью закрывает скайбокс и геометрию.
- Смешанная конфигурация, в которой проходная поверхность не имеет ни полной непрозрачности, ни нулевой непрозрачности. В этом случае проходная поверхность становится полупрозрачной, а альфа-канал смешивается со скайбоксом и геометрией позади него.
Пространственные возможности для пространственных сред
SpatialCapabilities
: представляет пространственные возможности текущего сеанса. Определенные пространственные возможности имеют отношение к пространственной среде.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL
: указывает, может ли действие включать или отключать транзитную передачу в текущий момент.SPATIAL_CAPABILITY_APP_ENVIRONMENT
: указывает, может ли действие устанавливать собственную пространственную среду в текущий момент.
Импортируйте и загружайте ресурсы пространственной среды.
Ресурсы glTF и EXR для пространственных сред загружаются асинхронно в классе Session
. Эти файлы должны храниться в папке с ресурсами.
Создайте ресурс glTF
Ресурс glTF можно создать как GltfModel
, где glTF загружается из локального файла. GltfModel
можно использовать как часть пространственной среды приложения.
// assume that session is a Session that has been previously created
val environmentGeometryFuture = session.createGltfResourceAsync("DayGeometry.glb")
val environmentGeometry = environmentGeometryFuture.await()
Создайте ресурс изображения EXR
Ресурс изображения EXR может быть создан как ExrImage
, где EXR загружается из локального файла. ExrImage
можно использовать как часть пространственной среды приложения для рисования скайбоксов.
// assume that session is a Session that has been previously created
val skyboxExrFuture = session.createExrImageResourceAsync("BlueSkybox.exr")
val skyboxExr = skyboxExrFuture.await()
Установите SpatialEnvironmentPreference для вашего приложения.
setSpatialEnvironmentPreference
используется для установки предпочтительной пространственной среды для приложения. Этот метод только устанавливает предпочтение и не вызывает немедленных изменений, если isSpatialEnvironmentPreferenceActive
уже не имеет значения true. Как только устройство перейдет в состояние, в котором фон XR может быть изменен и доступна возможность SpatialCapabilities.SPATIAL_CAPABILITY_APP_ENVIRONMENT
, предпочтительная пространственная среда для приложения будет автоматически отображена.
Установка для предпочтения значения null отключит предпочтительную пространственную среду для приложения, то есть вместо нее будет отображаться системная среда по умолчанию.
Если заданное значение SpatialEnvironmentPreference
не равно нулю, но все его свойства имеют значение NULL, то пространственная среда будет состоять из черного скайбокса и не иметь геометрии.
Чтобы получать уведомления об изменениях состояния SpatialEnvironment, используйте addOnSpatialEnvironmentChangedListener
.
Основное использование
Этот фрагмент кода создает геометрию среды и ресурсы скайбокса, а затем устанавливает предпочтения пространственной среды. Это предпочтение будет запомнено и применено, когда приложение сможет настроить собственную среду.
// 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.
}
Расширенное использование
Для более сложных случаев использования, когда вам нужен более точный контроль над средой, вы можете включить проверки SpatialCapabilities
и реализовать addOnSpatialEnvironmentChangedListener
чтобы определить, когда вы хотите установить предпочтение пространственной среды.
Установите PassthroughOpacityPreference для пространственной среды вашего приложения.
Одним из компонентов иммерсивного виртуального фона приложения является сквозная поверхность. В этом случае отображаемый фон представляет собой прямую трансляцию с внешних камер устройства.
setPassthroughOpacityPreference
используется для установки предпочтительной прозрачности сквозной передачи для приложения. Этот метод только устанавливает предпочтение и не вызывает немедленных изменений, если не доступна возможность SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL
. Как только устройство перейдет в состояние, в котором сквозную непрозрачность можно изменить, и станет доступна возможность SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL
, предпочтительная сквозная непрозрачность для приложения будет применена автоматически.
Значения предпочтений непрозрачности сквозного изображения варьируются от 0.0f
(нулевая непрозрачность, при которой проходная поверхность не видна) до 1.0f
(полная непрозрачность, при которой сквозная поверхность скрывает пространственную среду). Параметр setPassthroughOpacityPreference
представляет собой число с плавающей запятой, допускающее значение NULL. Установка значения null означает, что приложение не имеет предпочтений непрозрачности при сквозной передаче и вернет управление сквозной передачей в систему.
Основное использование
Этот фрагмент кода устанавливает предпочтения непрозрачности при сквозной передаче. Это предпочтение будет запомнено и применено, когда приложение сможет установить сквозную непрозрачность.
// 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
}
Расширенное использование
Для более сложных случаев использования, когда вам требуется более точный контроль над непрозрачностью сквозной передачи, вы можете включить проверки SpatialCapabilities
и реализовать addOnPassthroughOpacityChangedListener
чтобы определить, когда вы хотите установить предпочтение непрозрачности сквозной передачи.
Оптимизация активов
При создании ресурсов для настройки SpatialEnvironment
ваших пользователей вам необходимо убедиться, что ваши ресурсы достигают высокого качества разрешения при сохранении разумного размера файла. Вам нужно убедиться, что ваш glb использует MIP-карты и текстуры KTX2. Вы также должны быть чувствительны к количеству полигонов в ваших файлах glb, поскольку большое количество полигонов может привести к ненужному энергопотреблению. Большая часть размера файла для большинства экземпляров SpatialEnvironment
приходится на изображение, используемое для Skybox. Чтобы убедиться, что ваши изображения оптимизированы, запустите ресурсы с помощью инструмента оптимизации (например, ktx ).
Определить текущую непрозрачность прохождения
val currentPassthroughOpacity = session.spatialEnvironment.getCurrentPassthroughOpacity()