Jetpack XR용 ARCore를 사용하여 앱에 얼굴 추적 통합

사용자가 얼굴 추적 권한을 부여하면 앱이 Jetpack XR용 ARCore를 통해 얼굴 모양 정보를 가져올 수 있습니다. 얼굴 모양 정보는 앱이 가상 세계에서 사용자를 표시하는 데 도움이 될 수 있습니다(예: 가상 안경 착용).

Jetpack XR용 ARCore 세션 만들기

Jetpack XR 세션용 ARCore를 통해 머리 포즈 정보를 획득합니다. Session를 가져오려면 세션의 수명 주기 이해하기를 참고하세요.

세션 구성

얼굴 추적은 XR 세션에서 기본적으로 사용 설정되지 않습니다. 얼굴 추적을 사용 설정하려면 세션을 구성하고 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. */)
}

얼굴 데이터 가져오기

Face.getUserFace(session)를 사용하여 다음을 포함하는 사용자 얼굴 데이터를 가져옵니다.

  • 얼굴 블렌드 셰이프 값: 얼굴의 가능한 표현식은 68개의 블렌드 셰이프 값의 조합입니다. 각 블렌드 셰이프 값은 얼굴의 움직임이나 변형을 나타내며, 값은 0.0에서 1.0까지의 강도를 나타냅니다. 각 블렌드 셰이프 유형에 대한 설명은 얼굴 블렌드 셰이프 유형 이해하기를 참고하세요.
  • 영역의 신뢰도 값: 얼굴에는 세 개의 영역이 있습니다. 신뢰도 값은 지정된 포즈의 정확도 확실성을 나타내며, 0.0에서 1.0까지의 범위에서 1.0이 가장 높은 신뢰도를 나타냅니다.

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

얼굴 블렌드셰이프 유형 이해하기

다음 표에는 각 얼굴 블렌드 셰이프 유형이 나열되어 있습니다.

상단 영역 블렌드 셰이프

이름 참조 이미지
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

하위 영역 블렌드 셰이프

이름 참조 이미지
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_OUT = 0.0
얼굴 추적 참조 이미지
TONGUE_OUT = 1.0
TONGUE_LEFT
무표정 참조 이미지
TONGUE_LEFT = 0.0
얼굴 추적 참조 이미지
TONGUE_LEFT = 1.0
TONGUE_RIGHT
무표정 참조 이미지
TONGUE_RIGHT = 0.0
얼굴 추적 참조 이미지
TONGUE_RIGHT = 1.0
TONGUE_UP
무표정 참조 이미지
TONGUE_UP = 0.0
얼굴 추적 참조 이미지
TONGUE_UP = 1.0
TONGUE_DOWN
무표정 참조 이미지
TONGUE_DOWN = 0.0
얼굴 추적 참조 이미지
TONGUE_DOWN = 1.0