Прежде чем настраивать 3D-модель, необходимо сначала добавить её в приложение . После добавления 3D-модели в приложение вы можете улучшить визуальное и интерактивное взаимодействие, настроив внешний вид и движения модели.
Например, вы можете воспроизводить и управлять встроенными glTF-анимациями, получать доступ к узлам, составляющим вашу модель, и перемещать их, а также загружать пользовательские текстуры и определять свойства материалов для переопределения внутренних сеток. Эти возможности позволяют динамически изменять внешний вид и поведение объекта во время выполнения.
3D-объекты в Android XR
Jetpack XR SDK поддерживает открытый стандарт glTF 2.0 от Khronos Group для 3D-моделей и отображает эти объекты с использованием методов физически корректного рендеринга (PBR), описанных в стандарте glTF 2.0 (вместе с поддерживаемыми расширениями ). glTF (Graphics Library Transmission Format) — это стандартный формат файлов для передачи и загрузки 3D-сцен и моделей. Модель glTF состоит из иерархической структуры внутренних компонентов.
Вот основные компоненты, которые необходимо понимать:
- Узлы : Они определяют структуру и иерархию модели. Каждый узел может иметь собственное положение, вращение и масштаб.
- Сетки : Структурная трехмерная геометрия, формирующая форму трехмерного объекта.
- Материалы : Они определяют внешний вид сетки , например, ее цвет, шероховатость или реакцию на освещение.
- Текстуры : Графический ресурс, например, файл PNG, который можно применить к поверхности 3D-модели для создания пользовательских узоров, цвета, деталей или других визуальных эффектов.
- Анимация : это предопределенные последовательности или анимационные дорожки , содержащие изменения отдельных узлов и моделей для создания эффекта движения во времени.
В Jetpack Compose for XR вы отображаете эти файлы с помощью SpatialGltfModel и отслеживаете их состояние загрузки и анимации с помощью SpatialGltfModelState . Для получения дополнительной информации см. раздел «Добавление 3D-моделей в ваше приложение» .
Анимированные 3D-модели
3D-модели могут содержать встроенные анимации. Внутри анимации используются сэмплеры для определения времени и значений движения, а также каналы для соединения этих движений с отдельными узлами и сетками. В SDK Jetpack XR поддерживаются скелетные анимации и анимации материалов, созданные с помощью расширения glTF KHR_animation_pointer .
Для воспроизведения анимации в Compose for XR укажите название конкретной дорожки из списка animations . Используйте animation.start() для начала воспроизведения. При желании вы можете указать скорость, время перемотки и зацикливание анимации, используя SpatialGltfModelAnimation :
val animation = modelState.animations.find { it.name == "Walk" } animation?.animationState?.let { state -> LaunchedEffect(state) { Log.i("SpatialGltfModelAnimationSample", "Animation State: $state") } } DisposableEffect(animation) { animation?.loop() onDispose { animation?.stop() } }
Управление узлами: позы и вращение
Для управления отдельными частями модели и изменения её свойств, таких как вращение или положение, вам потребуется запросить внутренние nodes модели glTF с помощью SpatialGltfModelState .
// Retrieve the list of nodes (individual components/meshes) defined within the glTF model. val entityNodes = modelState.nodes // Find a specific node by name to apply modifications, such as material overrides. val node = entityNodes.find { it.name == "node_name" }
После того, как вы найдете нужный узел, вы можете установить для него localPose , чтобы изменить его 3D-положение и вращение относительно непосредственного родительского узла GltfModelNode , или использовать modelPose чтобы установить положение относительно корневого узла GltfModelEntity . Аналогично, вы можете использовать параметры localScale/modelScale, чтобы изменить масштаб модели относительно ее родителя или корня.
LaunchedEffect(node, degrees) { val rotation = Quaternion.fromEulerAngles(degrees, 0f, degrees) node?.let { it.localPose = Pose(it.localPose.translation, rotation) } }
Настройте свойства материала вашей 3D-модели.
Вы можете настраивать атрибуты материала во время выполнения, чтобы динамически изменять внешний вид объекта в зависимости от ввода пользователя или текущего состояния приложения.
В Jetpack XR для создания и управления этими материалами используются классы KhronosPbrMaterial и KhronosUnlitMaterial . Как следует из названия, KhronosUnlitMaterials не освещены и не подвержены влиянию освещения сцены. KhronosPbrMaterial позволяет настраивать более широкий спектр свойств, таких как цвет блеска, степень металличности или шероховатости объекта, а также излучает ли он свет.
Для получения более подробной информации о каждом поддерживаемом свойстве и настраиваемых параметрах в Android XR см. нашу справочную документацию . Для лучшего понимания этих свойств см. глоссарий Khronos .

