العمل باستخدام اليدين باستخدام ARCore لـ Jetpack XR

يمكن أن يوفّر ARCore لـ Jetpack XR معلومات عن أيدي المستخدم التي تم رصدها، ويقدّم معلومات عن وضعية الأيدي والمفاصل المرتبطة بها. يمكن استخدام بيانات اليد هذه لإرفاق عناصر ونماذج بأيدي المستخدم، على سبيل المثال، قائمة الأدوات:

إنشاء جلسة ARCore لميزة Jetpack XR

الوصول إلى معلومات اليد من خلال جلسة ARCore لتطبيق Jetpack XR اطّلِع على مقالة فهم رحلة جلسة للحصول على Session.

استرداد بيانات اليد

تتوفّر بيانات اليد اليمنى واليسرى بشكل منفصل. استخدِم رمز state في كل يد للوصول إلى أوضاع الوضع لكل مفصل:

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

تمتلك الأيدي السمات التالية:

  • isActive: ما إذا كان يتم تتبُّع اليد أم لا
  • handJoints: خريطة لمفاصل اليد إلى الوضعيات يتم تحديد أوضاع مفاصل اليد من خلال معايير OpenXR.

استخدام بيانات اليد في تطبيقك

يمكن استخدام مواضع مفاصل يد المستخدمين لتثبيت الأجسام الثلاثية الأبعاد بأيدي المستخدمين، على سبيل المثال، لربط نموذج بالجهة اليسرى من راحة اليد:

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

أو لإرفاق نموذج بطرف إصبع السبابة الأيمن:

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