Lorsque vous travaillez avec des modèles 3D, le SDK Jetpack XR est compatible avec la norme ouverte glTF 2.0. Lorsque Android XR effectue le rendu d'applications créées avec le SDK Jetpack XR, les modèles 3D sont affichés à l'aide de techniques de rendu basé sur la physique(PBR) spécifiées dans la norme glTF 2.0 (avec les extensions
compatibles). La plupart des outils de création de contenu numérique (dcc), tels que Autodesk Maya, Maxon ZBrush, Blender et Spline, peuvent exporter des modèles 3D au format glTF (fichiers .gltf
ou .glb
).
Si un skybox SpatialEnvironment
a été spécifié par l'utilisateur ou par votre application, les modèles 3D seront éclairés à l'aide des informations d'éclairage fournies par le skybox de l'environnement. Les matériaux réfléchissants et les reflets spéculaires reflètent également le skybox de l'environnement. Si la transparence a été activée, l'éclairage, les reflets et les reflets spéculaires seront basés sur une pièce simple et lumineuse avec une seule lumière directionnelle.
Pour obtenir un aperçu rapide des matériaux compatibles, consultez les propriétés PBR glTF sur le site Khronos.
Les applications créées avec le SDK Jetpack XR peuvent charger des modèles 3D de deux manières principales.
- Chargez-le dans
ActivitySpace
comme décrit dans la section suivante, Placer un modèle 3D dans ActivitySpace. - Utiliser le Visionneuse de scènes intégré via un intent
Placer un modèle 3D dans ActivitySpace
Une fois que vous avez votre fichier glTF, l'étape suivante consiste à l'ajouter au répertoire des composants dans Android Studio. Nous vous recommandons de créer un répertoire models
pour mieux organiser vos types d'assets.
Pour charger le modèle glTF, appelez createGltfResourceAsync
.
// load the gltf file
val gltfModel = xrSession.createGltfResourceAsync("models/saturn_rings.glb").await()
À ce stade, le modèle est chargé en mémoire, mais il n'est pas encore affiché. Si vous devez charger de nombreux modèles 3D ou si votre modèle est volumineux, nous vous conseillons de les charger de manière asynchrone à l'avance. Ainsi, les utilisateurs n'ont pas à attendre que vos modèles soient chargés en mémoire.
Nous devons ajouter le glTF dans ActivitySpace
. Appelez createGltfEntity
pour créer une entité et la placer dans ActivitySpace
. Il est recommandé de vérifier que l'application est dans un état qui permet les fonctionnalités spatiales.
// 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)
}
Le modèle 3D chargé devrait maintenant s'afficher lorsque vous exécutez votre application.
Placer un modèle 3D dans un volume Compose
Bien que vous deviez toujours charger le glTF en mémoire à l'aide de createGltfResourceAsync
, vous pouvez placer des modèles 3D dans un Volume
si vous créez votre UI avec Jetpack Compose pour XR. Consultez Utiliser un volume pour placer un objet 3D dans votre mise en page.
Animer des modèles 3D
Conformément à la spécification glTF, les modèles 3D peuvent comporter des animations intégrées.
Les animations squelettiques (riggées), rigides et de cible de morphing (formes de mélange) sont toutes compatibles avec le SDK Jetpack XR. Les animations Material créées avec l'extension glTF KHR_animation_pointer
sont également prises en charge.
Pour lire une animation, appelez startAnimation
et spécifiez le nom de l'animation. Vous pouvez éventuellement spécifier si l'animation doit être en boucle indéfiniment.
//start a looping walk animation for a model
gltfEntity.startAnimation(loop = true, animationName = "Walk")
Si vous appelez startAnimation
une seconde fois, l'animation en cours s'arrête et la nouvelle animation démarre.
Vous pouvez interroger l'état actuel de l'animation via getAnimationState()
.
Si le nom de l'animation spécifié lors de l'appel de startAnimation()
n'existe pas, l'appel échoue de manière silencieuse, toutes les animations en cours d'exécution s'arrêtent et getAnimationState()
renvoie STOPPED
.
Charger un modèle 3D à l'aide de Scene Viewer
Si vous recherchez le moyen le plus simple de charger un modèle 3D avec des fonctionnalités d'interaction de base, vous pouvez utiliser Scene Viewer comme vous le feriez sur mobile. Une différence clé entre Scene Viewer sur Android XR et sur mobile est que Scene Viewer n'est compatible qu'avec le paramètre URI de fichier pointant vers le fichier glTF, et que tous les autres paramètres sont ignorés.
Scene Viewer est une application distincte qui est appelée via un intent et s'exécute en mode Full Space. Par conséquent, lorsque vous l'appelez, votre application n'est plus visible et le Scene Viewer est actif. Tous les environnements que vous avez modifiés seront réinitialisés selon les préférences système de l'utilisateur.
Voici un exemple d'utilisation d'un Intent
pour afficher un fichier glTF dans Scene Viewer sur 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)
Pour en savoir plus sur les options d'interactivité du Scene Viewer, consultez notre documentation sur la conception de modèles 3D.
Extensions glTF
Le SDK Jetpack XR est compatible avec plusieurs extensions gfTF qui étendent les fonctionnalités des modèles 3D. Ces fonctionnalités sont disponibles à la fois dans GltfEntity
et dans l'outil de visualisation de scènes.
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