ARCore para Jetpack XR puede proporcionar información sobre las manos detectadas del usuario y brindar información sobre la postura de las manos y sus articulaciones asociadas. Estos datos de la mano se pueden usar para adjuntar entidades y modelos a las manos de un usuario, por ejemplo, un menú de herramientas:
Obtén una sesión
Accede a la información de la mano a través de un Session
de Android XR. Consulta Comprende el ciclo de vida de una sesión para obtener un Session
.
Configura la sesión
El seguimiento de manos no está habilitado de forma predeterminada en las sesiones de XR. Para recibir datos de la mano, configura la sesión:
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! */) }
Cómo recuperar datos de la mano
Los datos de la mano están disponibles para la mano izquierda y la derecha por separado. Usa el state
de cada mano para acceder a las posiciones de pose de cada articulación:
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) }
Las manos tienen las siguientes propiedades:
isActive
: Indica si se está haciendo un seguimiento de la mano.handJoints
: Es un mapa de las articulaciones de la mano a las poses. Las posiciones de las articulaciones de la mano se especifican en los estándares de OpenXR.
Usa datos de la mano en tu app
Las posiciones de las articulaciones de la mano de un usuario se pueden usar para anclar objetos 3D a las manos de un usuario, por ejemplo, para conectar un modelo a la palma izquierda:
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))
O bien, para colocar un modelo en la punta del dedo índice de la mano derecha, haz lo siguiente:
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))