Adicionar modelos 3D ao app

Dispositivos XR aplicáveis
Estas orientações ajudam você a criar experiências para esses tipos de dispositivos de XR.
Headsets de realidade estendida
Óculos XR com fio

Ao trabalhar com modelos 3D, o SDK Jetpack XR é compatível com o padrão aberto glTF 2.0. Quando o Android XR renderiza apps criados com o SDK do Jetpack para XR, os modelos 3D são renderizados com técnicas de renderização baseada em física(PBR) especificadas no padrão glTF 2.0 (junto com extensões compatíveis). A maioria das ferramentas de criação de conteúdo digital (DCC), como Autodesk Maya, Maxon ZBrush, Blender e Spline, pode exportar modelos 3D para o formato glTF (arquivos .gltf ou .glb).

Se uma skybox SpatialEnvironment tiver sido especificada pelo usuário ou pelo app, os modelos 3D serão iluminados com as informações de iluminação fornecidas pela skybox do ambiente. Materiais reflexivos e destaques especulares também vão refletir a skybox do ambiente. Se a transmissão tiver sido ativada, a iluminação, os reflexos e os destaques especulares serão baseados em um ambiente simples e iluminado com uma única luz direcional.

Para uma visão geral rápida dos materiais compatíveis, consulte as propriedades PBR do glTF no site da Khronos.

Há duas maneiras principais de os apps criados com o SDK Jetpack XR carregarem modelos 3D.

Colocar um modelo 3D no ActivitySpace

Depois de ter o arquivo glTF, a próxima etapa é adicioná-lo ao diretório de recursos no Android Studio. Recomendamos criar um diretório models para organizar melhor seus tipos de recursos.

Exemplo de adição de recursos ao diretório /models

Para carregar o modelo glTF, chame GltfModel.create().

val gltfModel = GltfModel.create(session, Paths.get("models", "saturn_rings.glb"))

Neste ponto, o modelo é carregado na memória, mas ainda não está sendo renderizado. Se você tiver muitos modelos 3D para carregar ou se o modelo for grande, é recomendável carregá-los de forma assíncrona com antecedência. Assim, os usuários não precisam esperar que seus modelos sejam carregados na memória.

Precisamos adicionar o glTF ao ActivitySpace. Chame GltfModelEntity.create para criar uma entidade e colocá-la no ActivitySpace. Como prática recomendada, verifique se o app está em um estado que permite recursos espaciais.

if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_3D_CONTENT)) {
    val gltfEntity = GltfModelEntity.create(session, gltfModel)
}

Agora, você vai ver o modelo 3D carregado ao executar o app.

Exemplo do modelo 3D carregado

Colocar um modelo 3D em um Compose SceneCoreEntity

Embora ainda seja necessário carregar o glTF na memória usando GltfModel.create(), você pode colocar modelos 3D em um SceneCoreEntity se estiver criando sua interface com o Jetpack Compose para XR. Consulte Usar um SceneCoreEntity para colocar um objeto 3D no layout.

Animar modelos 3D

Como parte da especificação glTF, os modelos 3D podem ter animações incorporadas. Animações esqueléticas (manipuladas), rígidas e de destino de transformação (formas de combinação) são todas compatíveis com o SDK do Jetpack XR. Também há suporte para animações do Material criadas com a extensão glTF KHR_animation_pointer.

Para reproduzir uma animação, chame startAnimation() e especifique o nome dela. Você pode especificar se a animação deve ficar em loop indefinidamente.

gltfEntity.startAnimation(loop = true, animationName = "Walk")

Ao chamar startAnimation uma segunda vez, a animação atual será interrompida e a nova animação será iniciada.

É possível consultar o estado atual da animação usando getAnimationState().

Se o nome da animação especificado ao chamar startAnimation() não existir, a chamada vai falhar silenciosamente, todas as animações em execução serão interrompidas e getAnimationState() vai retornar STOPPED.

Carregar um modelo 3D usando o Scene Viewer

Se você estiver procurando a maneira mais simples de carregar um modelo 3D com recursos básicos de interação, use o Scene Viewer como faria em um dispositivo móvel. Uma diferença importante entre o Scene Viewer no Android XR e em dispositivos móveis é que ele só aceita o parâmetro de URI de arquivo que aponta para o arquivo glTF. Todos os outros parâmetros são ignorados.

O Scene Viewer é um app separado que é invocado usando uma intent e executado no Modo de Espaço Ampliado. Como resultado, quando você o invocar, seu app não vai mais ficar visível e o Scene Viewer vai estar em foco. Todos os ambientes que você mudou serão redefinidos para as preferências do sistema do usuário.

Confira um exemplo de uso de um Intent para ver um arquivo glTF no Scene Viewer no 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.
}

Para mais informações sobre as opções de interatividade do Scene Viewer, consulte nossa documentação de design de modelos 3D.

Extensões glTF

O SDK Jetpack XR é compatível com várias extensões gfTF que ampliam os recursos de modelos 3D. Esses recursos estão disponíveis no GltfModelEntity e no Scene Viewer.