ユーザーが顔のトラッキングの権限を付与すると、アプリは Jetpack XR の ARCore を通じて顔の形状情報を取得できます。顔の形状に関する情報は、仮想世界でユーザーを表示する際に役立ちます(仮想メガネの試着など)。
ARCore for Jetpack XR セッションを作成する
ARCore for 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_LEFT |
![]() |
![]() |
TONGUE_RIGHT |
![]() |
![]() |
TONGUE_UP |
![]() |
![]() |
TONGUE_DOWN |
![]() |
![]() |