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

해당 XR 기기
이 안내는 이러한 유형의 XR 기기용 환경을 구축하는 데 도움이 됩니다.
XR 헤드셋
유선 XR 안경

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

Jetpack XR용 ARCore 세션 만들기

앱에서 만들 수 있는 Jetpack XR 런타임 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까지의 강도를 나타냅니다. 각 블렌드 셰이프 유형에 대한 설명은 얼굴 블렌드 셰이프 유형 이해를 참고하세요.
  • 영역의 신뢰도 값: 얼굴에는 3개의 영역이 있습니다. 신뢰도 값은 지정된 포즈의 정확도 확실성을 나타내며, 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