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

Dispositivos XR aplicáveis
Estas orientações ajudam você a criar experiências para esses tipos de dispositivos de XR.
Headsets de realidade estendida
Óculos XR com fio

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

Obtenha informações sobre o rosto usando um Session do Jetpack XR Runtime, que seu app pode criar.

Configurar a sessão

O rastreamento facial não é ativado por padrão nas sessões de XR. Para ativar o rastreamento facial, 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 facial: as expressões possíveis 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 blend shape, consulte Entender os tipos de blend shape de rosto.
  • 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