Ao trabalhar com modelos 3D, o SDK do Jetpack XR oferece suporte ao padrão aberto glTF
2.0. Quando o Android XR renderiza apps criados com o
SDK Jetpack XR, os modelos 3D são renderizados com técnicas de renderização
baseada na física(PBR, na sigla em inglês) especificadas no padrão glTF 2.0
(com extensions
com suporte). 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 um skybox SpatialEnvironment
tiver sido especificado pelo usuário
ou pelo app, os modelos 3D vão ser iluminados com informações de iluminação fornecidas pelo
skybox do ambiente. Materiais reflexivos e destaques especulares também
refletirão o skybox do ambiente. Se a passagem tiver sido ativada, a
iluminação, os reflexos e os destaques especulares serão baseados em um ambiente simples e
claro com uma única luz direcional.
Para uma visão geral rápida dos materiais com suporte, consulte as Propriedades glTF PBR no site da Khronos.
Há duas maneiras principais de apps criados com o SDK do Jetpack XR carregar modelos 3D.
- Carregue-o no
ActivitySpace
, conforme descrito na seção a seguir, Coloque um modelo 3D no ActivitySpace. - Usar o Visualizador de cena integrado por uma intent
Colocar um modelo 3D no espaço de atividades
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
os tipos de recursos.
Para carregar o modelo glTF, chame createGltfResourceAsync
.
// load the gltf file
val gltfModel = xrSession.createGltfResourceAsync("models/saturn_rings.glb").await()
Nesse 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. Dessa forma, os usuários não precisam esperar que os modelos sejam carregados na memória.
Precisamos adicionar o glTF ao ActivitySpace
. Chame
createGltfEntity
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.
// check for spatial capabilities
if (xrSession.getSpatialCapabilities().hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_3D_CONTENT)){
// create the gltf entity using the gltf file from the previous snippet
val gltfEntity = xrSession.createGltfEntity(gltfModel)
}
Agora você vai ver o modelo 3D carregado quando executar o app.
Colocar um modelo 3D em um volume do Compose
Embora você ainda precise carregar o glTF na memória usando
createGltfResourceAsync
, é possível colocar modelos 3D em um
Volume
se estiver criando a interface com o Jetpack Compose para
XR. Consulte Usar um volume para colocar um objeto 3D no layout.
Animar modelos 3D
Como parte da especificação do glTF, os modelos 3D podem ter animações incorporadas.
O SDK do Jetpack XR oferece suporte a animações de esqueleto (rigged), rígidas e de transformação (mistura de formas). 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 da animação. Você pode especificar se a animação
precisa ser repetida indefinidamente.
//start a looping walk animation for a model
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 falhará silenciosamente, todas as animações em execução serão interrompidas e getAnimationState()
retornará STOPPED
.
Carregar um modelo 3D usando o Visualizador de cena
Se você está 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 no dispositivo móvel é que o Scene Viewer só oferece suporte ao parâmetro URI do arquivo que aponta para o arquivo glTF, e todos os outros parâmetros são ignorados.
O Scene Viewer é um app separado que é invocado por uma intent e executado no modo de espaço total. Como resultado, quando você o invocar, o app não estará mais visível e o Scene Viewer terá o 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
acessar um arquivo glTF no Scene Viewer no Android XR:
val THREED_MODEL_URL = "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/FlightHelmet/glTF/FlightHelmet.gltf"
val MIME_TYPE = "model/gltf-binary"
val sceneViewerIntent = Intent(Intent.ACTION_VIEW)
val intentUri =
Uri.parse("https://arvr.google.com/scene-viewer/1.2")
.buildUpon()
.appendQueryParameter("file", THREED_MODEL_URL)
.build()
sceneViewerIntent.setDataAndType(intentUri, MIME_TYPE)
startActivity(sceneViewerIntent)
Para mais informações sobre as opções de interatividade do Scene Viewer, consulte nossa documentação de design de modelos 3D.
Extensões do glTF
O SDK Jetpack XR oferece suporte a várias extensões do gfTF que ampliam os recursos de
modelos 3D. Esses recursos estão disponíveis no
GltfEntity
e no Scene Viewer.
KHR_animation_pointer
KHR_draco_mesh_compression
KHR_lights_punctual
KHR_materials_clearcoat
KHR_materials_sheen
KHR_materials_unlit
KHR_materials_variants
KHR_mesh_quantization
KHR_texture_basisu
KHR_texture_transform
EXT_texture_webp