Une fois que l'utilisateur autorise le suivi du visage, votre application peut récupérer des informations sur la forme du visage via ARCore pour Jetpack XR. Les informations sur la forme du visage peuvent aider votre application à afficher l'utilisateur dans le monde virtuel, par exemple pour un essai virtuel de lunettes.
Créer une session ARCore pour Jetpack XR
Obtenez des informations sur le visage via un Session Jetpack XR Runtime que votre application peut créer.
Configurer la session
Le suivi du visage n'est pas activé par défaut dans les sessions XR. Pour activer le suivi du visage, configurez la session et définissez le mode FaceTrackingMode.USER :
val newConfig = session.config.copy( faceTracking = Config.FaceTrackingMode.USER, ) when (val result = session.configure(newConfig)) { is SessionConfigureSuccess -> TODO(/* Success! */) is SessionConfigureConfigurationNotSupported -> TODO(/* Some combinations of configurations are not valid. Handle this failure case. */) else -> TODO(/* The session could not be configured. See SessionConfigureResult for possible causes. */) }
Récupérer les données de reconnaissance faciale
Utilisez Face.getUserFace(session) pour récupérer les données du visage de l'utilisateur, qui contiennent les éléments suivants :
- Valeurs de blendshape du visage : les expressions possibles d'un visage sont une combinaison de 68 valeurs de blendshape. Chaque valeur de forme de mélange représente un mouvement ou une déformation du visage. La valeur indique son intensité, qui va de
0.0à1.0. Pour obtenir une explication de chaque type de forme de mélange, consultez Comprendre les types de formes de mélange du visage. - Valeurs de confiance pour les régions : le visage comporte trois régions. Les valeurs de confiance indiquent le degré de certitude de la précision des poses données, allant de
0.0à1.0, où1.0indique la confiance la plus élevée.
val face = Face.getUserFace(session) ?: return face.state.collect { state -> if (state.trackingState != TrackingState.TRACKING) return@collect val confidence = state.getConfidence(FaceConfidenceRegion.FACE_CONFIDENCE_REGION_LOWER) val blendShapeValue = state.blendShapes[FaceBlendShapeType.FACE_BLEND_SHAPE_TYPE_LIPS_TOWARD] }
Comprendre les types de blendshapes de visage
Les tableaux suivants listent chaque type de forme de mélange de visage :
Blendshapes de la région supérieure
| Nom | Images de référence | |
|---|---|---|
BROW_LOWERER_L |
BROW_LOWERER_L = 0.0 |
BROW_LOWERER_L = 1.0 |
BROW_LOWERER_R |
BROW_LOWERER_R = 0.0 |
BROW_LOWERER_R = 1.0 |
EYES_CLOSED_L |
EYES_CLOSED_L = 0.0 |
EYES_CLOSED_L = 1.0 |
EYES_CLOSED_R |
EYES_CLOSED_R = 0.0 |
EYES_CLOSED_R = 1.0 |
EYES_LOOK_DOWN_L |
EYES_LOOK_DOWN_L = 0.0 |
EYES_LOOK_DOWN_L = 1.0 |
EYES_LOOK_DOWN_R |
EYES_LOOK_DOWN_R = 0.0 |
EYES_LOOK_DOWN_R = 1.0 |
EYES_LOOK_LEFT_L |
EYES_LOOK_LEFT_L = 0.0 |
EYES_LOOK_LEFT_L = 1.0 |
EYES_LOOK_LEFT_R |
EYES_LOOK_LEFT_R = 0.0 |
EYES_LOOK_LEFT_R = 1.0 |
EYES_LOOK_RIGHT_L |
EYES_LOOK_RIGHT_L = 0.0 |
EYES_LOOK_RIGHT_L = 1.0 |
EYES_LOOK_RIGHT_R |
EYES_LOOK_RIGHT_R = 0.0 |
EYES_LOOK_RIGHT_R = 1.0 |
EYES_LOOK_UP_L |
EYES_LOOK_UP_L = 0.0 |
EYES_LOOK_UP_L = 1.0 |
EYES_LOOK_UP_R |
EYES_LOOK_UP_R = 0.0 |
EYES_LOOK_UP_R = 1.0 |
INNER_BROW_RAISER_L |
INNER_BROW_RAISER_L = 0.0 |
INNER_BROW_RAISER_L = 1.0 |
INNER_BROW_RAISER_R |
INNER_BROW_RAISER_R = 0.0 |
INNER_BROW_RAISER_R = 1.0 |
LID_TIGHTENER_L |
LID_TIGHTENER_L = 0.0 |
LID_TIGHTENER_L = 1.0 |
LID_TIGHTENER_R |
LID_TIGHTENER_R = 0.0 |
LID_TIGHTENER_R = 1.0 |
OUTER_BROW_RAISER_L |
OUTER_BROW_RAISER_L = 0.0 |
OUTER_BROW_RAISER_L = 1.0 |
OUTER_BROW_RAISER_R |
OUTER_BROW_RAISER_R = 0.0 |
OUTER_BROW_RAISER_R = 1.0 |
UPPER_LID_RAISER_L |
UPPER_LID_RAISER_L = 0.0 |
UPPER_LID_RAISER_L = 1.0 |
UPPER_LID_RAISER_R |
UPPER_LID_RAISER_R = 0.0 |
UPPER_LID_RAISER_R = 1.0 |
Formes de mélange de la région inférieure
| Nom | Images de référence | |
|---|---|---|
CHEEK_PUFF_L |
CHEEK_PUFF_L = 0.0 |
CHEEK_PUFF_L = 1.0 |
CHEEK_PUFF_R |
CHEEK_PUFF_R = 0.0 |
CHEEK_PUFF_R = 1.0 |
CHEEK_RAISER_L |
CHEEK_RAISER_L = 0.0 |
CHEEK_RAISER_L = 1.0 |
CHEEK_RAISER_R |
CHEEK_RAISER_R = 0.0 |
CHEEK_RAISER_R = 1.0 |
CHEEK_SUCK_L |
CHEEK_SUCK_L = 0.0 |
CHEEK_SUCK_L = 1.0 |
CHEEK_SUCK_R |
CHEEK_SUCK_R = 0.0 |
CHEEK_SUCK_R = 1.0 |
CHIN_RAISER_B |
CHIN_RAISER_B = 0.0 |
CHIN_RAISER_B = 1.0 |
CHIN_RAISER_T |
CHIN_RAISER_T = 0.0 |
CHIN_RAISER_T = 1.0 |
DIMPLER_L |
DIMPLER_L = 0.0 |
DIMPLER_L = 1.0 |
DIMPLER_R |
DIMPLER_R = 0.0 |
DIMPLER_R = 1.0 |
JAW_DROP |
JAW_DROP = 0.0 |
JAW_DROP = 1.0 |
JAW_SIDEWAYS_LEFT |
JAW_SIDEWAYS_LEFT = 0.0 |
JAW_SIDEWAYS_LEFT = 1.0 |
JAW_SIDEWAYS_RIGHT |
JAW_SIDEWAYS_RIGHT = 0.0 |
JAW_SIDEWAYS_RIGHT = 1.0 |
JAW_THRUST |
JAW_THRUST = 0.0 |
JAW_THRUST = 1.0 |
LIP_CORNER_DEPRESSOR_L |
LIP_CORNER_DEPRESSOR_L = 0.0 |
LIP_CORNER_DEPRESSOR_L = 1.0 |
LIP_CORNER_DEPRESSOR_R |
LIP_CORNER_DEPRESSOR_R = 0.0 |
LIP_CORNER_DEPRESSOR_R = 1.0 |
LIP_CORNER_PULLER_L |
LIP_CORNER_PULLER_L = 0.0 |
LIP_CORNER_PULLER_L = 1.0 |
LIP_CORNER_PULLER_R |
LIP_CORNER_PULLER_R = 0.0 |
LIP_CORNER_PULLER_R = 1.0 |
LIP_FUNNELER_LB |
LIP_FUNNELER_LB = 0.0 |
LIP_FUNNELER_LB = 1.0 |
LIP_FUNNELER_LT |
LIP_FUNNELER_LT = 0.0 |
LIP_FUNNELER_LT = 1.0 |
LIP_FUNNELER_RB |
LIP_FUNNELER_RB = 0.0 |
LIP_FUNNELER_RB = 1.0 |
LIP_FUNNELER_RT |
LIP_FUNNELER_RT = 0.0 |
LIP_FUNNELER_RT = 1.0 |
LIP_PRESSOR_L |
LIP_PRESSOR_L = 0.0 |
LIP_PRESSOR_L = 1.0 |
LIP_PRESSOR_R |
LIP_PRESSOR_R = 0.0 |
LIP_PRESSOR_R = 1.0 |
LIP_PUCKER_L |
LIP_PUCKER_L = 0.0 |
LIP_PUCKER_L = 1.0 |
LIP_PUCKER_R |
LIP_PUCKER_R = 0.0 |
LIP_PUCKER_R = 1.0 |
LIP_STRETCHER_L |
LIP_STRETCHER_L = 0.0 |
LIP_STRETCHER_L = 1.0 |
LIP_STRETCHER_R |
LIP_STRETCHER_R = 0.0 |
LIP_STRETCHER_R = 1.0 |
LIP_SUCK_LB |
LIP_SUCK_LB = 0.0 |
LIP_SUCK_LB = 1.0 |
LIP_SUCK_LT |
LIP_SUCK_LT = 0.0 |
LIP_SUCK_LT = 1.0 |
LIP_SUCK_RB |
LIP_SUCK_RB = 0.0 |
LIP_SUCK_RB = 1.0 |
LIP_SUCK_RT |
LIP_SUCK_RT = 0.0 |
LIP_SUCK_RT = 1.0 |
LIP_TIGHTENER_L |
LIP_TIGHTENER_L = 0.0 |
LIP_TIGHTENER_L = 1.0 |
LIP_TIGHTENER_R |
LIP_TIGHTENER_R = 0.0 |
LIP_TIGHTENER_R = 1.0 |
LIPS_TOWARD |
LIPS_TOWARD = 0.0 |
JAW_DROP = 1.0 and LIPS_TOWARD = 1.0 |
LOWER_LIP_DEPRESSOR_L |
LOWER_LIP_DEPRESSOR_L = 0.0 |
LOWER_LIP_DEPRESSOR_L = 1.0 |
LOWER_LIP_DEPRESSOR_R |
LOWER_LIP_DEPRESSOR_R = 0.0 |
LOWER_LIP_DEPRESSOR_R = 1.0 |
MOUTH_LEFT |
MOUTH_LEFT = 0.0 |
MOUTH_LEFT = 1.0 |
MOUTH_RIGHT |
MOUTH_RIGHT = 0.0 |
MOUTH_RIGHT = 1.0 |
NOSE_WRINKLER_L |
NOSE_WRINKLER_L = 0.0 |
NOSE_WRINKLER_L = 1.0 |
NOSE_WRINKLER_R |
NOSE_WRINKLER_R = 0.0 |
NOSE_WRINKLER_R = 1.0 |
UPPER_LIP_RAISER_L |
UPPER_LIP_RAISER_L = 0.0 |
UPPER_LIP_RAISER_L = 1.0 |
UPPER_LIP_RAISER_R |
UPPER_LIP_RAISER_R = 0.0 |
UPPER_LIP_RAISER_R = 1.0 |
TONGUE_OUT |
|
|
TONGUE_LEFT |
|
|
TONGUE_RIGHT |
|
|
TONGUE_UP |
|
|
TONGUE_DOWN |
|
|