Incorporare la posizione della testa nella tua app con ARCore per Jetpack XR

Dopo che l'utente concede l'autorizzazione per l'head tracking, la tua app può recuperare le informazioni sulla postura della testa tramite ARCore per Jetpack XR. Le informazioni sulla postura della testa possono aiutare la tua app a creare esperienze più intuitive, ad esempio una finestra che segue il campo visivo dell'utente.

Crea una sessione ARCore per Jetpack XR

Ottenere informazioni sulla postura della testa tramite una sessione ARCore per Jetpack XR. Consulta Comprendere il ciclo di vita di una sessione per ottenere un Session.

Configura la sessione

Il monitoraggio della testa non è attivato per impostazione predefinita nelle sessioni XR. Per attivare il monitoraggio della testa, configura la sessione e imposta la modalità 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. */)
}

Recuperare i dati sulla postura della testa

I dati sulla postura della testa vengono esposti tramite un RenderViewpoint. Un RenderViewpoint descrive la posa e il campo visivo per un determinato punto di vista di un dispositivo. Un dispositivo può avere punti di vista sinistro, destro o mono, a seconda delle funzionalità del dispositivo.

Per ottenere i dati per il punto di vista mono:

val mono = RenderViewpoint.mono(session) ?: return
mono.state.collect { state ->
    val fov = state.fieldOfView
    val viewpointPose = state.pose
}

Applicazioni del tracciamento della testa

Un modo in cui la tua app potrebbe utilizzare il monitoraggio della testa è quello di mantenere le entità nel campo visivo dell'utente, per le app che richiedono agli utenti di guardare o muoversi.

Evita di utilizzare entità bloccate nel campo visivo dell'utente perché possono causare mal d'auto. Utilizza invece il movimento dell'entità che segue la testa dell'utente dopo un breve periodo:

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