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

Dispositivi XR applicabili
Queste indicazioni ti aiutano a creare esperienze per questi tipi di dispositivi XR.
Visori XR
Occhiali XR con cavo

Dopo che l'utente concede l'autorizzazione per il monitoraggio della testa, 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

Ottieni informazioni sulla postura della testa tramite un runtime Jetpack XR Session, che la tua app può creare.

Configura la sessione

L'head tracking non è attivato per impostazione predefinita nelle sessioni XR. Per attivare l'head tracking, 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. */)
}

Recupera i dati sulla postura della testa

I dati sulla postura della testa vengono esposti tramite un RenderViewpoint. Un RenderViewpoint descrive la postura 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 di head tracking

Un modo in cui la tua app potrebbe utilizzare l'head tracking è 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
        }
    }
}