При работе с 3D-моделями Jetpack XR SDK поддерживает открытый стандарт glTF 2.0 . При рендеринге приложений, созданных с помощью Jetpack XR SDK, в Android XR используются методы физически корректного рендеринга (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, Paths.get("models", "saturn_rings.glb"))
На этом этапе модель загружена в память, но пока не визуализируется. Если вам нужно загрузить много 3D-моделей или ваша модель большая, рекомендуется загружать их асинхронно заранее. Таким образом, пользователям не придётся ждать, пока модели загрузятся в память.
Нам нужно добавить glTF в ActivitySpace . Вызовите метод GltfModelEntity.create , чтобы создать сущность и поместить её в ActivitySpace . Рекомендуется убедиться, что приложение находится в состоянии, допускающем пространственные возможности .
if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_3D_CONTENT)) { val gltfEntity = GltfModelEntity.create(session, gltfModel) }
Теперь при запуске приложения вы должны увидеть загруженную 3D-модель.

Поместите 3D-модель в Compose SceneCoreEntity
Хотя вам всё равно потребуется загрузить glTF в память с помощью GltfModel.create() , вы можете поместить 3D-модели в SceneCoreEntity , если создаёте пользовательский интерфейс с помощью Jetpack Compose для XR. Подробнее см. в разделе Использование SceneCoreEntity для размещения 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-моделей. Эти возможности доступны как через GltfModelEntity , так и через 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