Настраивайте 3D-модели в своем приложении.

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

Прежде чем настраивать 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 .

Рисунок 1. Пример изменения базовых цветов на 3D-модели.

Чтобы настроить свойства материала вашей 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 .

Рисунок 2. Пример изменения текстуры на 3D-модели.

Чтобы загрузить пользовательскую текстуру, сначала необходимо сохранить файл изображения в папку /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.