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