Bekerja dengan tangan menggunakan ARCore untuk Jetpack XR

ARCore untuk Jetpack XR dapat memberikan informasi tentang tangan pengguna yang terdeteksi, dan memberikan informasi pose untuk tangan dan sendi terkaitnya. Data tangan ini dapat digunakan untuk melampirkan entitas dan model ke tangan pengguna, misalnya, menu alat:

Membuat sesi ARCore untuk Jetpack XR

Mengakses informasi tangan melalui sesi ARCore untuk Jetpack XR. Lihat Memahami siklus proses Sesi untuk mendapatkan Session.

Mengambil data tangan

Data tangan tersedia untuk tangan kiri dan kanan secara terpisah. Gunakan state setiap tangan untuk mengakses posisi pose untuk setiap sendi:

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

Tangan memiliki properti berikut:

  • isActive: apakah tangan sedang dilacak atau tidak.
  • handJoints: peta sendi tangan ke pose. Pose sendi tangan ditentukan oleh standar OpenXR.

Menggunakan data tangan di aplikasi Anda

Posisi sendi tangan pengguna dapat digunakan untuk mengikat objek 3D ke tangan pengguna, misalnya, untuk memasang model ke telapak tangan kiri:

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

Atau untuk memasang model ke ujung jari telunjuk tangan kanan Anda:

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