Kopfposition mit ARCore für Jetpack XR in Ihre App einbinden

Nachdem der Nutzer die Berechtigung für die Erfassung von Kopfbewegungen erteilt hat, kann Ihre App über ARCore für Jetpack XR Informationen zur Kopfhaltung abrufen. Mithilfe von Informationen zur Kopfhaltung kann Ihre App intuitivere Funktionen erstellen, z. B. ein Fenster, das dem Sichtfeld des Nutzers folgt.

ARCore für Jetpack XR-Sitzung erstellen

Kopfhaltungsinformationen über eine ARCore für Jetpack XR-Sitzung abrufen. Informationen zum Abrufen eines Session finden Sie unter Lebenszyklus einer Sitzung.

Sitzung konfigurieren

Die Erfassung von Kopfbewegungen ist in XR-Sitzungen nicht standardmäßig aktiviert. So aktivieren Sie die Kopf-Tracking-Funktion: Konfigurieren Sie die Sitzung und legen Sie den Modus HeadTrackingMode.LAST_KNOWN fest:

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. */)
}

Daten zur Kopfhaltung abrufen

Daten zur Kopfhaltung werden über eine RenderViewpoint bereitgestellt. Eine RenderViewpoint beschreibt die Ausrichtung und das Sichtfeld für einen bestimmten Blickwinkel eines Geräts. Ein Gerät kann je nach seinen Funktionen einen linken, rechten oder Mono-Blickwinkel haben.

So rufen Sie Daten für die monokulare Ansicht ab:

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

Anwendungen der Erfassung von Kopfbewegungen

Eine Möglichkeit, Head-Tracking in Ihrer App zu verwenden, besteht darin, dafür zu sorgen, dass sich Objekte im Sichtfeld des Nutzers befinden. Das ist besonders bei Apps wichtig, bei denen Nutzer sich umsehen oder bewegen müssen.

Vermeiden Sie die Verwendung von headlocked-Einheiten im Sichtfeld des Nutzers, da dies zu Reisekrankheit führen kann. Verwenden Sie stattdessen eine Bewegung der Einheit, die nach kurzer Zeit der Kopfbewegung des Nutzers folgt:

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