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