Después de que el usuario otorga permiso para el monitoreo de cabeza, tu app puede recuperar información de la postura de la cabeza a través de ARCore para Jetpack XR. La información de la postura de la cabeza puede ayudar a tu app a crear experiencias más intuitivas, como una ventana que sigue el campo visual del usuario.
Crea una sesión de ARCore para Jetpack XR
Obtener información de la postura de la cabeza a través de una sesión de ARCore para Jetpack XR
Consulta Comprende el ciclo de vida de una sesión para obtener un Session
.
Configura la sesión
El seguimiento de cabeza no está habilitado de forma predeterminada en las sesiones de XR. Para habilitar el seguimiento de la cabeza, configura la sesión y establece el modo HeadTrackingMode.LAST_KNOWN
:
val newConfig = session.config.copy( headTracking = Config.HeadTrackingMode.LAST_KNOWN, ) when (val result = session.configure(newConfig)) { is SessionConfigureSuccess -> TODO(/* Success! */) is SessionConfigureConfigurationNotSupported -> TODO(/* Some combinations of configurations are not valid. Handle this failure case. */) else -> TODO(/* The session could not be configured. See SessionConfigureResult for possible causes. */) }
Cómo recuperar datos de la postura de la cabeza
Los datos de la postura de la cabeza se exponen a través de un RenderViewpoint
.
Un objeto RenderViewpoint
describe la postura y el campo de visión para un punto de vista determinado de un dispositivo. Un dispositivo puede tener puntos de vista izquierdo, derecho o mono, según sus capacidades.
Para obtener datos del punto de vista mono, haz lo siguiente:
val mono = RenderViewpoint.mono(session) ?: return mono.state.collect { state -> val fov = state.fieldOfView val viewpointPose = state.pose }
Aplicaciones del monitoreo de cabeza
Una forma en que tu app podría usar el seguimiento de la cabeza es para mantener las entidades en el campo de visión del usuario, en el caso de las apps que requieren que los usuarios miren o se muevan.
Evita usar entidades fijas en el campo de visión del usuario, ya que esto puede provocar mareos. En su lugar, usa el movimiento de la entidad que sigue la cabeza del usuario después de un breve período:
val viewpointPose = RenderViewpoint.left(session)!!.state lifecycleScope.launch { while (true) { delay(2000) val start = panel.getPose() val startTime = session.state.value.timeMark val pose = session.scene.perceptionSpace.transformPoseTo( viewpointPose.value.pose, session.scene.activitySpace ) val target = Pose(pose.translation + pose.forward * 1f, pose.rotation) while (true) { val ratio = (session.state.value.timeMark - startTime).inWholeMilliseconds / 500f panel.setPose(Pose.lerp(start, target, ratio)) if (ratio > 1f) break } } }