Cuando se trabaja con modelos 3D, el SDK de Jetpack XR admite el estándar abierto glTF 2.0. Cuando Android XR renderiza apps compiladas con el
SDK de Jetpack XR, los modelos 3D se renderizarán con técnicas de renderización basada en la física(PBR) especificadas en el estándar glTF 2.0
(junto con las extensiones compatibles). La mayoría de las herramientas de creación de contenido digital (DCC), como Autodesk Maya, Maxon ZBrush, Blender y Spline, pueden exportar modelos 3D al formato glTF (archivos .gltf o .glb).
Si el usuario o tu app especificaron un skybox SpatialEnvironment, los modelos 3D se iluminarán con la información de iluminación que proporciona el skybox del entorno. Los materiales reflectantes y los reflejos especulares también reflejarán el skybox del entorno. Si se habilitó la transferencia, la iluminación,
los reflejos y los reflejos especulares se basarán en una habitación iluminada con una sola
luz direccional.
Para obtener una descripción general rápida de los materiales admitidos, consulta las propiedades de PBR de glTF en el sitio de Khronos. Para obtener información sobre cómo personalizar tus modelos 3D con estas propiedades y otras, consulta Cómo personalizar modelos 3D en tu app.
Agrega un archivo glTF a tu carpeta de recursos
Una vez que tengas el archivo glTF, el siguiente paso es agregarlo al directorio de recursos en Android Studio. Te recomendamos que crees un directorio models para organizar mejor
tus tipos de recursos.

Agrega un objeto 3D con SpatialGltfModel
Android XR admite el formato glTF para modelos 3D, que, por lo general, se guardan como archivos .glb. Para agregar estos objetos a tu diseño, usa SpatialGltfModel. Un SpatialGltfModel es un elemento componible de subespacio que te permite agregar modelos 3D en formato glTF a tu diseño espacial. Esta API simplifica el proceso de carga de recursos y administración de su estado.
Para mostrar un modelo, primero define su fuente y estado con rememberSpatialGltfModelState. Puedes cargar modelos desde la carpeta assets de tu app, un URI o raw data.
val modelState = rememberSpatialGltfModelState( source = SpatialGltfModelSource.fromPath( Paths.get("models/model_name.glb") ) )
Después de definir el estado, usa el elemento componible SpatialGltfModel para renderizarlo dentro de un subespacio:
SpatialGltfModel(state = modelState, modifier = SubspaceModifier)
Puntos clave sobre el código
- Carga asíncrona: El modelo se carga de forma asíncrona. Durante la composición inicial, su tamaño intrínseco puede ser cero; el diseño realiza una nueva medición una vez que el modelo está listo.
- Control del estado: Usa
SpatialGltfModelState.statuspara consultar el estado de carga o controlar las animaciones. - Tamaño y escalamiento: De forma predeterminada, el tamaño del diseño coincide con el cuadro delimitador
del recurso. Puedes anular esto con un
SubspaceModifier.sizepara escalar el modelo de manera uniforme y que se ajuste a los límites especificados.
Coloca un modelo 3D con una SceneCoreEntity de Compose
Para colocar un modelo 3D con SceneCoreEntity, primero debes cargar el glTF en la memoria con GltfModel.create(). Luego, puedes colocar un modelo 3D
en un SceneCoreEntity para conectar los componentes de SceneCore con los diseños de Compose para
XR. Consulta Usa una SceneCoreEntity para colocar un objeto 3D en tu diseño.
Coloca un modelo 3D con Jetpack Scenecore
Para cargar el modelo glTF, llama a GltfModel.create().
val gltfModel = GltfModel.create(session, Paths.get("models", "saturn_rings.glb"))
En este punto, el modelo se carga en la memoria, pero aún no se renderiza. Si tienes muchos modelos 3D para cargar o tu modelo es grande, es una buena idea cargarlos de forma asíncrona con anticipación. De esta manera, los usuarios no tienen que esperar a que tus modelos se carguen en la memoria.
Agrega el glTF a ActivitySpace. Llama a GltfModelEntity.create
para crear una entidad y colocarla en ActivitySpace. Como práctica recomendada, debes verificar que la app esté en un estado que permita las funciones espaciales.
if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_3D_CONTENT)) { val gltfEntity = GltfModelEntity.create(session, gltfModel) }
Ahora deberías ver el modelo 3D cargado cuando ejecutes la app.

Carga un modelo 3D con Scene Viewer
Si buscas la forma más sencilla de cargar un modelo 3D con funciones de interacción básicas, puedes usar Scene Viewer como lo harías en un dispositivo móvil. Una diferencia clave entre el Visor de escenas en Android XR y en dispositivos móviles es que el Visor de escenas solo admite el parámetro de URI de archivo que apunta al archivo glTF, y se ignoran todos los demás parámetros.
Scene Viewer es una app independiente que se invoca con un intent y se ejecuta en el modo de espacio completo. Como resultado, cuando lo invoques, tu app ya no será visible y el Visor de escenas tendrá el foco. Cualquier entorno que hayas cambiado se restablecerá a las preferencias del sistema del usuario.
Este es un ejemplo de cómo usar un Intent para ver un archivo glTF en el Visor de escenas
en 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. }
Para obtener más información sobre las opciones de interactividad del Scene Viewer, consulta nuestra documentación de diseño de modelos en 3D.
Extensiones de glTF
El SDK de XR de Jetpack admite varias extensiones de glTF que expanden las capacidades de los modelos 3D. Estas funciones están disponibles a través de
GltfModelEntity y Scene Viewer.
KHR_animation_pointerKHR_draco_mesh_compressionKHR_lights_punctualKHR_materials_clearcoatKHR_materials_sheenKHR_materials_unlitKHR_materials_variantsKHR_mesh_quantizationKHR_texture_basisuKHR_texture_transformEXT_texture_webp