Trabalhar com as mãos usando o ARCore para Jetpack XR

O ARCore para Jetpack XR pode fornecer informações sobre as mãos detectadas do usuário e informações de pose para as mãos e as articulações associadas. Esses dados de mão podem ser usados para anexar entidades e modelos às mãos de um usuário, por exemplo, um menu de ferramentas:

Criar uma sessão do ARCore para o Jetpack XR

Acesse informações da mão em uma sessão do ARCore para o Jetpack XR. Consulte Entender o ciclo de vida de uma sessão para receber uma Session.

Extrair dados da mão

Os dados das mãos esquerda e direita estão disponíveis separadamente. Use o state de cada mão para acessar as posições de pose de cada articulação:

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

As mãos têm as seguintes propriedades:

  • isActive: se a mão está sendo rastreada ou não.
  • handJoints: um mapa das articulações das mãos para poses. As poses das articulações das mãos são especificadas pelos padrões do OpenXR.

Usar dados de mãos no app

As posições das articulações das mãos de um usuário podem ser usadas para fixar objetos 3D nas mãos de um usuário, por exemplo, para anexar um modelo à palma da mão esquerda:

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

Ou para anexar um modelo à ponta do dedo indicador da mão direita:

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