При работе с 3D-моделями Jetpack XR SDK поддерживает открытый стандарт glTF 2.0 . Когда Android XR визуализирует приложения, созданные с помощью Jetpack XR SDK, 3D-модели будут визуализироваться с помощью методов физически обоснованного рендеринга (PBR), указанных в стандарте glTF 2.0 (вместе с поддерживаемыми расширениями ). Большинство инструментов создания цифрового контента (dcc), таких как Autodesk Maya , Maxon ZBrush , Blender и Spline, могут экспортировать 3D-модели в формат glTF (файлы .gltf
или .glb
).
Если пользователем или вашим приложением указан скайбокс SpatialEnvironment
, 3D-модели будут освещены с помощью информации об освещении, предоставленной скайбоксом окружения. Отражающие материалы и зеркальные блики также будут отражать скайбокс окружения. Если включено сквозное прохождение, то освещение, отражения и зеркальные блики будут основаны на простой, яркой комнате с одним направленным светом.
Краткий обзор поддерживаемых материалов можно найти в свойствах glTF PBR на сайте Khronos.
Для приложений, созданных с помощью Jetpack XR SDK, существует два основных способа загрузки 3D-моделей.
- Загрузите его в
ActivitySpace
, как описано в разделе Размещение 3D-модели вActivitySpace
- Используйте встроенный просмотрщик сцен с помощью намерения
Поместите 3D-модель в ActivitySpace
После того, как у вас есть файл glTF, следующим шагом будет добавление его в каталог активов в Android Studio. Мы рекомендуем создать каталог models
, чтобы лучше организовать типы активов.
Чтобы загрузить модель glTF, вызовите GltfModel.create()
.
val gltfModel = GltfModel.create(session, "models/saturn_rings.glb").await()
На этом этапе модель загружается в память, но пока не визуализируется. Если вам нужно загрузить много 3D-моделей или ваша модель большая, хорошей идеей будет загрузить их асинхронно заранее. Таким образом, пользователям не придется ждать, пока ваши модели загрузятся в память.
Нам нужно добавить glTF в ActivitySpace
. Вызовите GltfModelEntity.create
для создания сущности и поместите ее в ActivitySpace
. В качестве наилучшей практики следует проверить, что приложение находится в состоянии, допускающем пространственные возможности .
if (session.scene.spatialCapabilities .hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_3D_CONTENT) ) { val gltfEntity = GltfModelEntity.create(session, gltfModel) }
Теперь при запуске приложения вы должны увидеть загруженную 3D-модель.
Поместите 3D-модель в Compose Volume
Хотя вам все равно придется загружать glTF в память с помощью GltfModel.create()
, вы можете поместить 3D-модели в Volume
, если создаете свой пользовательский интерфейс с помощью Jetpack Compose для XR. См. раздел Использование Volume для размещения 3D-объекта в вашем макете .
Анимация 3D-моделей
В рамках спецификации glTF 3D-модели могут иметь встроенную анимацию. Скелетная (связанная), жесткая, морфинг-целевая (смешанные формы) анимация поддерживается в Jetpack XR SDK. Анимации материалов, созданные с помощью расширения KHR_animation_pointer
glTF, также поддерживаются.
Чтобы воспроизвести анимацию, вызовите startAnimation()
и укажите имя анимации. Вы можете дополнительно указать, должна ли анимация воспроизводиться бесконечно.
gltfEntity.startAnimation(loop = true, animationName = "Walk")
При повторном вызове startAnimation
текущая анимация остановится и начнется новая.
Вы можете запросить текущее состояние анимации с помощью getAnimationState()
.
Если имя анимации, указанное при вызове startAnimation()
, не существует, вызов автоматически завершается неудачей, все запущенные анимации останавливаются, а getAnimationState()
возвращает STOPPED
.
Загрузите 3D-модель с помощью Scene Viewer
Если вы ищете самый простой способ загрузки 3D-модели с базовыми возможностями взаимодействия, вы можете использовать Scene Viewer так же, как и на мобильном устройстве . Ключевое различие между Scene Viewer на Android XR и на мобильном устройстве заключается в том, что Scene Viewer поддерживает только параметр URI файла, указывающий на файл glTF, а все остальные параметры игнорируются.
Scene Viewer — это отдельное приложение, которое вызывается с помощью намерения и работает в режиме полного пространства. В результате, когда вы его вызываете, ваше приложение больше не будет видно, а Scene Viewer будет в фокусе. Любые среды, которые вы могли изменить, будут сброшены до системных настроек пользователя.
Вот пример использования Intent
для просмотра файла glTF в Scene Viewer на Android XR:
val url = "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Avocado/glTF/Avocado.gltf" val sceneViewerIntent = Intent(Intent.ACTION_VIEW) val intentUri = Uri.parse("https://arvr.google.com/scene-viewer/1.2") .buildUpon() .appendQueryParameter("file", url) .build() sceneViewerIntent.setData(intentUri) try { startActivity(sceneViewerIntent) } catch (e: ActivityNotFoundException) { // There is no activity that could handle the intent. }
Более подробную информацию о возможностях интерактивности Scene Viewer можно найти в нашей документации по проектированию 3D-моделей .
расширения glTF
Jetpack XR SDK поддерживает несколько расширений gfTF, которые расширяют возможности 3D-моделей. Эти возможности доступны как через GltfEntity
, так и через Scene Viewer.
-
KHR_animation_pointer
-
KHR_draco_mesh_compression
-
KHR_lights_punctual
-
KHR_materials_clearcoat
-
KHR_materials_sheen
-
KHR_materials_unlit
-
KHR_materials_variants
-
KHR_mesh_quantization
-
KHR_texture_basisu
-
KHR_texture_transform
-
EXT_texture_webp