Si bien un Subspace estándar permanece en una posición fija que determina el sistema, a veces, es posible que quieras que la IU espacial de tu app se mueva de forma dinámica con el usuario o permanezca adjunta a una ubicación específica en su entorno o en el mundo real. Puedes pasar un FollowTarget al parámetro follow de Subspace para crear experiencias como HUD bloqueados en la cabeza o paneles de información adjuntos a objetos del mundo real.
Agrega un subespacio que siga la vista del usuario
Para agregar un subespacio que se posicione en relación con el campo visual del usuario, usa FollowTarget.view. Según el modo de seguimiento que especifiques, esto te permite realizar un seguimiento continuo de los movimientos de la cabeza del usuario o colocar contenido de forma estática según hacia dónde mire. Puedes usarlo para elementos como
HUD, notificaciones persistentes o controles de acción rápida.
Declara y solicita permisos
Antes de solicitar permisos, debes declararlos en el manifiesto de tu app con el elemento <uses-permission>.
<manifest ...>
<!-- Only declare permissions that your app actually needs. In this example,
we declare permissions for head tracking. -->
<uses-permission android:name="android.permission.HEAD_TRACKING"/>
<application ...>
...
</application>
</manifest>
Ahora solicita los permisos. Para obtener más información, consulta los principios y flujos de trabajo de permisos para asegurarte de brindar la mejor experiencia a los usuarios, como verificar si el usuario ya otorgó los permisos de tiempo de ejecución que requiere tu app y si tu app debería mostrar una justificación al usuario antes de solicitar este permiso.
Configura tu sesión
A continuación, configurarás la sesión de tu app que se crea cuando usas
Jetpack Compose para XR estableciendo DeviceTrackingMode.SPATIAL:
val session = checkNotNull(LocalSession.current)
session.configure(
config = Config.Builder(session.config).setDeviceTracking(DeviceTrackingMode.SPATIAL)
.build()
)
Crea el subespacio
Por último, crearás un subespacio que se oriente a la vista del usuario, junto con un modo de seguimiento:
// Example: A subspace that softly follows the user's view (like a HUD)
Subspace(
follow = FollowTarget.view(
// Customizing the soft follow to move slightly faster and tracking all dimensions
mode = FollowMode.soft(
)
),
modifier = modifier,
) {
SpatialPanel {
// SpatialPanel Content
}
}
Modos de seguimiento para subespacios que se orientan a la vista de un usuario
Cuando usas FollowTarget.view como destino, puedes personalizar el comportamiento del contenido especificando un FollowMode:
FollowMode.soft: El contenido se pone al día gradualmente con los movimientos del objetivo, lo que crea un efecto flotante suave.FollowMode.snap: El contenido se coloca frente al usuario una vez, según su postura de vista inicial, y permanece estático después.FollowMode.tight: El contenido sigue la vista del usuario de inmediato con un retraso mínimo, lo que mantiene el contenido estrechamente vinculado a su movimiento.
Todos los modos de seguimiento te permiten elegir qué dimensiones de movimiento se registran de las siguientes opciones:
- Eje X
- Eje Y
- Tono
- Rollo
- Guiñada
RotationOnly: Te permite especificar un solo valor para hacer un seguimiento de las dimensiones relacionadas con la rotación (cabeceo, guiñada y balanceo).
Puedes elegir cualquier combinación de estas dimensiones o usar el valor predeterminado de
TrackedDimensions.All que hace un seguimiento de todas ellas.
Agrega un subespacio que siga un atributo ambiental
Para agregar un subespacio que bloquee el contenido espacial estrictamente a un elemento físico en el entorno del usuario, usa FollowTarget.anchor(). Usa este tipo de objetivo para seguir un plano detectado, un ancla o una ubicación geoespacial.
El seguimiento de los atributos del mundo real requiere permisos y parámetros de configuración de sesión adicionales según el atributo que sigas.
Para obtener instrucciones detalladas sobre cómo trabajar con las capacidades de percepción para las funciones de ARCore, así como configurar los permisos necesarios y tu sesión para usar FollowTarget.anchor(), consulta la documentación del SDK de XR de Jetpack para Planes, Anclajes y Poses geoespaciales.
En el siguiente ejemplo, se crea un subespacio que sigue un ancla del mundo real:
// A subspace locked to a real-world anchor
Subspace(
follow = FollowTarget.anchor(anchor = myAnchor)
) {
// Rotate the panel to ensure it faces the user while remaining anchored
SpatialPanel(SubspaceModifier.rotateToLookAtUser()) {
// SpatialPanel Content
}
}
Evita la superposición espacial
Cada Subspace que creas administra su propia escena 3D independiente y no tiene
conocimiento de otros subespacios que existen, por lo que no evita automáticamente
las colisiones.
Para evitar que el HUD bloqueado en la cabeza se recorte a través de los paneles de POI fijos (Z-fighting), administra de forma explícita los volúmenes de diseño con estos métodos:
- Usa compensaciones: Usa
SubspaceModifier.offsetpara acercar o alejar la IU periférica (como tu HUD) en el eje Z, o bien desplázala hacia los bordes de la visión del usuario. - Restringe los tamaños: Aplica modificadores como
requiredSizeInpara restringir los cuadros delimitadores de tus espacios.
Para obtener más información sobre los espacios de coordenadas, las restricciones de diseño y todas las configuraciones de seguimiento disponibles, consulta la documentación de referencia de Subspace.