با استفاده از ARCore برای Jetpack XR با دست کار کنید

ARCore برای Jetpack XR می‌تواند اطلاعاتی درباره دست‌های شناسایی‌شده کاربر ارائه دهد و اطلاعات وضعیت دست‌ها و مفاصل مرتبط با آن‌ها را ارائه دهد. از این داده های دستی می توان برای پیوست کردن موجودیت ها و مدل ها به دست های کاربر استفاده کرد، به عنوان مثال، منوی ابزار:

یک جلسه دریافت کنید

از طریق یک Session Android XR به اطلاعات دستی دسترسی پیدا کنید. برای به دست آوردن Session به درک چرخه زندگی یک Session مراجعه کنید.

جلسه را پیکربندی کنید

ردیابی دست به طور پیش فرض در جلسات XR فعال نیست. برای دریافت داده های دستی، جلسه را پیکربندی کنید:

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