Incorporar o rastreamento facial ao app com o ARCore para Jetpack XR

Depois que o usuário concede permissão para o rastreamento facial, o app pode recuperar informações sobre o formato do rosto usando o ARCore para Jetpack XR. As informações sobre o formato do rosto podem ajudar seu app a mostrar o usuário no mundo virtual, por exemplo, para um teste virtual de óculos.

Criar uma sessão do ARCore para Jetpack XR

Receba informações de postura da cabeça em uma sessão do ARCore para Jetpack XR. Consulte Entender o ciclo de vida de uma sessão para receber um Session.

Configurar a sessão

O rastreamento facial não é ativado por padrão nas sessões de RV/RA. Para ativar o rastreamento de rosto, configure a sessão e defina o modo 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. */)
}

Recuperar dados faciais

Use Face.getUserFace(session) para recuperar dados de rosto do usuário, que contêm o seguinte:

  • Valores de blendshape do rosto: as possíveis expressões de um rosto são uma combinação de 68 valores de blendshape. Cada valor de forma de combinação representa um movimento facial ou uma deformação do rosto, e o valor indica a intensidade, variando de 0.0 a 1.0. Para uma explicação de cada tipo de combinação de formas, consulte Entender os tipos de combinação de formas faciais.
  • Valores de confiança para regiões: o rosto tem três regiões. Os valores de confiança indicam o grau de certeza da acurácia para as posturas fornecidas, variando de 0.0 a 1.0, em que 1.0 indica a maior confiança.

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

Entender os tipos de blendshape de rosto

As tabelas a seguir listam cada tipo de forma de combinação facial:

Blendshapes da região superior

Nome Imagens de referência
BROW_LOWERER_L
Imagem de referência de um rosto neutro
BROW_LOWERER_L = 0.0
imagem de referência para rastreamento de rostos
BROW_LOWERER_L = 1.0
BROW_LOWERER_R
Imagem de referência de um rosto neutro
BROW_LOWERER_R = 0.0
imagem de referência para rastreamento de rostos
BROW_LOWERER_R = 1.0
EYES_CLOSED_L
Imagem de referência de um rosto neutro
EYES_CLOSED_L = 0.0
imagem de referência para rastreamento de rostos
EYES_CLOSED_L = 1.0
EYES_CLOSED_R
Imagem de referência de um rosto neutro
EYES_CLOSED_R = 0.0
imagem de referência para rastreamento de rostos
EYES_CLOSED_R = 1.0
EYES_LOOK_DOWN_L
Imagem de referência de um rosto neutro
EYES_LOOK_DOWN_L = 0.0
imagem de referência para rastreamento de rostos
EYES_LOOK_DOWN_L = 1.0
EYES_LOOK_DOWN_R
Imagem de referência de um rosto neutro
EYES_LOOK_DOWN_R = 0.0
imagem de referência para rastreamento de rostos
EYES_LOOK_DOWN_R = 1.0
EYES_LOOK_LEFT_L
Imagem de referência de um rosto neutro
EYES_LOOK_LEFT_L = 0.0
imagem de referência para rastreamento de rostos
EYES_LOOK_LEFT_L = 1.0
EYES_LOOK_LEFT_R
Imagem de referência de um rosto neutro
EYES_LOOK_LEFT_R = 0.0
imagem de referência para rastreamento de rostos
EYES_LOOK_LEFT_R = 1.0
EYES_LOOK_RIGHT_L
Imagem de referência de um rosto neutro
EYES_LOOK_RIGHT_L = 0.0
imagem de referência para rastreamento de rostos
EYES_LOOK_RIGHT_L = 1.0
EYES_LOOK_RIGHT_R
Imagem de referência de um rosto neutro
EYES_LOOK_RIGHT_R = 0.0
imagem de referência para rastreamento de rostos
EYES_LOOK_RIGHT_R = 1.0
EYES_LOOK_UP_L
Imagem de referência de um rosto neutro
EYES_LOOK_UP_L = 0.0
imagem de referência para rastreamento de rostos
EYES_LOOK_UP_L = 1.0
EYES_LOOK_UP_R
Imagem de referência de um rosto neutro
EYES_LOOK_UP_R = 0.0
imagem de referência para rastreamento de rostos
EYES_LOOK_UP_R = 1.0
INNER_BROW_RAISER_L
Imagem de referência de um rosto neutro
INNER_BROW_RAISER_L = 0.0
imagem de referência para rastreamento de rostos
INNER_BROW_RAISER_L = 1.0
INNER_BROW_RAISER_R
Imagem de referência de um rosto neutro
INNER_BROW_RAISER_R = 0.0
imagem de referência para rastreamento de rostos
INNER_BROW_RAISER_R = 1.0
LID_TIGHTENER_L
Imagem de referência de um rosto neutro
LID_TIGHTENER_L = 0.0
imagem de referência para rastreamento de rostos
LID_TIGHTENER_L = 1.0
LID_TIGHTENER_R
Imagem de referência de um rosto neutro
LID_TIGHTENER_R = 0.0
imagem de referência para rastreamento de rostos
LID_TIGHTENER_R = 1.0
OUTER_BROW_RAISER_L
Imagem de referência de um rosto neutro
OUTER_BROW_RAISER_L = 0.0
imagem de referência para rastreamento de rostos
OUTER_BROW_RAISER_L = 1.0
OUTER_BROW_RAISER_R
Imagem de referência de um rosto neutro
OUTER_BROW_RAISER_R = 0.0
imagem de referência para rastreamento de rostos
OUTER_BROW_RAISER_R = 1.0
UPPER_LID_RAISER_L
Imagem de referência de um rosto neutro
UPPER_LID_RAISER_L = 0.0
imagem de referência para rastreamento de rostos
UPPER_LID_RAISER_L = 1.0
UPPER_LID_RAISER_R
Imagem de referência de um rosto neutro
UPPER_LID_RAISER_R = 0.0
imagem de referência para rastreamento de rostos
UPPER_LID_RAISER_R = 1.0

