При работе с 3D-моделями Jetpack XR SDK поддерживает открытый стандарт glTF 2.0 . Когда Android XR визуализирует приложения, созданные с помощью Jetpack XR SDK, 3D-модели будут визуализироваться с использованием методов физического рендеринга (PBR), указанных в стандарте glTF 2.0 (вместе с поддерживаемыми extensions
). Большинство инструментов создания цифрового контента (dcc), таких как Autodesk Maya , Maxon ZBrush , Blender и Spline, могут экспортировать 3D-модели в формат glTF (файлы .gltf
или .glb
).
Если скайбокс SpatialEnvironment
указан пользователем или вашим приложением, 3D-модели будут освещены информацией об освещении, предоставленной скайбоксом среды. Светоотражающие материалы и зеркальные блики также будут отражать окружающий скайбокс. Если сквозной режим включен, то освещение, отражения и зеркальные блики будут основаны на простой яркой комнате с одним направленным источником света.
Краткий обзор поддерживаемых материалов можно найти в разделе «Свойства glTF PBR» на сайте Khronos.
Существует два основных способа загрузки 3D-моделей в приложениях, созданных с помощью Jetpack XR SDK.
- Загрузите ее в
ActivitySpace
, как описано в следующем разделе. Поместите 3D-модель в ActivitySpace. - Используйте встроенный просмотрщик сцен через намерение
Разместите 3D-модель в ActivitySpace.
Когда у вас есть файл glTF, следующим шагом будет добавление его в каталог ресурсов в Android Studio. Мы рекомендуем создать каталог models
, чтобы лучше организовать типы активов.
Чтобы загрузить модель glTF, вызовите createGltfResourceAsync
.
// load the gltf file
val gltfModel = xrSession.createGltfResourceAsync("models/saturn_rings.glb").await()
На этом этапе модель загружается в память, но еще не визуализируется. Если вам нужно загрузить много 3D-моделей или ваша модель большая, рекомендуется заранее загрузить их асинхронно. Таким образом, пользователям не придется ждать загрузки ваших моделей в память.
Нам нужно добавить glTF в ActivitySpace
. Вызовите createGltfEntity
, чтобы создать сущность и поместить ее в ActivitySpace
. Рекомендуется убедиться, что приложение находится в состоянии, позволяющем использовать пространственные возможности .
// check for spatial capabilities
if (xrSession.getSpatialCapabilities().hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_3D_CONTENT)){
// create the gltf entity using the gltf file from the previous snippet
val gltfEntity = xrSession.createGltfEntity(gltfModel)
}
Теперь вы должны видеть загруженную 3D-модель при запуске приложения.
Поместите 3D-модель в Compose Volume.
Хотя вам все равно потребуется загрузить glTF в память с помощью createGltfResourceAsync
, вы можете поместить 3D-модели в Volume
, если создаете свой пользовательский интерфейс с помощью Jetpack Compose для XR. См. раздел Использование объема для размещения 3D-объекта в макете .
Анимация 3D-моделей
В рамках спецификации glTF в 3D-модели может быть встроена анимация. Скелетная (оснащенная), жесткая, целевая анимация морфинга (смешивания форм) поддерживается в Jetpack XR SDK. Также поддерживаются анимации материалов, созданные с помощью расширения KHR_animation_pointer
glTF .
Чтобы воспроизвести анимацию, вызовите startAnimation
и укажите имя анимации. При желании вы можете указать, должна ли анимация зацикливаться бесконечно.
//start a looping walk animation for a model
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 — это отдельное приложение, которое вызывается через намерение и работает в режиме полного пространства. В результате, когда вы его вызываете, ваше приложение больше не будет видимым, а просмотрщик сцен будет иметь фокус. Любые среды, которые вы могли изменить, будут сброшены до системных настроек пользователя.
Вот пример использования Intent
для просмотра файла glTF в Scene Viewer на Android XR:
val THREED_MODEL_URL = "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/FlightHelmet/glTF/FlightHelmet.gltf"
val MIME_TYPE = "model/gltf-binary"
val sceneViewerIntent = Intent(Intent.ACTION_VIEW)
val intentUri =
Uri.parse("https://arvr.google.com/scene-viewer/1.2")
.buildUpon()
.appendQueryParameter("file", THREED_MODEL_URL)
.build()
sceneViewerIntent.setDataAndType(intentUri, MIME_TYPE)
startActivity(sceneViewerIntent)
Дополнительную информацию о возможностях интерактивности 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