Incorporate face tracking in your app with ARCore for Jetpack XR

After the user grants permission for face tracking, your app can retrieve face shape information through ARCore for Jetpack XR. Face shape information can help your app display the user in the virtual world, for example, for a virtual glasses try-on.

Create an ARCore for Jetpack XR session

Obtain head pose information through an ARCore for Jetpack XR session. See Understand a Session's lifecycle to obtain a Session.

Configure the session

Face tracking is not enabled by default on XR sessions. To enable face tracking, configure the session and set the FaceTrackingMode.USER mode:

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. */)
}

Retrieve face data

Use Face.getUserFace(session) to retrieve user face data, which contains the following:

  • Face blendshape values: A face's possible expressions are a combination of 68 blend shape values. Each blend shape value represents a facial movement or deformation of the face, and the value indicates its intensity, ranging from 0.0 to 1.0. For an explanation of each blend shape type, see Understand face blendshape types.
  • Confidence values for regions: The face has three regions. Confidence values indicate the degree of certainty of accuracy for the given poses, ranging from 0.0 to 1.0, where 1.0 indicates the highest confidence.

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]
}

Understand face blendshape types

The following tables list each type of face blend shape:

Upper region blendshapes

Name Reference Images
BROW_LOWERER_L
Neutral face reference image
BROW_LOWERER_L = 0.0
face tracking reference image
BROW_LOWERER_L = 1.0
BROW_LOWERER_R
Neutral face reference image
BROW_LOWERER_R = 0.0
face tracking reference image
BROW_LOWERER_R = 1.0
EYES_CLOSED_L
Neutral face reference image
EYES_CLOSED_L = 0.0
face tracking reference image
EYES_CLOSED_L = 1.0
EYES_CLOSED_R
Neutral face reference image
EYES_CLOSED_R = 0.0
face tracking reference image
EYES_CLOSED_R = 1.0
EYES_LOOK_DOWN_L
Neutral face reference image
EYES_LOOK_DOWN_L = 0.0
face tracking reference image
EYES_LOOK_DOWN_L = 1.0
EYES_LOOK_DOWN_R
Neutral face reference image
EYES_LOOK_DOWN_R = 0.0
face tracking reference image
EYES_LOOK_DOWN_R = 1.0
EYES_LOOK_LEFT_L
Neutral face reference image
EYES_LOOK_LEFT_L = 0.0
face tracking reference image
EYES_LOOK_LEFT_L = 1.0
EYES_LOOK_LEFT_R
Neutral face reference image
EYES_LOOK_LEFT_R = 0.0
face tracking reference image
EYES_LOOK_LEFT_R = 1.0
EYES_LOOK_RIGHT_L
Neutral face reference image
EYES_LOOK_RIGHT_L = 0.0
face tracking reference image
EYES_LOOK_RIGHT_L = 1.0
EYES_LOOK_RIGHT_R
Neutral face reference image
EYES_LOOK_RIGHT_R = 0.0
face tracking reference image
EYES_LOOK_RIGHT_R = 1.0
EYES_LOOK_UP_L
Neutral face reference image
EYES_LOOK_UP_L = 0.0
face tracking reference image
EYES_LOOK_UP_L = 1.0
EYES_LOOK_UP_R
Neutral face reference image
EYES_LOOK_UP_R = 0.0
face tracking reference image
EYES_LOOK_UP_R = 1.0
INNER_BROW_RAISER_L
Neutral face reference image
INNER_BROW_RAISER_L = 0.0
face tracking reference image
INNER_BROW_RAISER_L = 1.0
INNER_BROW_RAISER_R
Neutral face reference image
INNER_BROW_RAISER_R = 0.0
face tracking reference image
INNER_BROW_RAISER_R = 1.0
LID_TIGHTENER_L
Neutral face reference image
LID_TIGHTENER_L = 0.0
face tracking reference image
LID_TIGHTENER_L = 1.0
LID_TIGHTENER_R
Neutral face reference image
LID_TIGHTENER_R = 0.0
face tracking reference image
LID_TIGHTENER_R = 1.0
OUTER_BROW_RAISER_L
Neutral face reference image
OUTER_BROW_RAISER_L = 0.0
face tracking reference image
OUTER_BROW_RAISER_L = 1.0
OUTER_BROW_RAISER_R
Neutral face reference image
OUTER_BROW_RAISER_R = 0.0
face tracking reference image
OUTER_BROW_RAISER_R = 1.0
UPPER_LID_RAISER_L
Neutral face reference image
UPPER_LID_RAISER_L = 0.0
face tracking reference image
UPPER_LID_RAISER_L = 1.0
UPPER_LID_RAISER_R
Neutral face reference image
UPPER_LID_RAISER_R = 0.0
face tracking reference image
UPPER_LID_RAISER_R = 1.0

