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:

Mendapatkan sesi

Akses informasi tangan melalui Session Android XR. Lihat Memahami siklus proses Sesi untuk mendapatkan Session.

Mengonfigurasi sesi

Pelacakan tangan tidak diaktifkan secara default pada sesi XR. Untuk menerima data tangan, konfigurasi sesi:

val newConfig = session.config.copy(
    handTracking = Config.HandTrackingMode.Enabled
)
when (val result = session.configure(newConfig)) {
    is SessionConfigureConfigurationNotSupported ->
        TODO(/* Some combinations of configurations are not valid. Handle this failure case. */)
    is SessionConfigurePermissionsNotGranted ->
        TODO(/* The required permissions in result.permissions have not been granted. */)
    is SessionConfigureSuccess -> TODO(/* Success! */)
}

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 { handState -> // or Hand.right(session)
    // Hand state has been updated.
    // Use the state of hand joints to update an entity's position.
    renderPlanetAtHandPalm(handState)
}

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:

val palmPose = leftHandState.handJoints[HandJointType.PALM] ?: return

// 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 =
    scenecoreSession.perceptionSpace.transformPoseTo(
        palmPose,
        scenecoreSession.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:

val tipPose = rightHandState.handJoints[HandJointType.INDEX_TIP] ?: return

// the forward direction points towards the finger tip.
val angle = Vector3.angleBetween(tipPose.rotation * Vector3.Forward, Vector3.Up)
indexFingerEntity.setHidden(angle > Math.toRadians(40.0))

val transformedPose =
    scenecoreSession.perceptionSpace.transformPoseTo(
        tipPose,
        scenecoreSession.activitySpace,
    )
val position = transformedPose.translation + transformedPose.forward * 0.03f
val rotation = Quaternion.fromLookTowards(transformedPose.up, Vector3.Up)
indexFingerEntity.setPose(Pose(position, rotation))