Cómo trabajar con las manos con ARCore para Jetpack XR

ARCore para Jetpack XR puede proporcionar información sobre las manos detectadas del usuario y brindar información sobre la postura de las manos y sus articulaciones asociadas. Estos datos de la mano se pueden usar para adjuntar entidades y modelos a las manos de un usuario, por ejemplo, un menú de herramientas:

Crea una sesión de ARCore para Jetpack XR

Accede a la información de la mano a través de una sesión de ARCore para Jetpack XR. Consulta Comprende el ciclo de vida de una sesión para obtener un Session.

Cómo recuperar datos de la mano

Los datos de la mano están disponibles para la mano izquierda y la derecha por separado. Usa el state de cada mano para acceder a las posiciones de pose de cada articulación:

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

Las manos tienen las siguientes propiedades:

  • isActive: Indica si se está haciendo un seguimiento de la mano.
  • handJoints: Es un mapa de las articulaciones de la mano a las poses. Las posiciones de las articulaciones de la mano se especifican en los estándares de OpenXR.

Usa datos de la mano en tu app

Las posiciones de las articulaciones de la mano de un usuario se pueden usar para anclar objetos 3D a sus manos, por ejemplo, para conectar un modelo a la palma izquierda:

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

O bien, para colocar un modelo en la punta del dedo índice de la mano derecha, haz lo siguiente:

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