Blendshapes da região inferior

Nome Imagens de referência
CHEEK_PUFF_L
Imagem de referência de um rosto neutro
CHEEK_PUFF_L = 0.0
imagem de referência para rastreamento de rostos
CHEEK_PUFF_L = 1.0
CHEEK_PUFF_R
Imagem de referência de um rosto neutro
CHEEK_PUFF_R = 0.0
imagem de referência para rastreamento de rostos
CHEEK_PUFF_R = 1.0
CHEEK_RAISER_L
Imagem de referência de um rosto neutro
CHEEK_RAISER_L = 0.0
imagem de referência para rastreamento de rostos
CHEEK_RAISER_L = 1.0
CHEEK_RAISER_R
Imagem de referência de um rosto neutro
CHEEK_RAISER_R = 0.0
imagem de referência para rastreamento de rostos
CHEEK_RAISER_R = 1.0
CHEEK_SUCK_L
Imagem de referência de um rosto neutro
CHEEK_SUCK_L = 0.0
imagem de referência para rastreamento de rostos
CHEEK_SUCK_L = 1.0
CHEEK_SUCK_R
Imagem de referência de um rosto neutro
CHEEK_SUCK_R = 0.0
imagem de referência para rastreamento de rostos
CHEEK_SUCK_R = 1.0
CHIN_RAISER_B
Imagem de referência de um rosto neutro
CHIN_RAISER_B = 0.0
imagem de referência para rastreamento de rostos
CHIN_RAISER_B = 1.0
CHIN_RAISER_T
Imagem de referência de um rosto neutro
CHIN_RAISER_T = 0.0
imagem de referência para rastreamento de rostos
CHIN_RAISER_T = 1.0
DIMPLER_L
Imagem de referência de um rosto neutro
DIMPLER_L = 0.0
imagem de referência para rastreamento de rostos
DIMPLER_L = 1.0
DIMPLER_R
Imagem de referência de um rosto neutro
DIMPLER_R = 0.0
imagem de referência para rastreamento de rostos
DIMPLER_R = 1.0
JAW_DROP
Imagem de referência de um rosto neutro
JAW_DROP = 0.0
imagem de referência para rastreamento de rostos
JAW_DROP = 1.0
JAW_SIDEWAYS_LEFT
Imagem de referência de um rosto neutro
JAW_SIDEWAYS_LEFT = 0.0
imagem de referência para rastreamento de rostos
JAW_SIDEWAYS_LEFT = 1.0
JAW_SIDEWAYS_RIGHT
Imagem de referência de um rosto neutro
JAW_SIDEWAYS_RIGHT = 0.0
imagem de referência para rastreamento de rostos
JAW_SIDEWAYS_RIGHT = 1.0
JAW_THRUST
Imagem de referência de um rosto neutro
JAW_THRUST = 0.0
imagem de referência para rastreamento de rostos
JAW_THRUST = 1.0
LIP_CORNER_DEPRESSOR_L
Imagem de referência de um rosto neutro
LIP_CORNER_DEPRESSOR_L = 0.0
imagem de referência para rastreamento de rostos
LIP_CORNER_DEPRESSOR_L = 1.0
LIP_CORNER_DEPRESSOR_R
Imagem de referência de um rosto neutro
LIP_CORNER_DEPRESSOR_R = 0.0
imagem de referência para rastreamento de rostos
LIP_CORNER_DEPRESSOR_R = 1.0
LIP_CORNER_PULLER_L
Imagem de referência de um rosto neutro
LIP_CORNER_PULLER_L = 0.0
imagem de referência para rastreamento de rostos
LIP_CORNER_PULLER_L = 1.0
LIP_CORNER_PULLER_R
Imagem de referência de um rosto neutro
LIP_CORNER_PULLER_R = 0.0
imagem de referência para rastreamento de rostos
LIP_CORNER_PULLER_R = 1.0
LIP_FUNNELER_LB
Imagem de referência de um rosto neutro
LIP_FUNNELER_LB = 0.0
imagem de referência para rastreamento de rostos
LIP_FUNNELER_LB = 1.0
LIP_FUNNELER_LT
Imagem de referência de um rosto neutro
LIP_FUNNELER_LT = 0.0
imagem de referência para rastreamento de rostos
LIP_FUNNELER_LT = 1.0
LIP_FUNNELER_RB
Imagem de referência de um rosto neutro
LIP_FUNNELER_RB = 0.0
imagem de referência para rastreamento de rostos
LIP_FUNNELER_RB = 1.0
LIP_FUNNELER_RT
Imagem de referência de um rosto neutro
LIP_FUNNELER_RT = 0.0
imagem de referência para rastreamento de rostos
LIP_FUNNELER_RT = 1.0
LIP_PRESSOR_L
Imagem de referência de um rosto neutro
LIP_PRESSOR_L = 0.0
imagem de referência para rastreamento de rostos
LIP_PRESSOR_L = 1.0
LIP_PRESSOR_R
Imagem de referência de um rosto neutro
LIP_PRESSOR_R = 0.0
imagem de referência para rastreamento de rostos
LIP_PRESSOR_R = 1.0
LIP_PUCKER_L
Imagem de referência de um rosto neutro
LIP_PUCKER_L = 0.0
imagem de referência para rastreamento de rostos
LIP_PUCKER_L = 1.0
LIP_PUCKER_R
Imagem de referência de um rosto neutro
LIP_PUCKER_R = 0.0
imagem de referência para rastreamento de rostos
LIP_PUCKER_R = 1.0
LIP_STRETCHER_L
Imagem de referência de um rosto neutro
LIP_STRETCHER_L = 0.0
imagem de referência para rastreamento de rostos
LIP_STRETCHER_L = 1.0
LIP_STRETCHER_R
Imagem de referência de um rosto neutro
LIP_STRETCHER_R = 0.0
imagem de referência para rastreamento de rostos
LIP_STRETCHER_R = 1.0
LIP_SUCK_LB
Imagem de referência de um rosto neutro
LIP_SUCK_LB = 0.0
imagem de referência para rastreamento de rostos
LIP_SUCK_LB = 1.0
LIP_SUCK_LT
Imagem de referência de um rosto neutro
LIP_SUCK_LT = 0.0
imagem de referência para rastreamento de rostos
LIP_SUCK_LT = 1.0
LIP_SUCK_RB
Imagem de referência de um rosto neutro
LIP_SUCK_RB = 0.0
imagem de referência para rastreamento de rostos
LIP_SUCK_RB = 1.0
LIP_SUCK_RT
Imagem de referência de um rosto neutro
LIP_SUCK_RT = 0.0
imagem de referência para rastreamento de rostos
LIP_SUCK_RT = 1.0
LIP_TIGHTENER_L
Imagem de referência de um rosto neutro
LIP_TIGHTENER_L = 0.0
imagem de referência para rastreamento de rostos
LIP_TIGHTENER_L = 1.0
LIP_TIGHTENER_R
Imagem de referência de um rosto neutro
LIP_TIGHTENER_R = 0.0
imagem de referência para rastreamento de rostos
LIP_TIGHTENER_R = 1.0
LIPS_TOWARD
Imagem de referência de um rosto neutro
LIPS_TOWARD = 0.0
imagem de referência para rastreamento de rostos
JAW_DROP = 1.0 and LIPS_TOWARD = 1.0
LOWER_LIP_DEPRESSOR_L
Imagem de referência de um rosto neutro
LOWER_LIP_DEPRESSOR_L = 0.0
imagem de referência para rastreamento de rostos
LOWER_LIP_DEPRESSOR_L = 1.0
LOWER_LIP_DEPRESSOR_R
Imagem de referência de um rosto neutro
LOWER_LIP_DEPRESSOR_R = 0.0
imagem de referência para rastreamento de rostos
LOWER_LIP_DEPRESSOR_R = 1.0
MOUTH_LEFT
Imagem de referência de um rosto neutro
MOUTH_LEFT = 0.0
imagem de referência para rastreamento de rostos
MOUTH_LEFT = 1.0
MOUTH_RIGHT
Imagem de referência de um rosto neutro
MOUTH_RIGHT = 0.0
imagem de referência para rastreamento de rostos
MOUTH_RIGHT = 1.0
NOSE_WRINKLER_L
Imagem de referência de um rosto neutro
NOSE_WRINKLER_L = 0.0
imagem de referência para rastreamento de rostos
NOSE_WRINKLER_L = 1.0
NOSE_WRINKLER_R
Imagem de referência de um rosto neutro
NOSE_WRINKLER_R = 0.0
imagem de referência para rastreamento de rostos
NOSE_WRINKLER_R = 1.0
UPPER_LIP_RAISER_L
Imagem de referência de um rosto neutro
UPPER_LIP_RAISER_L = 0.0
imagem de referência para rastreamento de rostos
UPPER_LIP_RAISER_L = 1.0
UPPER_LIP_RAISER_R
Imagem de referência de um rosto neutro
UPPER_LIP_RAISER_R = 0.0
imagem de referência para rastreamento de rostos
UPPER_LIP_RAISER_R = 1.0
TONGUE_OUT
Imagem de referência de um rosto neutro
TONGUE_OUT = 0.0
imagem de referência para rastreamento de rostos
TONGUE_OUT = 1.0
TONGUE_LEFT
Imagem de referência de um rosto neutro
TONGUE_LEFT = 0.0
imagem de referência para rastreamento de rostos
TONGUE_LEFT = 1.0
TONGUE_RIGHT
Imagem de referência de um rosto neutro
TONGUE_RIGHT = 0.0
imagem de referência para rastreamento de rostos
TONGUE_RIGHT = 1.0
TONGUE_UP
Imagem de referência de um rosto neutro
TONGUE_UP = 0.0
imagem de referência para rastreamento de rostos
TONGUE_UP = 1.0
TONGUE_DOWN
Imagem de referência de um rosto neutro
TONGUE_DOWN = 0.0
imagem de referência para rastreamento de rostos
TONGUE_DOWN = 1.0