Mit ARCore für Jetpack XR mit Händen arbeiten

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