Intégrer le suivi du visage dans votre application avec ARCore pour Jetpack XR

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 la pose de la tête via une session ARCore pour Jetpack XR. Consultez Comprendre le cycle de vie d'une session pour obtenir un Session.

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 varie 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 de visage.
  • Valeurs de confiance pour les régions : le visage comporte trois régions. Les valeurs de confiance indiquent le degré de certitude de l'exactitude des poses données. Elles sont comprises entre 0.0 et 1.0, où 1.0 indique 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 :

Formes de mélange de la région supérieure

Nom Images de référence
BROW_LOWERER_L
Image de référence avec un visage neutre
BROW_LOWERER_L = 0.0
image de référence pour le suivi du visage
BROW_LOWERER_L = 1.0
BROW_LOWERER_R
Image de référence avec un visage neutre
BROW_LOWERER_R = 0.0
image de référence pour le suivi du visage
BROW_LOWERER_R = 1.0
EYES_CLOSED_L
Image de référence avec un visage neutre
EYES_CLOSED_L = 0.0
image de référence pour le suivi du visage
EYES_CLOSED_L = 1.0
EYES_CLOSED_R
Image de référence avec un visage neutre
EYES_CLOSED_R = 0.0
image de référence pour le suivi du visage
EYES_CLOSED_R = 1.0
EYES_LOOK_DOWN_L
Image de référence avec un visage neutre
EYES_LOOK_DOWN_L = 0.0
image de référence pour le suivi du visage
EYES_LOOK_DOWN_L = 1.0
EYES_LOOK_DOWN_R
Image de référence avec un visage neutre
EYES_LOOK_DOWN_R = 0.0
image de référence pour le suivi du visage
EYES_LOOK_DOWN_R = 1.0
EYES_LOOK_LEFT_L
Image de référence avec un visage neutre
EYES_LOOK_LEFT_L = 0.0
image de référence pour le suivi du visage
EYES_LOOK_LEFT_L = 1.0
EYES_LOOK_LEFT_R
Image de référence avec un visage neutre
EYES_LOOK_LEFT_R = 0.0
image de référence pour le suivi du visage
EYES_LOOK_LEFT_R = 1.0
EYES_LOOK_RIGHT_L
Image de référence avec un visage neutre
EYES_LOOK_RIGHT_L = 0.0
image de référence pour le suivi du visage
EYES_LOOK_RIGHT_L = 1.0
EYES_LOOK_RIGHT_R
Image de référence avec un visage neutre
EYES_LOOK_RIGHT_R = 0.0
image de référence pour le suivi du visage
EYES_LOOK_RIGHT_R = 1.0
EYES_LOOK_UP_L
Image de référence avec un visage neutre
EYES_LOOK_UP_L = 0.0
image de référence pour le suivi du visage
EYES_LOOK_UP_L = 1.0
EYES_LOOK_UP_R
Image de référence avec un visage neutre
EYES_LOOK_UP_R = 0.0
image de référence pour le suivi du visage
EYES_LOOK_UP_R = 1.0
INNER_BROW_RAISER_L
Image de référence avec un visage neutre
INNER_BROW_RAISER_L = 0.0
image de référence pour le suivi du visage
INNER_BROW_RAISER_L = 1.0
INNER_BROW_RAISER_R
Image de référence avec un visage neutre
INNER_BROW_RAISER_R = 0.0
image de référence pour le suivi du visage
INNER_BROW_RAISER_R = 1.0
LID_TIGHTENER_L
Image de référence avec un visage neutre
LID_TIGHTENER_L = 0.0
image de référence pour le suivi du visage
LID_TIGHTENER_L = 1.0
LID_TIGHTENER_R
Image de référence avec un visage neutre
LID_TIGHTENER_R = 0.0
image de référence pour le suivi du visage
LID_TIGHTENER_R = 1.0
OUTER_BROW_RAISER_L
Image de référence avec un visage neutre
OUTER_BROW_RAISER_L = 0.0
image de référence pour le suivi du visage
OUTER_BROW_RAISER_L = 1.0
OUTER_BROW_RAISER_R
Image de référence avec un visage neutre
OUTER_BROW_RAISER_R = 0.0
image de référence pour le suivi du visage
OUTER_BROW_RAISER_R = 1.0
UPPER_LID_RAISER_L
Image de référence avec un visage neutre
UPPER_LID_RAISER_L = 0.0
image de référence pour le suivi du visage
UPPER_LID_RAISER_L = 1.0
UPPER_LID_RAISER_R
Image de référence avec un visage neutre
UPPER_LID_RAISER_R = 0.0
image de référence pour le suivi du visage
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
Image de référence avec un visage neutre
CHEEK_PUFF_L = 0.0
image de référence pour le suivi du visage
CHEEK_PUFF_L = 1.0
CHEEK_PUFF_R
Image de référence avec un visage neutre
CHEEK_PUFF_R = 0.0
image de référence pour le suivi du visage
CHEEK_PUFF_R = 1.0
CHEEK_RAISER_L
Image de référence avec un visage neutre
CHEEK_RAISER_L = 0.0
image de référence pour le suivi du visage
CHEEK_RAISER_L = 1.0
CHEEK_RAISER_R
Image de référence avec un visage neutre
CHEEK_RAISER_R = 0.0
image de référence pour le suivi du visage
CHEEK_RAISER_R = 1.0
CHEEK_SUCK_L
Image de référence avec un visage neutre
CHEEK_SUCK_L = 0.0
image de référence pour le suivi du visage
CHEEK_SUCK_L = 1.0
CHEEK_SUCK_R
Image de référence avec un visage neutre
CHEEK_SUCK_R = 0.0
image de référence pour le suivi du visage
CHEEK_SUCK_R = 1.0
CHIN_RAISER_B
Image de référence avec un visage neutre
CHIN_RAISER_B = 0.0
image de référence pour le suivi du visage
CHIN_RAISER_B = 1.0
CHIN_RAISER_T
Image de référence avec un visage neutre
CHIN_RAISER_T = 0.0
image de référence pour le suivi du visage
CHIN_RAISER_T = 1.0
DIMPLER_L
Image de référence avec un visage neutre
DIMPLER_L = 0.0
image de référence pour le suivi du visage
DIMPLER_L = 1.0
DIMPLER_R
Image de référence avec un visage neutre
DIMPLER_R = 0.0
image de référence pour le suivi du visage
DIMPLER_R = 1.0
JAW_DROP
Image de référence avec un visage neutre
JAW_DROP = 0.0
image de référence pour le suivi du visage
JAW_DROP = 1.0
JAW_SIDEWAYS_LEFT
Image de référence avec un visage neutre
JAW_SIDEWAYS_LEFT = 0.0
image de référence pour le suivi du visage
JAW_SIDEWAYS_LEFT = 1.0
JAW_SIDEWAYS_RIGHT
Image de référence avec un visage neutre
JAW_SIDEWAYS_RIGHT = 0.0
image de référence pour le suivi du visage
JAW_SIDEWAYS_RIGHT = 1.0
JAW_THRUST
Image de référence avec un visage neutre
JAW_THRUST = 0.0
image de référence pour le suivi du visage
JAW_THRUST = 1.0
LIP_CORNER_DEPRESSOR_L
Image de référence avec un visage neutre
LIP_CORNER_DEPRESSOR_L = 0.0
image de référence pour le suivi du visage
LIP_CORNER_DEPRESSOR_L = 1.0
LIP_CORNER_DEPRESSOR_R
Image de référence avec un visage neutre
LIP_CORNER_DEPRESSOR_R = 0.0
image de référence pour le suivi du visage
LIP_CORNER_DEPRESSOR_R = 1.0
LIP_CORNER_PULLER_L
Image de référence avec un visage neutre
LIP_CORNER_PULLER_L = 0.0
image de référence pour le suivi du visage
LIP_CORNER_PULLER_L = 1.0
LIP_CORNER_PULLER_R
Image de référence avec un visage neutre
LIP_CORNER_PULLER_R = 0.0
image de référence pour le suivi du visage
LIP_CORNER_PULLER_R = 1.0
LIP_FUNNELER_LB
Image de référence avec un visage neutre
LIP_FUNNELER_LB = 0.0
image de référence pour le suivi du visage
LIP_FUNNELER_LB = 1.0
LIP_FUNNELER_LT
Image de référence avec un visage neutre
LIP_FUNNELER_LT = 0.0
image de référence pour le suivi du visage
LIP_FUNNELER_LT = 1.0
LIP_FUNNELER_RB
Image de référence avec un visage neutre
LIP_FUNNELER_RB = 0.0
image de référence pour le suivi du visage
LIP_FUNNELER_RB = 1.0
LIP_FUNNELER_RT
Image de référence avec un visage neutre
LIP_FUNNELER_RT = 0.0
image de référence pour le suivi du visage
LIP_FUNNELER_RT = 1.0
LIP_PRESSOR_L
Image de référence avec un visage neutre
LIP_PRESSOR_L = 0.0
image de référence pour le suivi du visage
LIP_PRESSOR_L = 1.0
LIP_PRESSOR_R
Image de référence avec un visage neutre
LIP_PRESSOR_R = 0.0
image de référence pour le suivi du visage
LIP_PRESSOR_R = 1.0
LIP_PUCKER_L
Image de référence avec un visage neutre
LIP_PUCKER_L = 0.0
image de référence pour le suivi du visage
LIP_PUCKER_L = 1.0
LIP_PUCKER_R
Image de référence avec un visage neutre
LIP_PUCKER_R = 0.0
image de référence pour le suivi du visage
LIP_PUCKER_R = 1.0
LIP_STRETCHER_L
Image de référence avec un visage neutre
LIP_STRETCHER_L = 0.0
image de référence pour le suivi du visage
LIP_STRETCHER_L = 1.0
LIP_STRETCHER_R
Image de référence avec un visage neutre
LIP_STRETCHER_R = 0.0
image de référence pour le suivi du visage
LIP_STRETCHER_R = 1.0
LIP_SUCK_LB
Image de référence avec un visage neutre
LIP_SUCK_LB = 0.0
image de référence pour le suivi du visage
LIP_SUCK_LB = 1.0
LIP_SUCK_LT
Image de référence avec un visage neutre
LIP_SUCK_LT = 0.0
image de référence pour le suivi du visage
LIP_SUCK_LT = 1.0
LIP_SUCK_RB
Image de référence avec un visage neutre
LIP_SUCK_RB = 0.0
image de référence pour le suivi du visage
LIP_SUCK_RB = 1.0
LIP_SUCK_RT
Image de référence avec un visage neutre
LIP_SUCK_RT = 0.0
image de référence pour le suivi du visage
LIP_SUCK_RT = 1.0
LIP_TIGHTENER_L
Image de référence avec un visage neutre
LIP_TIGHTENER_L = 0.0
image de référence pour le suivi du visage
LIP_TIGHTENER_L = 1.0
LIP_TIGHTENER_R
Image de référence avec un visage neutre
LIP_TIGHTENER_R = 0.0
image de référence pour le suivi du visage
LIP_TIGHTENER_R = 1.0
LIPS_TOWARD
Image de référence avec un visage neutre
LIPS_TOWARD = 0.0
image de référence pour le suivi du visage
JAW_DROP = 1.0 and LIPS_TOWARD = 1.0
LOWER_LIP_DEPRESSOR_L
Image de référence avec un visage neutre
LOWER_LIP_DEPRESSOR_L = 0.0
image de référence pour le suivi du visage
LOWER_LIP_DEPRESSOR_L = 1.0
LOWER_LIP_DEPRESSOR_R
Image de référence avec un visage neutre
LOWER_LIP_DEPRESSOR_R = 0.0
image de référence pour le suivi du visage
LOWER_LIP_DEPRESSOR_R = 1.0
MOUTH_LEFT
Image de référence avec un visage neutre
MOUTH_LEFT = 0.0
image de référence pour le suivi du visage
MOUTH_LEFT = 1.0
MOUTH_RIGHT
Image de référence avec un visage neutre
MOUTH_RIGHT = 0.0
image de référence pour le suivi du visage
MOUTH_RIGHT = 1.0
NOSE_WRINKLER_L
Image de référence avec un visage neutre
NOSE_WRINKLER_L = 0.0
image de référence pour le suivi du visage
NOSE_WRINKLER_L = 1.0
NOSE_WRINKLER_R
Image de référence avec un visage neutre
NOSE_WRINKLER_R = 0.0
image de référence pour le suivi du visage
NOSE_WRINKLER_R = 1.0
UPPER_LIP_RAISER_L
Image de référence avec un visage neutre
UPPER_LIP_RAISER_L = 0.0
image de référence pour le suivi du visage
UPPER_LIP_RAISER_L = 1.0
UPPER_LIP_RAISER_R
Image de référence avec un visage neutre
UPPER_LIP_RAISER_R = 0.0
image de référence pour le suivi du visage
UPPER_LIP_RAISER_R = 1.0
TONGUE_OUT
Image de référence avec un visage neutre
TONGUE_OUT = 0.0
image de référence pour le suivi du visage
TONGUE_OUT = 1.0
TONGUE_LEFT
Image de référence avec un visage neutre
TONGUE_LEFT = 0.0
image de référence pour le suivi du visage
TONGUE_LEFT = 1.0
TONGUE_RIGHT
Image de référence avec un visage neutre
TONGUE_RIGHT = 0.0
image de référence pour le suivi du visage
TONGUE_RIGHT = 1.0
TONGUE_UP
Image de référence avec un visage neutre
TONGUE_UP = 0.0
image de référence pour le suivi du visage
TONGUE_UP = 1.0
TONGUE_DOWN
Image de référence avec un visage neutre
TONGUE_DOWN = 0.0
image de référence pour le suivi du visage
TONGUE_DOWN = 1.0