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 lavori con 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 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 (file .gltf o .glb).

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 la visione pass-through è stata attivata, 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à glTF PBR sul sito Khronos.

Esistono due modi principali per le app create con Jetpack XR SDK per caricare modelli 3D.

Inserire 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.

Esempio di aggiunta di asset alla directory /models

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 hai molti modelli 3D da caricare o il modello è di grandi dimensioni, è consigliabile caricarli in modo asincrono in anticipo. In questo modo, gli utenti non devono attendere il caricamento dei modelli in memoria.

Dobbiamo aggiungere il file glTF a ActivitySpace. Chiama GltfModelEntity.create per creare un'entità e inserirla in ActivitySpace. Come best practice, devi verificare che l'app si trovi 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

Aggiungere un oggetto 3D utilizzando SpatialGltfModel

Android XR supporta il formato glTF per i modelli 3D, in genere salvati come file .glb. Per aggiungere questi oggetti al layout, utilizza il componibile SpatialGltfModel. 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 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 uno spazio secondario.

SpatialGltfModel(state = modelState, modifier = SubspaceModifier)

Inserire un modello 3D in un elemento Compose SceneCoreEntity

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 ai layout di Compose for XR. Consulta Utilizzare un oggetto SceneCoreEntity per posizionare un oggetto 3D nel layout.

Caricare un modello 3D utilizzando Scene Viewer

Se cerchi 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 sui dispositivi mobili è 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 richiamata utilizzando un intent e viene eseguita in modalità Schermo intero. Di conseguenza, quando lo invochi, la tua app non sarà più visibile e Scene Viewer sarà in primo piano. Gli eventuali ambienti che hai 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 saperne di più sulle opzioni di interattività di Scene Viewer, consulta la nostra documentazione sulla progettazione di modelli 3D.

Estensioni glTF

L'SDK Jetpack XR supporta diverse estensioni gfTF che ampliano le funzionalità dei modelli 3D. Queste funzionalità sono disponibili sia tramite GltfModelEntity sia tramite Scene Viewer.