ARCore für Jetpack XR kann Informationen zu den erkannten Händen des Nutzers sowie Informationen zur Haltung der Hände und der zugehörigen Gelenke liefern. Mit diesen Handdaten können Entitäten und Modelle an die Hände eines Nutzers angehängt werden, z. B. ein Tool-Menü:
Sitzung abrufen
Über ein Android XR-Gerät Session
auf Handinformationen zugreifen Weitere Informationen zum Abrufen einer Session
finden Sie unter Lebenszyklus einer Sitzung.
Sitzung konfigurieren
Das Hand-Tracking ist in XR-Sitzungen standardmäßig nicht aktiviert. So konfigurierst du die Sitzung, um Handdaten zu erhalten:
val newConfig = session.config.copy( handTracking = Config.HandTrackingMode.Enabled ) when (val result = session.configure(newConfig)) { is SessionConfigureConfigurationNotSupported -> TODO(/* Some combinations of configurations are not valid. Handle this failure case. */) is SessionConfigurePermissionsNotGranted -> TODO(/* The required permissions in result.permissions have not been granted. */) is SessionConfigureSuccess -> TODO(/* Success! */) }
Handdaten abrufen
Daten zu Handbewegungen sind für die linke und rechte Hand separat verfügbar. Verwenden Sie die state
der jeweiligen Hand, um auf die Pose-Positionen für jeden Gelenkpunkt zuzugreifen:
Hand.left(session)?.state?.collect { handState -> // or Hand.right(session) // Hand state has been updated. // Use the state of hand joints to update an entity's position. renderPlanetAtHandPalm(handState) }
Hände haben folgende Eigenschaften:
isActive
: ob die Hand erfasst wird.handJoints
: eine Zuordnung von Handgelenken zu Posen. Die Handgelenkspositionen werden gemäß den OpenXR-Standards angegeben.
Handdaten in Ihrer App verwenden
Die Positionen der Handgelenke eines Nutzers können verwendet werden, um 3D-Objekte an den Händen eines Nutzers zu verankern, z. B. um ein Modell an der linken Handfläche zu befestigen:
val palmPose = leftHandState.handJoints[HandJointType.PALM] ?: return // the down direction points in the same direction as the palm val angle = Vector3.angleBetween(palmPose.rotation * Vector3.Down, Vector3.Up) palmEntity.setHidden(angle > Math.toRadians(40.0)) val transformedPose = scenecoreSession.perceptionSpace.transformPoseTo( palmPose, scenecoreSession.activitySpace, ) val newPosition = transformedPose.translation + transformedPose.down * 0.05f palmEntity.setPose(Pose(newPosition, transformedPose.rotation))
So platzieren Sie ein Modell an der Spitze des Zeigefingers Ihrer rechten Hand:
val tipPose = rightHandState.handJoints[HandJointType.INDEX_TIP] ?: return // the forward direction points towards the finger tip. val angle = Vector3.angleBetween(tipPose.rotation * Vector3.Forward, Vector3.Up) indexFingerEntity.setHidden(angle > Math.toRadians(40.0)) val transformedPose = scenecoreSession.perceptionSpace.transformPoseTo( tipPose, scenecoreSession.activitySpace, ) val position = transformedPose.translation + transformedPose.forward * 0.03f val rotation = Quaternion.fromLookTowards(transformedPose.up, Vector3.Up) indexFingerEntity.setPose(Pose(position, rotation))