با استفاده از 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 =
    session.scene.perceptionSpace.transformPoseTo(
        palmPose,
        session.scene.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 =
    session.scene.perceptionSpace.transformPoseTo(
        tipPose,
        session.scene.activitySpace,
    )
val position = transformedPose.translation + transformedPose.forward * 0.03f
val rotation = Quaternion.fromLookTowards(transformedPose.up, Vector3.Up)
indexFingerEntity.setPose(Pose(position, rotation))

تشخیص حرکات اولیه دست

از حالت مفاصل در دست برای تشخیص حرکات اولیه دست استفاده کنید. با کنوانسیون‌های مفاصل دست مشورت کنید تا مشخص کنید که مفاصل باید در کدام محدوده موقعیت‌هایی قرار گیرند تا به‌عنوان یک حالت مشخص ثبت شوند.

به عنوان مثال، برای تشخیص یک نیشگون با انگشت شست و انگشت اشاره، از فاصله بین دو مفصل نوک استفاده کنید:

val thumbTip = handState.handJoints[HandJointType.THUMB_TIP] ?: return false
val thumbTipPose = session.scene.perceptionSpace.transformPoseTo(thumbTip, session.scene.activitySpace)
val indexTip = handState.handJoints[HandJointType.INDEX_TIP] ?: return false
val indexTipPose = session.scene.perceptionSpace.transformPoseTo(indexTip, session.scene.activitySpace)
return Vector3.distance(thumbTipPose.translation, indexTipPose.translation) < 0.05

نمونه ای از ژست های پیچیده تر، ژست «ایست» است. در این ژست، هر انگشت باید کشیده باشد، یعنی هر مفصل در هر انگشت تقریباً باید در یک جهت باشد:

val threshold = toRadians(angleInDegrees = 30f)
fun pointingInSameDirection(joint1: HandJointType, joint2: HandJointType): Boolean {
    val forward1 = handState.handJoints[joint1]?.forward ?: return false
    val forward2 = handState.handJoints[joint2]?.forward ?: return false
    return Vector3.angleBetween(forward1, forward2) < threshold
}
return pointingInSameDirection(HandJointType.INDEX_PROXIMAL, HandJointType.INDEX_TIP) &&
    pointingInSameDirection(HandJointType.MIDDLE_PROXIMAL, HandJointType.MIDDLE_TIP) &&
    pointingInSameDirection(HandJointType.RING_PROXIMAL, HandJointType.RING_TIP)

هنگام ایجاد تشخیص سفارشی برای حرکات دست، نکات زیر را در نظر داشته باشید:

  • کاربران ممکن است تفسیر متفاوتی از هر حرکت داده شده داشته باشند. برای مثال، برخی ممکن است ژست «ایست» را برای بازکردن انگشتان در نظر بگیرند، در حالی که برخی دیگر ممکن است نزدیک‌تر کردن انگشتان به هم را بصری‌تر بدانند.
  • حفظ برخی از حرکات ممکن است ناراحت کننده باشد. از حرکات بصری استفاده کنید که به دستان کاربر فشار نیاورد.

دست دوم کاربر را تعیین کنید

سیستم اندروید ناوبری سیستم را در دست اصلی کاربر قرار می دهد، همانطور که کاربر در تنظیمات برگزیده سیستم مشخص کرده است. برای جلوگیری از تداخل با حرکات ناوبری سیستم، از دست ثانویه برای حرکات سفارشی خود استفاده کنید:

val handedness = Hand.getHandedness(activity.contentResolver)
val secondaryHand = if (handedness == Hand.Handedness.LEFT) Hand.right(session) else Hand.left(session)
val handState = secondaryHand?.state ?: return
detectGesture(handState)

،

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 =
    session.scene.perceptionSpace.transformPoseTo(
        palmPose,
        session.scene.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 =
    session.scene.perceptionSpace.transformPoseTo(
        tipPose,
        session.scene.activitySpace,
    )
val position = transformedPose.translation + transformedPose.forward * 0.03f
val rotation = Quaternion.fromLookTowards(transformedPose.up, Vector3.Up)
indexFingerEntity.setPose(Pose(position, rotation))

تشخیص حرکات اولیه دست

از حالت مفاصل در دست برای تشخیص حرکات اولیه دست استفاده کنید. با کنوانسیون‌های مفاصل دست مشورت کنید تا مشخص کنید که مفاصل باید در کدام محدوده موقعیت‌هایی قرار گیرند تا به‌عنوان یک حالت مشخص ثبت شوند.

به عنوان مثال، برای تشخیص یک نیشگون با انگشت شست و انگشت اشاره، از فاصله بین دو مفصل نوک استفاده کنید:

val thumbTip = handState.handJoints[HandJointType.THUMB_TIP] ?: return false
val thumbTipPose = session.scene.perceptionSpace.transformPoseTo(thumbTip, session.scene.activitySpace)
val indexTip = handState.handJoints[HandJointType.INDEX_TIP] ?: return false
val indexTipPose = session.scene.perceptionSpace.transformPoseTo(indexTip, session.scene.activitySpace)
return Vector3.distance(thumbTipPose.translation, indexTipPose.translation) < 0.05

نمونه ای از ژست های پیچیده تر، ژست «ایست» است. در این ژست، هر انگشت باید کشیده باشد، یعنی هر مفصل در هر انگشت تقریباً باید در یک جهت باشد:

val threshold = toRadians(angleInDegrees = 30f)
fun pointingInSameDirection(joint1: HandJointType, joint2: HandJointType): Boolean {
    val forward1 = handState.handJoints[joint1]?.forward ?: return false
    val forward2 = handState.handJoints[joint2]?.forward ?: return false
    return Vector3.angleBetween(forward1, forward2) < threshold
}
return pointingInSameDirection(HandJointType.INDEX_PROXIMAL, HandJointType.INDEX_TIP) &&
    pointingInSameDirection(HandJointType.MIDDLE_PROXIMAL, HandJointType.MIDDLE_TIP) &&
    pointingInSameDirection(HandJointType.RING_PROXIMAL, HandJointType.RING_TIP)

هنگام ایجاد تشخیص سفارشی برای حرکات دست، نکات زیر را در نظر داشته باشید:

  • کاربران ممکن است تفسیر متفاوتی از هر حرکت داده شده داشته باشند. برای مثال، برخی ممکن است ژست «ایست» را برای بازکردن انگشتان در نظر بگیرند، در حالی که برخی دیگر ممکن است نزدیک‌تر کردن انگشتان به هم را بصری‌تر بدانند.
  • حفظ برخی از حرکات ممکن است ناراحت کننده باشد. از حرکات بصری استفاده کنید که به دستان کاربر فشار نیاورد.

دست دوم کاربر را تعیین کنید

سیستم اندروید ناوبری سیستم را در دست اصلی کاربر قرار می دهد، همانطور که کاربر در تنظیمات برگزیده سیستم مشخص کرده است. برای جلوگیری از تداخل با حرکات ناوبری سیستم، از دست ثانویه برای حرکات سفارشی خود استفاده کنید:

val handedness = Hand.getHandedness(activity.contentResolver)
val secondaryHand = if (handedness == Hand.Handedness.LEFT) Hand.right(session) else Hand.left(session)
val handState = secondaryHand?.state ?: return
detectGesture(handState)

،

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 =
    session.scene.perceptionSpace.transformPoseTo(
        palmPose,
        session.scene.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 =
    session.scene.perceptionSpace.transformPoseTo(
        tipPose,
        session.scene.activitySpace,
    )
val position = transformedPose.translation + transformedPose.forward * 0.03f
val rotation = Quaternion.fromLookTowards(transformedPose.up, Vector3.Up)
indexFingerEntity.setPose(Pose(position, rotation))

تشخیص حرکات اولیه دست

از حالت مفاصل در دست برای تشخیص حرکات اولیه دست استفاده کنید. با کنوانسیون‌های مفاصل دست مشورت کنید تا مشخص کنید که مفاصل باید در کدام محدوده موقعیت‌هایی قرار گیرند تا به‌عنوان یک حالت مشخص ثبت شوند.

به عنوان مثال، برای تشخیص یک نیشگون با انگشت شست و انگشت اشاره، از فاصله بین دو مفصل نوک استفاده کنید:

val thumbTip = handState.handJoints[HandJointType.THUMB_TIP] ?: return false
val thumbTipPose = session.scene.perceptionSpace.transformPoseTo(thumbTip, session.scene.activitySpace)
val indexTip = handState.handJoints[HandJointType.INDEX_TIP] ?: return false
val indexTipPose = session.scene.perceptionSpace.transformPoseTo(indexTip, session.scene.activitySpace)
return Vector3.distance(thumbTipPose.translation, indexTipPose.translation) < 0.05

نمونه ای از ژست های پیچیده تر، ژست «ایست» است. در این ژست، هر انگشت باید کشیده باشد، یعنی هر مفصل در هر انگشت تقریباً باید در یک جهت باشد:

val threshold = toRadians(angleInDegrees = 30f)
fun pointingInSameDirection(joint1: HandJointType, joint2: HandJointType): Boolean {
    val forward1 = handState.handJoints[joint1]?.forward ?: return false
    val forward2 = handState.handJoints[joint2]?.forward ?: return false
    return Vector3.angleBetween(forward1, forward2) < threshold
}
return pointingInSameDirection(HandJointType.INDEX_PROXIMAL, HandJointType.INDEX_TIP) &&
    pointingInSameDirection(HandJointType.MIDDLE_PROXIMAL, HandJointType.MIDDLE_TIP) &&
    pointingInSameDirection(HandJointType.RING_PROXIMAL, HandJointType.RING_TIP)

هنگام ایجاد تشخیص سفارشی برای حرکات دست، نکات زیر را در نظر داشته باشید:

  • کاربران ممکن است تفسیر متفاوتی از هر حرکت داده شده داشته باشند. برای مثال، برخی ممکن است ژست «ایست» را برای بازکردن انگشتان در نظر بگیرند، در حالی که برخی دیگر ممکن است نزدیک‌تر کردن انگشتان به هم را بصری‌تر بدانند.
  • حفظ برخی از حرکات ممکن است ناراحت کننده باشد. از حرکات بصری استفاده کنید که به دستان کاربر فشار نیاورد.

دست دوم کاربر را تعیین کنید

سیستم اندروید ناوبری سیستم را در دست اصلی کاربر قرار می دهد، همانطور که کاربر در تنظیمات برگزیده سیستم مشخص کرده است. برای جلوگیری از تداخل با حرکات ناوبری سیستم، از دست ثانویه برای حرکات سفارشی خود استفاده کنید:

val handedness = Hand.getHandedness(activity.contentResolver)
val secondaryHand = if (handedness == Hand.Handedness.LEFT) Hand.right(session) else Hand.left(session)
val handState = secondaryHand?.state ?: return
detectGesture(handState)

،

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 =
    session.scene.perceptionSpace.transformPoseTo(
        palmPose,
        session.scene.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 =
    session.scene.perceptionSpace.transformPoseTo(
        tipPose,
        session.scene.activitySpace,
    )
val position = transformedPose.translation + transformedPose.forward * 0.03f
val rotation = Quaternion.fromLookTowards(transformedPose.up, Vector3.Up)
indexFingerEntity.setPose(Pose(position, rotation))

تشخیص حرکات اولیه دست

از حالت مفاصل در دست برای تشخیص حرکات اولیه دست استفاده کنید. با کنوانسیون‌های مفاصل دست مشورت کنید تا مشخص کنید که مفاصل باید در کدام محدوده موقعیت‌هایی قرار گیرند تا به‌عنوان یک حالت مشخص ثبت شوند.

به عنوان مثال، برای تشخیص یک نیشگون با انگشت شست و انگشت اشاره، از فاصله بین دو مفصل نوک استفاده کنید:

val thumbTip = handState.handJoints[HandJointType.THUMB_TIP] ?: return false
val thumbTipPose = session.scene.perceptionSpace.transformPoseTo(thumbTip, session.scene.activitySpace)
val indexTip = handState.handJoints[HandJointType.INDEX_TIP] ?: return false
val indexTipPose = session.scene.perceptionSpace.transformPoseTo(indexTip, session.scene.activitySpace)
return Vector3.distance(thumbTipPose.translation, indexTipPose.translation) < 0.05

نمونه ای از ژست های پیچیده تر، ژست «ایست» است. در این ژست، هر انگشت باید دراز باشد، یعنی هر مفصل در هر انگشت تقریباً باید در یک جهت باشد:

val threshold = toRadians(angleInDegrees = 30f)
fun pointingInSameDirection(joint1: HandJointType, joint2: HandJointType): Boolean {
    val forward1 = handState.handJoints[joint1]?.forward ?: return false
    val forward2 = handState.handJoints[joint2]?.forward ?: return false
    return Vector3.angleBetween(forward1, forward2) < threshold
}
return pointingInSameDirection(HandJointType.INDEX_PROXIMAL, HandJointType.INDEX_TIP) &&
    pointingInSameDirection(HandJointType.MIDDLE_PROXIMAL, HandJointType.MIDDLE_TIP) &&
    pointingInSameDirection(HandJointType.RING_PROXIMAL, HandJointType.RING_TIP)

هنگام ایجاد تشخیص سفارشی برای حرکات دست، نکات زیر را در نظر داشته باشید:

  • کاربران ممکن است تفسیر متفاوتی از هر حرکت داده شده داشته باشند. برای مثال، برخی ممکن است ژست «ایست» را برای بازکردن انگشتان در نظر بگیرند، در حالی که برخی دیگر ممکن است نزدیک‌تر کردن انگشتان به هم را بصری‌تر بدانند.
  • حفظ برخی از حرکات ممکن است ناراحت کننده باشد. از حرکات بصری استفاده کنید که به دستان کاربر فشار نیاورد.

دست دوم کاربر را تعیین کنید

سیستم اندروید ناوبری سیستم را در دست اصلی کاربر قرار می دهد، همانطور که کاربر در تنظیمات برگزیده سیستم مشخص کرده است. برای جلوگیری از تداخل با حرکات ناوبری سیستم، از دست ثانویه برای حرکات سفارشی خود استفاده کنید:

val handedness = Hand.getHandedness(activity.contentResolver)
val secondaryHand = if (handedness == Hand.Handedness.LEFT) Hand.right(session) else Hand.left(session)
val handState = secondaryHand?.state ?: return
detectGesture(handState)