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