Lower region blendshapes

Name Reference Images
CHEEK_PUFF_L
Neutral face reference image
CHEEK_PUFF_L = 0.0
face tracking reference image
CHEEK_PUFF_L = 1.0
CHEEK_PUFF_R
Neutral face reference image
CHEEK_PUFF_R = 0.0
face tracking reference image
CHEEK_PUFF_R = 1.0
CHEEK_RAISER_L
Neutral face reference image
CHEEK_RAISER_L = 0.0
face tracking reference image
CHEEK_RAISER_L = 1.0
CHEEK_RAISER_R
Neutral face reference image
CHEEK_RAISER_R = 0.0
face tracking reference image
CHEEK_RAISER_R = 1.0
CHEEK_SUCK_L
Neutral face reference image
CHEEK_SUCK_L = 0.0
face tracking reference image
CHEEK_SUCK_L = 1.0
CHEEK_SUCK_R
Neutral face reference image
CHEEK_SUCK_R = 0.0
face tracking reference image
CHEEK_SUCK_R = 1.0
CHIN_RAISER_B
Neutral face reference image
CHIN_RAISER_B = 0.0
face tracking reference image
CHIN_RAISER_B = 1.0
CHIN_RAISER_T
Neutral face reference image
CHIN_RAISER_T = 0.0
face tracking reference image
CHIN_RAISER_T = 1.0
DIMPLER_L
Neutral face reference image
DIMPLER_L = 0.0
face tracking reference image
DIMPLER_L = 1.0
DIMPLER_R
Neutral face reference image
DIMPLER_R = 0.0
face tracking reference image
DIMPLER_R = 1.0
JAW_DROP
Neutral face reference image
JAW_DROP = 0.0
face tracking reference image
JAW_DROP = 1.0
JAW_SIDEWAYS_LEFT
Neutral face reference image
JAW_SIDEWAYS_LEFT = 0.0
face tracking reference image
JAW_SIDEWAYS_LEFT = 1.0
JAW_SIDEWAYS_RIGHT
Neutral face reference image
JAW_SIDEWAYS_RIGHT = 0.0
face tracking reference image
JAW_SIDEWAYS_RIGHT = 1.0
JAW_THRUST
Neutral face reference image
JAW_THRUST = 0.0
face tracking reference image
JAW_THRUST = 1.0
LIP_CORNER_DEPRESSOR_L
Neutral face reference image
LIP_CORNER_DEPRESSOR_L = 0.0
face tracking reference image
LIP_CORNER_DEPRESSOR_L = 1.0
LIP_CORNER_DEPRESSOR_R
Neutral face reference image
LIP_CORNER_DEPRESSOR_R = 0.0
face tracking reference image
LIP_CORNER_DEPRESSOR_R = 1.0
LIP_CORNER_PULLER_L
Neutral face reference image
LIP_CORNER_PULLER_L = 0.0
face tracking reference image
LIP_CORNER_PULLER_L = 1.0
LIP_CORNER_PULLER_R
Neutral face reference image
LIP_CORNER_PULLER_R = 0.0
face tracking reference image
LIP_CORNER_PULLER_R = 1.0
LIP_FUNNELER_LB
Neutral face reference image
LIP_FUNNELER_LB = 0.0
face tracking reference image
LIP_FUNNELER_LB = 1.0
LIP_FUNNELER_LT
Neutral face reference image
LIP_FUNNELER_LT = 0.0
face tracking reference image
LIP_FUNNELER_LT = 1.0
LIP_FUNNELER_RB
Neutral face reference image
LIP_FUNNELER_RB = 0.0
face tracking reference image
LIP_FUNNELER_RB = 1.0
LIP_FUNNELER_RT
Neutral face reference image
LIP_FUNNELER_RT = 0.0
face tracking reference image
LIP_FUNNELER_RT = 1.0
LIP_PRESSOR_L
Neutral face reference image
LIP_PRESSOR_L = 0.0
face tracking reference image
LIP_PRESSOR_L = 1.0
LIP_PRESSOR_R
Neutral face reference image
LIP_PRESSOR_R = 0.0
face tracking reference image
LIP_PRESSOR_R = 1.0
LIP_PUCKER_L
Neutral face reference image
LIP_PUCKER_L = 0.0
face tracking reference image
LIP_PUCKER_L = 1.0
LIP_PUCKER_R
Neutral face reference image
LIP_PUCKER_R = 0.0
face tracking reference image
LIP_PUCKER_R = 1.0
LIP_STRETCHER_L
Neutral face reference image
LIP_STRETCHER_L = 0.0
face tracking reference image
LIP_STRETCHER_L = 1.0
LIP_STRETCHER_R
Neutral face reference image
LIP_STRETCHER_R = 0.0
face tracking reference image
LIP_STRETCHER_R = 1.0
LIP_SUCK_LB
Neutral face reference image
LIP_SUCK_LB = 0.0
face tracking reference image
LIP_SUCK_LB = 1.0
LIP_SUCK_LT
Neutral face reference image
LIP_SUCK_LT = 0.0
face tracking reference image
LIP_SUCK_LT = 1.0
LIP_SUCK_RB
Neutral face reference image
LIP_SUCK_RB = 0.0
face tracking reference image
LIP_SUCK_RB = 1.0
LIP_SUCK_RT
Neutral face reference image
LIP_SUCK_RT = 0.0
face tracking reference image
LIP_SUCK_RT = 1.0
LIP_TIGHTENER_L
Neutral face reference image
LIP_TIGHTENER_L = 0.0
face tracking reference image
LIP_TIGHTENER_L = 1.0
LIP_TIGHTENER_R
Neutral face reference image
LIP_TIGHTENER_R = 0.0
face tracking reference image
LIP_TIGHTENER_R = 1.0
LIPS_TOWARD
Neutral face reference image
LIPS_TOWARD = 0.0
face tracking reference image
JAW_DROP = 1.0 and LIPS_TOWARD = 1.0
LOWER_LIP_DEPRESSOR_L
Neutral face reference image
LOWER_LIP_DEPRESSOR_L = 0.0
face tracking reference image
LOWER_LIP_DEPRESSOR_L = 1.0
LOWER_LIP_DEPRESSOR_R
Neutral face reference image
LOWER_LIP_DEPRESSOR_R = 0.0
face tracking reference image
LOWER_LIP_DEPRESSOR_R = 1.0
MOUTH_LEFT
Neutral face reference image
MOUTH_LEFT = 0.0
face tracking reference image
MOUTH_LEFT = 1.0
MOUTH_RIGHT
Neutral face reference image
MOUTH_RIGHT = 0.0
face tracking reference image
MOUTH_RIGHT = 1.0
NOSE_WRINKLER_L
Neutral face reference image
NOSE_WRINKLER_L = 0.0
face tracking reference image
NOSE_WRINKLER_L = 1.0
NOSE_WRINKLER_R
Neutral face reference image
NOSE_WRINKLER_R = 0.0
face tracking reference image
NOSE_WRINKLER_R = 1.0
UPPER_LIP_RAISER_L
Neutral face reference image
UPPER_LIP_RAISER_L = 0.0
face tracking reference image
UPPER_LIP_RAISER_L = 1.0
UPPER_LIP_RAISER_R
Neutral face reference image
UPPER_LIP_RAISER_R = 0.0
face tracking reference image
UPPER_LIP_RAISER_R = 1.0
TONGUE_OUT
Neutral face reference image
TONGUE_OUT = 0.0
face tracking reference image
TONGUE_OUT = 1.0
TONGUE_LEFT
Neutral face reference image
TONGUE_LEFT = 0.0
face tracking reference image
TONGUE_LEFT = 1.0
TONGUE_RIGHT
Neutral face reference image
TONGUE_RIGHT = 0.0
face tracking reference image
TONGUE_RIGHT = 1.0
TONGUE_UP
Neutral face reference image
TONGUE_UP = 0.0
face tracking reference image
TONGUE_UP = 1.0
TONGUE_DOWN
Neutral face reference image
TONGUE_DOWN = 0.0
face tracking reference image
TONGUE_DOWN = 1.0