Aggiungere modelli 3D all'app

Dispositivi XR applicabili
Queste indicazioni ti aiutano a creare esperienze per questi tipi di dispositivi XR.
Visori XR
Occhiali XR con cavo

Quando si lavora con i modelli 3D, Jetpack XR SDK supporta lo standard aperto glTF 2.0. Quando Android XR esegue il rendering delle app create con il Jetpack XR SDK, i modelli 3D vengono sottoposti a rendering con tecniche di rendering basato sulla fisica(PBR) specificate nello standard glTF 2.0 (insieme alle estensioni supportate). La maggior parte degli strumenti di creazione di contenuti digitali (DCC) , come Autodesk Maya, Maxon ZBrush, Blender e Spline, può esportare modelli 3D nel formato glTF (.gltf o .glb file).

Se l'utente o la tua app ha specificato una skybox SpatialEnvironment, i modelli 3D verranno illuminati con le informazioni sull'illuminazione fornite dalla skybox dell'ambiente. Anche i materiali riflettenti e le luci speculari rifletteranno la skybox dell'ambiente. Se il passthrough è stato attivato, l'illuminazione, i riflessi e le luci speculari si baseranno su una stanza luminosa con una singola luce direzionale.

Per una rapida panoramica dei materiali supportati, consulta le proprietà PBR glTF sul sito di Khronos. Per scoprire come personalizzare i tuoi modelli 3D con queste e altre proprietà, consulta Personalizzare i modelli 3D nella tua app

Aggiungere un file glTF alla cartella degli asset

Una volta che hai 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.

Esempio di aggiunta di asset alla directory /models

Aggiungere un oggetto 3D utilizzando SpatialGltfModel

Android XR supporta il formato glTF per i modelli 3D, in genere salvati come .glb file. Per aggiungere questi oggetti al layout, utilizza il SpatialGltfModel componibile. Questa API semplifica il processo di caricamento degli asset e di gestione del loro stato.

Per visualizzare un modello, definisci prima la sua origine e il suo stato utilizzando rememberSpatialGltfModelState. Puoi caricare i modelli dalla cartella assets della tua app, da un URI o da raw data.

val modelState = rememberSpatialGltfModelState(
    source = SpatialGltfModelSource.fromPath(
        Paths.get("models/model_name.glb")
    )
)

Una volta definito lo stato, utilizza il componibile SpatialGltfModel per eseguirne il rendering all'interno di un sottospazio.

SpatialGltfModel(state = modelState, modifier = SubspaceModifier)

Posizionare un modello 3D utilizzando un oggetto SceneCoreEntity di Compose

Per posizionare un modello 3D utilizzando SceneCoreEntity, devi prima caricare il file glTF in memoria utilizzando GltfModel.create(). Puoi quindi inserire un modello 3D in un SceneCoreEntity per collegare i componenti SceneCore con i layout di Compose per XR. Consulta Utilizzare un oggetto SceneCoreEntity per posizionare un oggetto 3D nel layout.

Posizionare un modello 3D utilizzando Jetpack Scenecore

Per caricare il modello glTF, chiama GltfModel.create().

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

A questo punto, il modello viene caricato in memoria, ma non viene ancora sottoposto a rendering. Se devi caricare molti modelli 3D o se il modello è di grandi dimensioni, ti consigliamo di caricarli in modo asincrono in anticipo. In questo modo, gli utenti non devono attendere il caricamento dei modelli in memoria.

Aggiungi il file glTF a ActivitySpace. Chiama GltfModelEntity.create per creare un'entità e inserirla nel ActivitySpace. Come best practice, devi verificare che l'app sia in uno stato che consenta le funzionalità spaziali.

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

Ora dovresti vedere il modello 3D caricato quando esegui l'app.

Esempio del modello 3D caricato

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 XR e su dispositivo mobile è che Scene Viewer supporta solo il parametro URI del file che punta al file glTF e tutti gli altri parametri vengono ignorati.

Scene Viewer è un'app separata che viene richiamata utilizzando un intent e viene eseguita in modalità Schermo intero. Di conseguenza, quando lo richiami, la tua app non sarà più visibile e Scene Viewer avrà lo stato attivo. Tutti gli ambienti che potresti aver modificato verranno reimpostati sulle 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 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.
}

Per ulteriori informazioni sulle opzioni di interattività per Scene Viewer, consulta la nostra documentazione sulla progettazione di modelli 3D.

Estensioni glTF

Jetpack XR SDK supporta diverse estensioni glTF che espandono le funzionalità dei modelli 3D. Queste funzionalità sono disponibili sia tramite le GltfModelEntity sia tramite Scene Viewer.