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 renderizan con técnicas de renderización basada en la física(PBR) especificadas en el estándar glTF 2.0 (junto con extensions
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 cielo SpatialEnvironment
, los modelos 3D se iluminarán con la información de iluminación que proporciona el cielo del entorno. Los materiales reflectantes y los reflejos especulares también reflejarán el cielo del entorno. Si se habilitó la transferencia, la iluminación, los reflejos y los reflejos especulares se basarán en una habitación simple y brillante con una sola luz direccional.
Para obtener una descripción general rápida de los materiales compatibles, consulta las propiedades de PBR de glTF en el sitio de Khronos.
Existen dos formas principales en las que las apps compiladas con el SDK de Jetpack XR pueden cargar modelos 3D.
- Cárgalo en
ActivitySpace
como se describe en la siguiente sección, Coloca un modelo 3D en ActivitySpace. - Cómo usar el Visor de escenas integrado a través de un intent
Coloca un modelo 3D en ActivitySpace
Una vez que tengas tu 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 activos.
Para cargar el modelo glTF, llama a createGltfResourceAsync
.
// load the gltf file
val gltfModel = xrSession.createGltfResourceAsync("models/saturn_rings.glb").await()
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, te recomendamos que los cargues de forma asíncrona con anticipación. De esta manera, los usuarios no tienen que esperar a que se carguen tus modelos en la memoria.
Debemos agregar el glTF a ActivitySpace
. Llama a createGltfEntity
para crear una entidad y colocarla en ActivitySpace
. Como práctica recomendada, debes comprobar que la app esté en un estado que permita capacidades espaciales.
// 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)
}
Ahora deberías ver el modelo 3D cargado cuando ejecutes la app.
Coloca un modelo 3D en un volumen de Compose
Si bien deberás cargar el glTF en la memoria con createGltfResourceAsync
, puedes colocar modelos 3D en un Volume
si creas tu IU con Jetpack Compose para XR. Consulta Cómo usar un volumen para colocar un objeto 3D en tu diseño.
Anima modelos 3D
Como parte de la especificación de glTF, los modelos 3D pueden tener animaciones incorporadas.
Las animaciones de objetivos de transformación (combinación de formas), esqueletos (con rig) y rígidas son compatibles con el SDK de Jetpack XR. También se admiten las animaciones de Material creadas con la extensión glTF KHR_animation_pointer
.
Para reproducir una animación, llama a startAnimation
y especifica el
nombre de la animación. De manera opcional, puedes especificar si la animación debe repetirse de forma indefinida.
//start a looping walk animation for a model
gltfEntity.startAnimation(loop = true, animationName = "Walk")
Si llamas a startAnimation
por segunda vez, se detendrá la animación actual y comenzará la nueva.
Puedes consultar el estado actual de la animación a través de getAnimationState()
.
Si el nombre de la animación especificado cuando se llama a startAnimation()
no existe, la llamada falla de forma silenciosa, se detienen las animaciones en ejecución y getAnimationState()
muestra STOPPED
.
Carga un modelo 3D con el Visor de escenas
Si buscas la forma más sencilla de cargar un modelo 3D con capacidades de interacción básicas, puedes optar por usar Scene Viewer como lo harías en dispositivos móviles. Una diferencia clave entre Scene Viewer en Android XR y en dispositivos móviles es que Scene Viewer 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 a través de 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 del uso de un Intent
para ver un archivo glTF en Scene Viewer en 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)
Para obtener más información sobre las opciones de interactividad de Scene Viewer, consulta nuestra documentación sobre el diseño de modelos 3D.
Extensiones de glTF
El SDK de Jetpack XR admite varias extensiones de gfTF que expanden las capacidades de los modelos 3D. Estas funciones están disponibles a través de GltfEntity
y 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