با استفاده از 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))
}