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

Поддерживаемые XR-устройства
Это руководство поможет вам создавать продукты для таких 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-модели будут освещены в соответствии с информацией об освещении, предоставленной скайбоксом среды. Отражающие материалы и зеркальные блики также будут отражать скайбокс окружения. Если сквозной режим включен, освещение, отражения и блики будут такими же, как в светлой комнате с одним направленным источником света.

Краткий обзор поддерживаемых материалов можно найти в разделе glTF PBR Properties (Свойства glTF PBR) на сайте Khronos. Подробнее о том, как настраивать 3D-модели в приложении…

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

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

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

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

Android XR поддерживает формат glTF для 3D-моделей, обычно сохраняемых в виде файлов .glb. Чтобы добавить эти объекты в макет, используйте SpatialGltfModel. SpatialGltfModel – это composable-функция подпространства, которая позволяет добавлять 3D-модели в формате glTF в пространственный макет. Этот 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)

Важные сведения о коде

  • Асинхронная загрузка. Модель загружается асинхронно. Во время первоначальной композиции его внутренний размер может быть равен нулю; макет повторно измеряется, как только модель будет готова.
  • Управление состоянием. Используйте SpatialGltfModelState.status, чтобы запрашивать статус загрузки или управлять анимацией.
  • Размеры и масштабирование. По умолчанию размер макета соответствует граничной рамке объекта. Вы можете переопределить это поведение с помощью SubspaceModifier.size, чтобы равномерно масштабировать модель в соответствии с заданными границами.

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

Чтобы разместить 3D-модель с помощью SceneCoreEntity, сначала нужно загрузить glTF в память с помощью GltfModel.create(). Затем вы можете поместить 3D-модель в SceneCoreEntity, чтобы связать компоненты SceneCore с макетами Compose for 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

Если вам нужен самый простой способ загрузить 3D-модель с базовыми возможностями взаимодействия, вы можете использовать Scene Viewer так же, как на мобильном устройстве. Основное различие между Scene Viewer на Android XR и мобильных устройствах заключается в том, что Scene Viewer поддерживает только параметр URI файла, указывающий на файл glTF, а все остальные параметры игнорируются.

Scene Viewer – это отдельное приложение, которое вызывается с помощью намерения и работает в режиме полного пространства. В результате при вызове 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.