ARCore ל-Jetpack XR יכול לספק מידע על הידיים של המשתמש שזוהו, ומספק מידע על תנוחת הידיים והמפרקים המשויכים אליהן. אפשר להשתמש בנתוני הידיים האלה כדי לצרף ישויות ומודלים לידיים של משתמש, למשל תפריט כלים:
קבלת סשן
גישה למידע על הידיים דרך מכשיר 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))