Quando si utilizzano modelli 3D, l'SDK Jetpack XR supporta lo standard aperto glTF 2.0. Quando Android XR esegue il rendering delle app create con l'SDK Jetpack XR, i modelli 3D vengono visualizzati con le tecniche di rendering basato sulla fisica(PBR) specificate nello standard glTF 2.0 (insieme ai extensions
supportati). La maggior parte degli strumenti di creazione di contenuti digitali (dcc), come Autodesk Maya, Maxon ZBrush, Blender e Spline, può esportare i modelli 3D nel formato glTF (file .gltf
o .glb
).
Se un'atmosfera SpatialEnvironment
è stata specificata dall'utente o dalla tua app, i modelli 3D verranno illuminati con le informazioni sull'illuminazione fornite dall'atmosfera dell'ambiente. Anche i materiali riflettenti e gli highlight speculari rifletteranno lo skybox dell'ambiente. Se il passthrough è stato attivato, l'illuminazione, le riflessioni e gli highlight speculari si baseranno su una stanza semplice e luminosa con una singola luce direzionale.
Per una rapida panoramica dei materiali supportati, consulta le Proprietà PBR glTF sul sito Khronos.
Esistono due modi principali per caricare modelli 3D nelle app create con l'SDK Jetpack XR.
- Caricalo in
ActivitySpace
come descritto nella sezione seguente, Posiziona un modello 3D in ActivitySpace - Utilizzare Scene Viewer integrato tramite un'intenzione
Posiziona un modello 3D in ActivitySpace
Una volta ottenuto il file glTF, il passaggio successivo consiste nell'aggiungerlo alla directory degli asset in Android Studio. Ti consigliamo di creare una directory models
per organizzare meglio i tipi di asset.
Per caricare il modello glTF, chiama createGltfResourceAsync
.
// load the gltf file
val gltfModel = xrSession.createGltfResourceAsync("models/saturn_rings.glb").await()
A questo punto, il modello viene caricato in memoria, ma non viene ancora visualizzato. Se hai molti modelli 3D da caricare o il tuo modello è di grandi dimensioni, ti consigliamo di caricarli in modo asincrono in anticipo. In questo modo, gli utenti non devono attendere che i modelli vengano caricati in memoria.
Dobbiamo aggiungere il file glTF a ActivitySpace
. Chiama
createGltfEntity
per creare un'entità e inserirla in
ActivitySpace
. Come best practice, devi verificare che l'app sia in uno stato che consenta le funzionalità spaziali.
// 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)
}
Ora dovresti vedere il modello 3D caricato quando esegui l'app.
Posizionare un modello 3D in un volume di composizione
Anche se dovrai comunque caricare il modello glTF in memoria utilizzando
createGltfResourceAsync
, puoi inserire i modelli 3D in un
Volume
se stai creando l'interfaccia utente con Jetpack Compose per VR. Consulta l'articolo Utilizzare un volume per posizionare un oggetto 3D nel layout.
Animare i modelli 3D
Nell'ambito della specifica glTF, i modelli 3D possono avere animazioni incorporate.
Le animazioni scheletriche (con animazioni), rigide e morph target (forme di miscela) sono tutte supportate nell'SDK Jetpack XR. Sono supportate anche le animazioni dei materiali create con l'KHR_animation_pointer
estensione glTF.
Per riprodurre un'animazione, chiama startAnimation
e specifica il nome dell'animazione. Facoltativamente, puoi specificare se l'animazione deve ripetersi all'infinito o meno.
//start a looping walk animation for a model
gltfEntity.startAnimation(loop = true, animationName = "Walk")
Se chiami startAnimation
una seconda volta, l'animazione corrente si interrompe e inizia la nuova animazione.
Puoi eseguire query sullo stato corrente dell'animazione tramite
getAnimationState()
.
Se il nome dell'animazione specificato durante la chiamata a startAnimation()
non esiste,
la chiamata non va a buon fine, tutte le animazioni in esecuzione si arrestano e getAnimationState()
restituisce STOPPED
.
Caricare un modello 3D utilizzando Scene Viewer
Se stai cercando il modo più semplice per caricare un modello 3D con funzionalità di interazione di base, puoi scegliere di utilizzare Scene Viewer come faresti su dispositivo mobile. Una differenza fondamentale tra Scene Viewer su Android VR e su dispositivi mobili è che Scene Viewer supporta solo il parametro URI del file che rimanda al file glTF e tutti gli altri parametri vengono ignorati.
Scene Viewer è un'app separata che viene richiamata tramite un'intent e viene eseguita in modalità Spazio Completo. Di conseguenza, quando la richiami, la tua app non sarà più visibile e Scene Viewer avrà il focus. Tutti gli ambienti che potresti aver modificato verranno reimpostati in base alle preferenze di sistema dell'utente.
Ecco un esempio di utilizzo di un Intent
per visualizzare un file glTF in Scene Viewer su 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)
Per saperne di più sulle opzioni di interattività per Scene Viewer, consulta la nostra documentazione sulla progettazione di modelli 3D.
Estensioni glTF
L'SDK Jetpack XR supporta diverse estensioni glTF che espandono le funzionalità dei modelli 3D. Queste funzionalità sono disponibili sia tramite GltfEntity
sia tramite 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