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

Anwendbare XR‑Geräte
Dieser Leitfaden hilft Ihnen dabei, Erlebnisse für diese Arten von XR-Geräten zu entwickeln.
XR-Headsets
XR-Datenbrille mit Kabel

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 Jetpack XR-Laufzeit Session abrufen, die von Ihrer App erstellt werden kann.

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