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
a1.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
a1.0
, em que1.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 |
![]() 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 |
Blendshapes da região inferior
Nome | Imagens de referência | |
---|---|---|
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 |
![]() |
![]() |