Чтобы настроить свойства материала вашей 3D-модели, сначала создайте новый материал с помощью KhronosPbrMaterial . Вам потребуется установить соответствующий AlphaMode для желаемого визуального эффекта:
Далее определите свойства, которые вы хотите изменить. В этом примере используется setBaseColorFactor для изменения базового цвета сетки на фиолетовый. Для этого метода требуется объект Vector4 , где компоненты x, y, z и w соответствуют значениям RGBA (красный, зеленый, синий и альфа-канал) соответственно:
// Maintain a reference to the custom material to avoid re-creating it on every recomposition. var pbrMaterial by remember { mutableStateOf<KhronosPbrMaterial?>(null) } // Create and apply the custom material once the session is ready and the target node is available. LaunchedEffect(node) { val material = KhronosPbrMaterial.create( session = xrSession, alphaMode = AlphaMode.OPAQUE ).also { pbrMaterial = it // Apply a base color factor (RGBA) to change the color of the model. it.setBaseColorFactor( Vector4( x = 0.5f, y = 0.0f, z = 0.5f, w = 1.0f ) ) }
Загрузите пользовательские текстуры для вашей 3D-модели.
Texture — это графический ресурс, который можно применить к поверхности 3D-модели для придания ей цвета, детализации или другой информации о поверхности. API текстур Jetpack XR позволяет асинхронно загружать данные изображений, такие как файлы PNG, из папки /assets/ вашего приложения.
При загрузке текстуры можно указать TextureSampler , который управляет отображением текстуры. Сэмплер определяет свойства фильтрации (когда текстура отображается меньше или больше своего исходного размера) и режимы обертывания (для обработки координат, выходящих за пределы стандартного диапазона [0, 1] ). Для визуального эффекта на 3D-модели Texture должна быть назначена объекту KhronosPbrMaterial .

Чтобы загрузить пользовательскую текстуру, сначала необходимо сохранить файл изображения в папку /assets/ . В качестве рекомендации, вы можете также создать подкаталог textures в этой папке.
После сохранения файла в соответствующей директории создайте текстуру с помощью Texture API. Здесь же, при необходимости, можно применить TextureSampler .
В этом примере применяется текстура окклюзии и задается сила окклюзии:
LaunchedEffect(node) { val material = KhronosPbrMaterial.create( session = xrSession, alphaMode = AlphaMode.OPAQUE ).also { pbrMaterial = it // Load a texture val texture = Texture.create( session = xrSession, path = Path("textures/texture_name.png") ) // Set the texture and configure occlusion to define how the material surface handles ambient lighting. it.setOcclusionTexture( texture = texture, strength = 1.0f ) } node?.setMaterialOverride( material = material ) }
Примените материалы и текстуры к вашим 3D-объектам.
Чтобы применить новый материал или текстуру, переопределите существующий материал для конкретного узла в вашем glTF- узле . Для этого вызовите setMaterialOverride :
node?.setMaterialOverride( material = material )
Чтобы удалить вновь созданные материалы, вызовите clearMaterialOverride для ранее переопределенного узла . Это вернет вашу 3D-модель в состояние по умолчанию:
if (removeMaterial) { node?.clearMaterialOverride() }
glTF и логотип glTF являются товарными знаками Khronos Group Inc.