Как добавить в приложение 3D-модели

Поддерживаемые XR-устройства
Это руководство поможет вам создавать контент для таких устройств.
XR-шлемы
Проводные XR-очки

При работе с 3D-моделями Jetpack XR SDK поддерживает открытый стандарт glTF 2.0. Когда Android XR отрисовывает приложения, созданные с помощью Jetpack XR SDK, 3D-модели будут отрисовываться с использованием физически корректной отрисовки(PBR), указанной в стандарте glTF 2.0 (вместе с поддерживаемыми расширениями). Большинство инструментов для создания цифрового контента, например Autodesk Maya, Maxon ZBrush, Blender и Spline, позволяют экспортировать 3D-модели в формат glTF (файлы .gltf или .glb).

Если пользователь или ваше приложение задали SpatialEnvironment скайбокс, 3D-модели будут освещены в соответствии с информацией, предоставленной скайбоксом окружения. Отражающие материалы и блики также будут отражать скайбокс окружения. Если сквозной режим включен, освещение, отражения и блики будут основаны на ярком освещении комнаты с одним направленным источником света.

Краткую информацию о поддерживаемых материалах можно найти на сайте Khronos в разделе glTF PBR Properties. Чтобы узнать, как задать эти и другие свойства для 3D-моделей, ознакомьтесь с разделом Как настроить 3D-модели в приложении.

Как добавить файл glTF в папку объектов

После того как у вас появится файл glTF, следующим шагом будет добавление его в каталог ресурсов в Android Studio. Мы рекомендуем создать каталог models, чтобы упорядочить объекты.

Пример добавления объектов в каталог /models

Как добавить 3D-объект с помощью SpatialGltfModel

Android XR поддерживает формат glTF для 3D-моделей, которые обычно сохраняются в виде файлов .glb. Чтобы добавить эти объекты в макет, используйте composable-функцию SpatialGltfModel. Этот API упрощает процесс загрузки объектов и управления их состоянием.

Чтобы отобразить модель, сначала определите ее источник и состояние с помощью rememberSpatialGltfModelState. Вы можете загружать модели из папки assets приложения, URI или raw data.

val modelState = rememberSpatialGltfModelState(
    source = SpatialGltfModelSource.fromPath(
        Paths.get("models/model_name.glb")
    )
)

После того как состояние определено, используйте composable-функцию SpatialGltfModel, чтобы отрисовать его в подпространстве.

SpatialGltfModel(state = modelState, modifier = SubspaceModifier)

Как разместить 3D-модель с помощью Compose SceneCoreEntity

Чтобы разместить 3D-модель с помощью SceneCoreEntity, сначала нужно загрузить glTF в память с помощью GltfModel.create(). Затем вы можете поместить 3D-модель в SceneCoreEntity, чтобы связать компоненты SceneCore с макетами Compose для XR. Подробнее о том, как разместить 3D-объект в макете с помощью SceneCoreEntity…

Как разместить 3D-модель с помощью Jetpack Scenecore

Чтобы загрузить модель 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-модели

Как загрузить 3D-модель с помощью Scene Viewer

Если вам нужно загрузить трехмерную модель с базовыми возможностями взаимодействия, вы можете использовать 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 поддерживает несколько расширений glTF, которые расширяют возможности 3D-моделей. Эти возможности доступны как в GltfModelEntity, так и в Scene Viewer.