يمكن أن يوفّر ARCore لـ Jetpack XR معلومات عن أيدي المستخدم التي تم رصدها، ويقدّم معلومات عن وضعية الأيدي والمفاصل المرتبطة بها. يمكن استخدام بيانات اليد هذه لإرفاق عناصر ونماذج بأيدي المستخدم، على سبيل المثال، قائمة الأدوات:
الحصول على جلسة
الوصول إلى معلومات اليد من خلال نظارات Android XR Session
اطّلِع على مقالة فهم رحلة جلسة للحصول على Session
.
ضبط الجلسة
لا تكون ميزة "تتبُّع اليد" مفعَّلة تلقائيًا في جلسات الواقع المعزّز. لتلقّي بيانات اليد، عليك ضبط الجلسة:
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! */) }
استرداد بيانات اليد
تتوفّر بيانات اليد اليمنى واليسرى بشكل منفصل. استخدِم رمز
state
في كل يد للوصول إلى أوضاع الوضع لكل مفصل:
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) }
تمتلك الأيدي السمات التالية:
isActive
: ما إذا كان يتم تتبُّع اليد أم لاhandJoints
: خريطة لمفاصل اليد إلى الوضعيات يتم تحديد أوضاع مفاصل اليد من خلال معايير OpenXR.
استخدام بيانات اليد في تطبيقك
يمكن استخدام مواضع مفاصل يد المستخدمين لتثبيت الأجسام الثلاثية الأبعاد بأيدي المستخدمين، على سبيل المثال، لربط نموذج بالجهة اليسرى من راحة اليد:
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))
أو لإرفاق نموذج بطرف إصبع السبابة الأيمن:
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))