3D‑Modelle in Ihre App einfügen

Bei der Arbeit mit 3D‑Modellen unterstützt das Jetpack XR SDK den offenen Standard glTF 2.0. Wenn Android XR Apps rendert, die mit dem Jetpack XR SDK erstellt wurden, werden 3D‑Modelle mit physikalisch basierten Rendering-Techniken(PBR) gerendert, die im glTF 2.0-Standard (zusammen mit unterstützten extensions) angegeben sind. Die meisten Tools zur Erstellung digitaler Inhalte (DCC), z. B. Autodesk Maya, Maxon ZBrush, Blender und Spline, können 3D‑Modelle im glTF-Format (.gltf- oder .glb-Dateien) exportieren.

Wenn vom Nutzer oder von Ihrer App ein SpatialEnvironment-Skybox angegeben wurde, werden 3D‑Modelle mit Beleuchtungsinformationen beleuchtet, die vom Skybox der Umgebung stammen. Reflektierende Materialien und Glanzlichter spiegeln auch den Skybox der Umgebung wider. Wenn die Funktion „Durchlässiger Modus“ aktiviert ist, basieren Beleuchtung, Reflexionen und Glanzlichter auf einem einfachen, hellen Raum mit einem einzelnen, gerichteten Licht.

Eine kurze Übersicht über die unterstützten Materialien finden Sie in den glTF PBR-Eigenschaften auf der Khronos-Website.

Es gibt zwei Hauptmethoden, mit denen Apps, die mit dem Jetpack XR SDK erstellt wurden, 3D‑Modelle laden können.

3D‑Modell in den ActivitySpace platzieren

Nachdem Sie die glTF-Datei haben, fügen Sie sie dem Assets-Verzeichnis in Android Studio hinzu. Wir empfehlen, ein models-Verzeichnis zu erstellen, um deine Asset-Typen besser zu organisieren.

Beispiel für das Hinzufügen von Assets zum Verzeichnis „/models“

Rufen Sie createGltfResourceAsync auf, um das glTF-Modell zu laden.

// load the gltf file
val gltfModel = xrSession.createGltfResourceAsync("models/saturn_rings.glb").await()

Zu diesem Zeitpunkt wird das Modell in den Arbeitsspeicher geladen, aber noch nicht gerendert. Wenn Sie viele 3D‑Modelle laden müssen oder Ihr Modell groß ist, sollten Sie sie vorab asynchron laden. So müssen Nutzer nicht warten, bis Ihre Modelle in den Arbeitsspeicher geladen werden.

Wir müssen das glTF in die ActivitySpace einfügen. Rufe createGltfEntity auf, um eine Entität zu erstellen und in die ActivitySpace zu platzieren. Als Best Practice sollten Sie prüfen, ob sich die App in einem Zustand befindet, der die Nutzung von standortbezogenen Funktionen zulässt.

// 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)
}

Wenn Sie die App jetzt ausführen, sollte das geladene 3D‑Modell angezeigt werden.

Beispiel für das geladene 3D‑Modell

3D‑Modell in ein Compose-Volume einfügen

Sie müssen das glTF zwar weiterhin mit createGltfResourceAsync in den Arbeitsspeicher laden, aber Sie können 3D-Modelle in eine Volume einfügen, wenn Sie Ihre Benutzeroberfläche mit Jetpack Compose for XR erstellen. Weitere Informationen finden Sie unter Mit einem Volumen ein 3D‑Objekt in Ihr Layout einfügen.

3D-Modelle animieren

Gemäß der glTF-Spezifikation können 3D‑Modelle Animationen enthalten. Skelett- (Rigg-), starre und Morph-Ziel- (Form-Blending-)Animationen werden im Jetpack XR SDK unterstützt. Außerdem werden Materialanimationen unterstützt, die mit der glTF-Erweiterung KHR_animation_pointer erstellt wurden.

Wenn Sie eine Animation abspielen möchten, rufen Sie startAnimation auf und geben Sie den Namen der Animation an. Optional können Sie angeben, ob die Animation in einer Endlosschleife wiedergegeben werden soll.

//start a looping walk animation for a model
gltfEntity.startAnimation(loop = true, animationName = "Walk")

Wenn Sie startAnimation ein zweites Mal aufrufen, wird die aktuelle Animation beendet und die neue gestartet.

Sie können den aktuellen Status der Animation über getAnimationState() abfragen.

Wenn der beim Aufruf von startAnimation() angegebene Animationsname nicht vorhanden ist, schlägt der Aufruf stillschweigend fehl, alle laufenden Animationen werden beendet und getAnimationState() gibt STOPPED zurück.

3D‑Modell mit dem Szenen-Viewer laden

Wenn Sie nach der einfachsten Möglichkeit suchen, ein 3D‑Modell mit grundlegenden Interaktionsfunktionen zu laden, können Sie Scene Viewer wie auf einem Mobilgerät verwenden. Ein wichtiger Unterschied zwischen der Scene Viewer App auf Android XR und auf Mobilgeräten besteht darin, dass die Scene Viewer App nur den Datei-URI-Parameter unterstützt, der auf die glTF-Datei verweist. Alle anderen Parameter werden ignoriert.

Die Szenenanzeige ist eine separate App, die über eine Intent aufgerufen wird und im Vollansichtsmodus ausgeführt wird. Wenn Sie sie aufrufen, ist Ihre App also nicht mehr sichtbar und der Fokus liegt auf der Szenenanzeige. Alle Umgebungen, die Sie möglicherweise geändert haben, werden auf die Systemeinstellungen des Nutzers zurückgesetzt.

Hier ein Beispiel für die Verwendung einer Intent, um eine glTF-Datei in Scene Viewer auf Android XR anzusehen:

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)

Weitere Informationen zu den Interaktivitätsoptionen für den Scene Viewer finden Sie in der Dokumentation zum Design von 3D‑Modellen.

glTF-Erweiterungen

Das Jetpack XR SDK unterstützt mehrere gfTF-Erweiterungen, die die Funktionen von 3D‑Modellen erweitern. Diese Funktionen sind sowohl in GltfEntity als auch in der Szenenanzeige verfügbar.