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ü:
ARCore für Jetpack XR-Sitzung erstellen
Über eine ARCore für Jetpack XR-Sitzung auf Handinformationen zugreifen. Weitere Informationen zum Abrufen einer Session
finden Sie unter Lebenszyklus einer Sitzung.
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 { // or Hand.right(session)
// Hand state has been updated.
// Use the state of hand joints to update an entity's position.
}
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:
Hand.left(session)?.state?.collect { leftHandState ->
val palmPose = leftHandState.handJoints[HandJointType.PALM] ?: return@collect
// 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 =
session.perceptionSpace.transformPoseTo(
palmPose,
session.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:
Hand.right(session)?.state?.collect { rightHandState ->
val tipPose = rightHandState.handJoints[HandJointType.INDEX_TIP] ?: return@collect
// the forward direction points towards the finger tip.
val angle = Vector3.angleBetween(tipPose.rotation * Vector3.Forward, Vector3.Up)
indexEntity.setHidden(angle > Math.toRadians(40.0))
val transformedPose =
session.perceptionSpace.transformPoseTo(
tipPose,
session.activitySpace,
)
val position = transformedPose.translation + transformedPose.forward * 0.03f
val rotation = Quaternion.fromLookTowards(transformedPose.up, Vector3.Up)
indexEntity.setPose(Pose(position, rotation))
}