Extension OpenXR XR_ANDROID_face_tracking

Chaîne de nom

XR_ANDROID_face_tracking

Type d'extension

Extension d'instance

Numéro d'extension enregistré

459

Révision

1

Dépendances d'extension et de version

OpenXR 1.0

Date de dernière modification

2024-09-06

État de l'adresse IP

Aucune revendication d'adresse IP connue.

Contributeurs

Spencer Quin, Google

Jared Finder, Google

Levana Chen, Google

Présentation

Cette extension permet aux applications d'obtenir les poids des formes de mélange et de représenter les expressions faciales dans les expériences XR.

Cette extension est destinée à fournir les informations nécessaires pour créer des avatars réalistes et des représentations expressives des utilisateurs dans l'espace virtuel. L'application peut vérifier l'activation de la calibration du visage avant d'obtenir les poids des formes de mélange.

Suivi du visage

Un traceur de visage est un appareil de détection qui suit les expressions faciales via des flux d'images orientés vers l'utilisateur et le calibrage de la caméra. L'objectif principal de cette extension est de mapper les expressions faciales des utilisateurs sur leurs avatars dans une scène virtuelle.

Les données de suivi du visage sont des informations personnelles sensibles et sont étroitement liées à la confidentialité et à l'intégrité personnelles. Nous recommandons vivement aux applications qui stockent ou transfèrent des données de suivi du visage de toujours demander à l'utilisateur une acceptation active et spécifique.

  • Les applications recevront XR_ERROR_PERMISSION_INSUFFICIENT lors de la création d'un traceur de visage actif jusqu'à ce que l'application soit autorisée à accéder au traceur de visage.
  • Lorsque vous récupérez les états des visages à l'aide de xrGetFaceStateANDROID, XrFaceStateANDROID::isValid ne renvoie pas XR_TRUE, sauf si l'accès de l'application a été autorisé.

Créer un gestionnaire de suivi du visage

XR_DEFINE_HANDLE(XrFaceTrackerANDROID)

Le handle XrFaceTrackerANDROID représente un traceur de visage pour le suivi du visage.

Ce gestionnaire peut être utilisé pour accéder aux données de suivi du visage à l'aide d'autres fonctions de cette extension.

La fonction xrCreateFaceTrackerANDROID est définie comme suit:

XrResult xrCreateFaceTrackerANDROID(
    XrSession                                   session,
    const XrFaceTrackerCreateInfoANDROID*       createInfo,
    XrFaceTrackerANDROID*                       faceTracker);

Descriptions des paramètres

Une application peut créer un gestionnaire XrFaceTrackerANDROID à l'aide de la fonction xrCreateFaceTrackerANDROID.

Si le système n'est pas compatible avec le suivi du visage, xrCreateFaceTrackerANDROID renvoie XR_ERROR_FEATURE_UNSUPPORTED.

Utilisation valide (implicite)

Codes de retour

Réussite

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Échec

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_LIMIT_REACHED

La structure XrFaceTrackerCreateInfoANDROID est décrite comme suit:

typedef struct XrFaceTrackerCreateInfoANDROID {
    XrStructureType    type;
    void*              next;
} XrFaceTrackerCreateInfoANDROID;

Descriptions des membres

  • type est le XrStructureType de cette structure.
  • next est NULL ou un pointeur vers la structure suivante d'une chaîne de structures. Aucune de ces structures n'est définie dans OpenXR de base ni dans cette extension.

La structure XrFaceTrackerCreateInfoANDROID décrit les informations permettant de créer un gestionnaire XrFaceTrackerANDROID.

Utilisation valide (implicite)

La fonction xrDestroyFaceTrackerANDROID est définie comme suit:

XrResult xrDestroyFaceTrackerANDROID(
    XrFaceTrackerANDROID                        faceTracker);

Descriptions des paramètres

La fonction xrDestroyFaceTrackerANDROID libère faceTracker et les ressources sous-jacentes lorsque l'expérience de suivi du visage est terminée.

Utilisation valide (implicite)

Sécurité des threads

  • L'accès à faceTracker et à tous les gestionnaires enfants doit être synchronisé en externe.

Codes de retour

Réussite

  • XR_SUCCESS

Échec

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID

Vérifier le calibrage du visage

La fonction xrGetFaceCalibrationStateANDROID est définie comme suit:

XrResult xrGetFaceCalibrationStateANDROID(
    XrFaceTrackerANDROID                        faceTracker,
    XrBool32*                                   faceIsCalibratedOutput);

Descriptions des paramètres

Une application peut vérifier l'état de la calibration du visage à l'aide de la fonction xrGetFaceCalibrationStateANDROID.

Si le système n'est pas compatible avec le calibrage du visage, xrGetFaceCalibrationStateANDROID renvoie XR_ERROR_FEATURE_UNSUPPORTED. Sinon, faceIsCalibratedOutput peut être défini sur XR_TRUE pour refléter l'état de calibrage du cadran.

Utilisation valide (implicite)

Codes de retour

Réussite

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Échec

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_LIMIT_REACHED

Obtenir des expressions faciales

La fonction xrGetFaceStateANDROID renvoie les formes de fusion des expressions faciales à un moment donné.

XrResult xrGetFaceStateANDROID(
    XrFaceTrackerANDROID                        faceTracker,
    const XrFaceStateGetInfoANDROID*            getInfo,
    XrFaceStateANDROID*                         faceStateOutput);

Descriptions des paramètres

Utilisation valide (implicite)

Codes de retour

Réussite

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Échec

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_TIME_INVALID

La structure XrFaceStateGetInfoANDROID décrit les informations permettant d'obtenir des expressions faciales.

typedef struct XrFaceStateGetInfoANDROID {
    XrStructureType    type;
    void*              next;
    XrTime             time;
} XrFaceStateGetInfoANDROID;

Descriptions des membres

  • type est le XrStructureType de cette structure.
  • next est NULL ou un pointeur vers la structure suivante d'une chaîne de structures. Aucune de ces structures n'est définie dans OpenXR de base ni dans cette extension.
  • time est un XrTime au cours duquel les expressions faciales sont demandées.

Les applications doivent demander un temps égal au temps d'affichage prévu pour le frame affiché.

Utilisation valide (implicite)

La structure XrFaceStateANDROID renvoie l'état du suivi du visage et les expressions faciales.

typedef struct XrFaceStateANDROID {
    XrStructureType               type;
    void*                         next;
    uint32_t                      parametersCapacityInput;
    uint32_t                      parametersCountOutput;
    float*                        parameters;
    XrFaceTrackingStateANDROID    faceTrackingState;
    XrTime                        sampleTime;
    XrBool32                      isValid;
} XrFaceStateANDROID;

Descriptions des membres

  • type est le XrStructureType de cette structure.
  • next est NULL ou un pointeur vers la structure suivante d'une chaîne de structures. Aucune de ces structures n'est définie dans OpenXR de base ni dans cette extension.
  • parametersCapacityInput est un uint32_t décrivant la capacité du tableau parameters, ou 0 pour indiquer une requête visant à récupérer la capacité requise.
  • parametersCountOutput est un uint32_t décrivant le nombre de parameters ou la capacité requise si parametersCapacityInput est insuffisant.
  • parameters est un pointeur vers un tableau float alloué par l'application qui sera rempli de poids de formes de mélange d'expressions faciales.
  • faceTrackingState est le XrFaceTrackingStateANDROID de l'état de validité du suivi du visage.
  • sampleTime est un XrTime au moment duquel les expressions renvoyées sont suivies ou extrapolées. Il correspond à l'heure à laquelle les poids d'expression ont été demandés si l'extrapolation a réussi à ce moment-là.
  • isValid indique si les données sont valides, même si elles ne proviennent pas du frame actuel.
  • Pour obtenir une description détaillée de la récupération de la taille parameters requise, consultez la section Paramètres de taille de la mémoire tampon.

L'application peut définir parametersCapacityInput sur XR_FACE_PARAMETER_COUNT_ANDROID pour obtenir des expressions faciales indexées par XrFaceParameterIndicesANDROID.

Les parameters renvoyés représentent les poids des formes de fusion des expressions faciales actuelles.

Les mises à jour du tableau parameters seront triées afin que l'application puisse indexer les éléments à l'aide de l'énumération d'expressions faciales correspondante (par exemple, XrFaceParameterIndicesANDROID).

Utilisation valide (implicite)

L'énumération XrFaceTrackingStateANDROID identifie les différents états du suivi du visage.

typedef enum XrFaceTrackingStateANDROID {
    XR_FACE_TRACKING_STATE_PAUSED_ANDROID = 0,
    XR_FACE_TRACKING_STATE_STOPPED_ANDROID = 1,
    XR_FACE_TRACKING_STATE_TRACKING_ANDROID = 2
} XrFaceTrackingStateANDROID;

Les énumérations ont la signification suivante:

Énumération

Description

XR_FACE_TRACKING_STATE_PAUSED_ANDROID

Indique que le suivi du visage est suspendu, mais qu'il peut être repris à l'avenir.

XR_FACE_TRACKING_STATE_STOPPED_ANDROID

Le suivi a été arrêté, mais le client dispose toujours d'un suivi du visage actif.

XR_FACE_TRACKING_STATE_TRACKING_ANDROID

Le visage est suivi et sa position est actuelle.

Conventions concernant les formes de mélange

Cette extension définit 63 formes de mélange via XR_FACE_PARAMETER_COUNT_ANDROID, pour le format G-Nome réduit. Chaque paramètre de cette énumération est un indice dans un tableau de forme de mélange dont les valeurs sont de type float et que l'environnement d'exécution normalise à 1 - 0.

typedef enum XrFaceParameterIndicesANDROID {
    XR_FACE_PARAMETER_INDICES_BROW_LOWERER_L_ANDROID = 0,
    XR_FACE_PARAMETER_INDICES_BROW_LOWERER_R_ANDROID = 1,
    XR_FACE_PARAMETER_INDICES_CHEEK_PUFF_L_ANDROID = 2,
    XR_FACE_PARAMETER_INDICES_CHEEK_PUFF_R_ANDROID = 3,
    XR_FACE_PARAMETER_INDICES_CHEEK_RAISER_L_ANDROID = 4,
    XR_FACE_PARAMETER_INDICES_CHEEK_RAISER_R_ANDROID = 5,
    XR_FACE_PARAMETER_INDICES_CHEEK_SUCK_L_ANDROID = 6,
    XR_FACE_PARAMETER_INDICES_CHEEK_SUCK_R_ANDROID = 7,
    XR_FACE_PARAMETER_INDICES_CHIN_RAISER_B_ANDROID = 8,
    XR_FACE_PARAMETER_INDICES_CHIN_RAISER_T_ANDROID = 9,
    XR_FACE_PARAMETER_INDICES_DIMPLER_L_ANDROID = 10,
    XR_FACE_PARAMETER_INDICES_DIMPLER_R_ANDROID = 11,
    XR_FACE_PARAMETER_INDICES_EYES_CLOSED_L_ANDROID = 12,
    XR_FACE_PARAMETER_INDICES_EYES_CLOSED_R_ANDROID = 13,
    XR_FACE_PARAMETER_INDICES_EYES_LOOK_DOWN_L_ANDROID = 14,
    XR_FACE_PARAMETER_INDICES_EYES_LOOK_DOWN_R_ANDROID = 15,
    XR_FACE_PARAMETER_INDICES_EYES_LOOK_LEFT_L_ANDROID = 16,
    XR_FACE_PARAMETER_INDICES_EYES_LOOK_LEFT_R_ANDROID = 17,
    XR_FACE_PARAMETER_INDICES_EYES_LOOK_RIGHT_L_ANDROID = 18,
    XR_FACE_PARAMETER_INDICES_EYES_LOOK_RIGHT_R_ANDROID = 19,
    XR_FACE_PARAMETER_INDICES_EYES_LOOK_UP_L_ANDROID = 20,
    XR_FACE_PARAMETER_INDICES_EYES_LOOK_UP_R_ANDROID = 21,
    XR_FACE_PARAMETER_INDICES_INNER_BROW_RAISER_L_ANDROID = 22,
    XR_FACE_PARAMETER_INDICES_INNER_BROW_RAISER_R_ANDROID = 23,
    XR_FACE_PARAMETER_INDICES_JAW_DROP_ANDROID = 24,
    XR_FACE_PARAMETER_INDICES_JAW_SIDEWAYS_LEFT_ANDROID = 25,
    XR_FACE_PARAMETER_INDICES_JAW_SIDEWAYS_RIGHT_ANDROID = 26,
    XR_FACE_PARAMETER_INDICES_JAW_THRUST_ANDROID = 27,
    XR_FACE_PARAMETER_INDICES_LID_TIGHTENER_L_ANDROID = 28,
    XR_FACE_PARAMETER_INDICES_LID_TIGHTENER_R_ANDROID = 29,
    XR_FACE_PARAMETER_INDICES_LIP_CORNER_DEPRESSOR_L_ANDROID = 30,
    XR_FACE_PARAMETER_INDICES_LIP_CORNER_DEPRESSOR_R_ANDROID = 31,
    XR_FACE_PARAMETER_INDICES_LIP_CORNER_PULLER_L_ANDROID = 32,
    XR_FACE_PARAMETER_INDICES_LIP_CORNER_PULLER_R_ANDROID = 33,
    XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_LB_ANDROID = 34,
    XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_LT_ANDROID = 35,
    XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_RB_ANDROID = 36,
    XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_RT_ANDROID = 37,
    XR_FACE_PARAMETER_INDICES_LIP_PRESSOR_L_ANDROID = 38,
    XR_FACE_PARAMETER_INDICES_LIP_PRESSOR_R_ANDROID = 39,
    XR_FACE_PARAMETER_INDICES_LIP_PUCKER_L_ANDROID = 40,
    XR_FACE_PARAMETER_INDICES_LIP_PUCKER_R_ANDROID = 41,
    XR_FACE_PARAMETER_INDICES_LIP_STRETCHER_L_ANDROID = 42,
    XR_FACE_PARAMETER_INDICES_LIP_STRETCHER_R_ANDROID = 43,
    XR_FACE_PARAMETER_INDICES_LIP_SUCK_LB_ANDROID = 44,
    XR_FACE_PARAMETER_INDICES_LIP_SUCK_LT_ANDROID = 45,
    XR_FACE_PARAMETER_INDICES_LIP_SUCK_RB_ANDROID = 46,
    XR_FACE_PARAMETER_INDICES_LIP_SUCK_RT_ANDROID = 47,
    XR_FACE_PARAMETER_INDICES_LIP_TIGHTENER_L_ANDROID = 48,
    XR_FACE_PARAMETER_INDICES_LIP_TIGHTENER_R_ANDROID = 49,
    XR_FACE_PARAMETER_INDICES_LIPS_TOWARD_ANDROID = 50,
    XR_FACE_PARAMETER_INDICES_LOWER_LIP_DEPRESSOR_L_ANDROID = 51,
    XR_FACE_PARAMETER_INDICES_LOWER_LIP_DEPRESSOR_R_ANDROID = 52,
    XR_FACE_PARAMETER_INDICES_MOUTH_LEFT_ANDROID = 53,
    XR_FACE_PARAMETER_INDICES_MOUTH_RIGHT_ANDROID = 54,
    XR_FACE_PARAMETER_INDICES_NOSE_WRINKLER_L_ANDROID = 55,
    XR_FACE_PARAMETER_INDICES_NOSE_WRINKLER_R_ANDROID = 56,
    XR_FACE_PARAMETER_INDICES_OUTER_BROW_RAISER_L_ANDROID = 57,
    XR_FACE_PARAMETER_INDICES_OUTER_BROW_RAISER_R_ANDROID = 58,
    XR_FACE_PARAMETER_INDICES_UPPER_LID_RAISER_L_ANDROID = 59,
    XR_FACE_PARAMETER_INDICES_UPPER_LID_RAISER_R_ANDROID = 60,
    XR_FACE_PARAMETER_INDICES_UPPER_LIP_RAISER_L_ANDROID = 61,
    XR_FACE_PARAMETER_INDICES_UPPER_LIP_RAISER_R_ANDROID = 62
} XrFaceParameterIndicesANDROID;
Index Nom Image de référence
0 BROW_LOWERER_L
Image de référence pour un visage neutre
BROW_LOWERER_L = 0.0
image de référence pour le suivi du visage
BROW_LOWERER_L = 1.0
1 BROW_LOWERER_R
Image de référence pour un visage neutre
BROW_LOWERER_R = 0.0
image de référence pour le suivi du visage
BROW_LOWERER_R = 1.0
2 CHEEK_PUFF_L
Image de référence pour un visage neutre
CHEEK_PUFF_L = 0.0
image de référence pour le suivi du visage
CHEEK_PUFF_L = 1.0
3 CHEEK_PUFF_R
Image de référence pour un visage neutre
CHEEK_PUFF_R = 0.0
image de référence pour le suivi du visage
CHEEK_PUFF_R = 1.0
4 CHEEK_RAISER_L
Image de référence pour un visage neutre
CHEEK_RAISER_L = 0.0
image de référence pour le suivi du visage
CHEEK_RAISER_L = 1.0
5 CHEEK_RAISER_R
Image de référence pour un visage neutre
CHEEK_RAISER_R = 0.0
image de référence pour le suivi du visage
CHEEK_RAISER_R = 1.0
6 CHEEK_SUCK_L
Image de référence pour un visage neutre
CHEEK_SUCK_L = 0.0
image de référence pour le suivi du visage
CHEEK_SUCK_L = 1.0
7 CHEEK_SUCK_R
Image de référence pour un visage neutre
CHEEK_SUCK_R = 0.0
image de référence pour le suivi du visage
CHEEK_SUCK_R = 1.0
8 CHIN_RAISER_B
Image de référence pour un visage neutre
CHIN_RAISER_B = 0.0
image de référence pour le suivi du visage
CHIN_RAISER_B = 1.0
9 CHIN_RAISER_T
Image de référence pour un visage neutre
CHIN_RAISER_T = 0.0
image de référence pour le suivi du visage
CHIN_RAISER_T = 1.0
10 DIMPLER_L
Image de référence pour un visage neutre
DIMPLER_L = 0.0
image de référence pour le suivi du visage
DIMPLER_L = 1.0
11 DIMPLER_R
Image de référence pour un visage neutre
DIMPLER_R = 0.0
image de référence pour le suivi du visage
DIMPLER_R = 1.0
12 EYES_CLOSED_L
Image de référence pour un visage neutre
EYES_CLOSED_L = 0.0
image de référence pour le suivi du visage
EYES_CLOSED_L = 1.0
13 EYES_CLOSED_R
Image de référence pour un visage neutre
EYES_CLOSED_R = 0.0
image de référence pour le suivi du visage
EYES_CLOSED_R = 1.0
14 EYES_LOOK_DOWN_L
Image de référence pour un visage neutre
EYES_LOOK_DOWN_L = 0.0
image de référence pour le suivi du visage
EYES_LOOK_DOWN_L = 1.0
15 EYES_LOOK_DOWN_R
Image de référence pour un visage neutre
EYES_LOOK_DOWN_R = 0.0
image de référence pour le suivi du visage
EYES_LOOK_DOWN_R = 1.0
16 EYES_LOOK_LEFT_L
Image de référence pour un visage neutre
EYES_LOOK_LEFT_L = 0.0
image de référence pour le suivi du visage
EYES_LOOK_LEFT_L = 1.0
17 EYES_LOOK_LEFT_R
Image de référence pour un visage neutre
EYES_LOOK_LEFT_R = 0.0
image de référence pour le suivi du visage
EYES_LOOK_LEFT_R = 1.0
18 EYES_LOOK_RIGHT_L
Image de référence pour un visage neutre
EYES_LOOK_RIGHT_L = 0.0
image de référence pour le suivi du visage
EYES_LOOK_RIGHT_L = 1.0
19 EYES_LOOK_RIGHT_R
Image de référence pour un visage neutre
EYES_LOOK_RIGHT_R = 0.0
image de référence pour le suivi du visage
EYES_LOOK_RIGHT_R = 1.0
20 EYES_LOOK_UP_L
Image de référence pour un visage neutre
EYES_LOOK_UP_L = 0.0
image de référence pour le suivi du visage
EYES_LOOK_UP_L = 1.0
21 EYES_LOOK_UP_R
Image de référence pour un visage neutre
EYES_LOOK_UP_R = 0.0
image de référence pour le suivi du visage
EYES_LOOK_UP_R = 1.0
22 INNER_BROW_RAISER_L
Image de référence pour un visage neutre
INNER_BROW_RAISER_L = 0.0
image de référence pour le suivi du visage
INNER_BROW_RAISER_L = 1.0
23 INNER_BROW_RAISER_R
Image de référence pour un visage neutre
INNER_BROW_RAISER_R = 0.0
image de référence pour le suivi du visage
INNER_BROW_RAISER_R = 1.0
24 JAW_DROP
Image de référence pour un visage neutre
JAW_DROP = 0.0
image de référence pour le suivi du visage
JAW_DROP = 1.0
25 JAW_SIDEWAYS_LEFT
Image de référence pour un visage neutre
JAW_SIDEWAYS_LEFT = 0.0
image de référence pour le suivi du visage
JAW_SIDEWAYS_LEFT = 1.0
26 JAW_SIDEWAYS_RIGHT
Image de référence pour un visage neutre
JAW_SIDEWAYS_RIGHT = 0.0
image de référence pour le suivi du visage
JAW_SIDEWAYS_RIGHT = 1.0
27 JAW_THRUST
Image de référence pour un visage neutre
JAW_THRUST = 0.0
image de référence pour le suivi du visage
JAW_THRUST = 1.0
28 LID_TIGHTENER_L
Image de référence pour un visage neutre
LID_TIGHTENER_L = 0.0
image de référence pour le suivi du visage
LID_TIGHTENER_L = 1.0
29 LID_TIGHTENER_R
Image de référence pour un visage neutre
LID_TIGHTENER_R = 0.0
image de référence pour le suivi du visage
LID_TIGHTENER_R = 1.0
30 LIP_CORNER_DEPRESSOR_L
Image de référence pour un visage neutre
LIP_CORNER_DEPRESSOR_L = 0.0
image de référence pour le suivi du visage
LIP_CORNER_DEPRESSOR_L = 1.0
31 LIP_CORNER_DEPRESSOR_R
Image de référence pour un visage neutre
LIP_CORNER_DEPRESSOR_R = 0.0
image de référence pour le suivi du visage
LIP_CORNER_DEPRESSOR_R = 1.0
32 LIP_CORNER_PULLER_L
Image de référence pour un visage neutre
LIP_CORNER_PULLER_L = 0.0
image de référence pour le suivi du visage
LIP_CORNER_PULLER_L = 1.0
33 LIP_CORNER_PULLER_R
Image de référence pour un visage neutre
LIP_CORNER_PULLER_R = 0.0
image de référence pour le suivi du visage
LIP_CORNER_PULLER_R = 1.0
34 LIP_FUNNELER_LB
Image de référence pour un visage neutre
LIP_FUNNELER_LB = 0.0
image de référence pour le suivi du visage
LIP_FUNNELER_LB = 1.0
35 LIP_FUNNELER_LT
Image de référence pour un visage neutre
LIP_FUNNELER_LT = 0.0
image de référence pour le suivi du visage
LIP_FUNNELER_LT = 1.0
36 LIP_FUNNELER_RB
Image de référence pour un visage neutre
LIP_FUNNELER_RB = 0.0
image de référence pour le suivi du visage
LIP_FUNNELER_RB = 1.0
37 LIP_FUNNELER_RT
Image de référence pour un visage neutre
LIP_FUNNELER_RT = 0.0
image de référence pour le suivi du visage
LIP_FUNNELER_RT = 1.0
38 LIP_PRESSOR_L
Image de référence pour un visage neutre
LIP_PRESSOR_L = 0.0
image de référence pour le suivi du visage
LIP_PRESSOR_L = 1.0
39 LIP_PRESSOR_R
Image de référence pour un visage neutre
LIP_PRESSOR_R = 0.0
image de référence pour le suivi du visage
LIP_PRESSOR_R = 1.0
40 LIP_PUCKER_L
Image de référence pour un visage neutre
LIP_PUCKER_L = 0.0
image de référence pour le suivi du visage
LIP_PUCKER_L = 1.0
41 LIP_PUCKER_R
Image de référence pour un visage neutre
LIP_PUCKER_R = 0.0
image de référence pour le suivi du visage
LIP_PUCKER_R = 1.0
42 LIP_STRETCHER_L
Image de référence pour un visage neutre
LIP_STRETCHER_L = 0.0
image de référence pour le suivi du visage
LIP_STRETCHER_L = 1.0
43 LIP_STRETCHER_R
Image de référence pour un visage neutre
LIP_STRETCHER_R = 0.0
image de référence pour le suivi du visage
LIP_STRETCHER_R = 1.0
44 LIP_SUCK_LB
Image de référence pour un visage neutre
LIP_SUCK_LB = 0.0
image de référence pour le suivi du visage
LIP_SUCK_LB = 1.0
45 LIP_SUCK_LT
Image de référence pour un visage neutre
LIP_SUCK_LT = 0.0
image de référence pour le suivi du visage
LIP_SUCK_LT = 1.0
46 LIP_SUCK_RB
Image de référence pour un visage neutre
LIP_SUCK_RB = 0.0
image de référence pour le suivi du visage
LIP_SUCK_RB = 1.0
47 LIP_SUCK_RT
Image de référence pour un visage neutre
LIP_SUCK_RT = 0.0
image de référence pour le suivi du visage
LIP_SUCK_RT = 1.0
48 LIP_TIGHTENER_L
Image de référence pour un visage neutre
LIP_TIGHTENER_L = 0.0
image de référence pour le suivi du visage
LIP_TIGHTENER_L = 1.0
49 LIP_TIGHTENER_R
Image de référence pour un visage neutre
LIP_TIGHTENER_R = 0.0
image de référence pour le suivi du visage
LIP_TIGHTENER_R = 1.0
50 LIPS_TOWARD
Image de référence pour un visage neutre
LIPS_TOWARD = 0.0
image de référence pour le suivi du visage
JAW_DROP = 1.0 et LIPS_TOWARD = 1.0
51 LOWER_LIP_DEPRESSOR_L
Image de référence pour un visage neutre
LOWER_LIP_DEPRESSOR_L = 0.0
image de référence pour le suivi du visage
LOWER_LIP_DEPRESSOR_L = 1.0
52 LOWER_LIP_DEPRESSOR_R
Image de référence pour un visage neutre
LOWER_LIP_DEPRESSOR_R = 0.0
image de référence pour le suivi du visage
LOWER_LIP_DEPRESSOR_R = 1.0
53 MOUTH_LEFT
Image de référence pour un visage neutre
MOUTH_LEFT = 0.0
image de référence pour le suivi du visage
MOUTH_LEFT = 1.0
54 MOUTH_RIGHT
Image de référence pour un visage neutre
MOUTH_RIGHT = 0.0
image de référence pour le suivi du visage
MOUTH_RIGHT = 1.0
55 NOSE_WRINKLER_L
Image de référence pour un visage neutre
NOSE_WRINKLER_L = 0.0
image de référence pour le suivi du visage
NOSE_WRINKLER_L = 1.0
56 NOSE_WRINKLER_R
Image de référence pour un visage neutre
NOSE_WRINKLER_R = 0.0
image de référence pour le suivi du visage
NOSE_WRINKLER_R = 1.0
57 OUTER_BROW_RAISER_L
Image de référence pour un visage neutre
OUTER_BROW_RAISER_L = 0.0
image de référence pour le suivi du visage
OUTER_BROW_RAISER_L = 1.0
58 OUTER_BROW_RAISER_R
Image de référence pour un visage neutre
OUTER_BROW_RAISER_R = 0.0
image de référence pour le suivi du visage
OUTER_BROW_RAISER_R = 1.0
59 UPPER_LID_RAISER_L
Image de référence pour un visage neutre
UPPER_LID_RAISER_L = 0.0
image de référence pour le suivi du visage
UPPER_LID_RAISER_L = 1.0
60 UPPER_LID_RAISER_R
Image de référence pour un visage neutre
UPPER_LID_RAISER_R = 0.0
image de référence pour le suivi du visage
UPPER_LID_RAISER_R = 1.0
61 UPPER_LIP_RAISER_L
Image de référence pour un visage neutre
UPPER_LIP_RAISER_L = 0.0
image de référence pour le suivi du visage
UPPER_LIP_RAISER_L = 1.0
62 UPPER_LIP_RAISER_R
Image de référence pour un visage neutre
UPPER_LIP_RAISER_R = 0.0
image de référence pour le suivi du visage
UPPER_LIP_RAISER_R = 1.0

Exemple de code pour le suivi du visage

L'exemple de code suivant montre comment obtenir tous les poids pour les formes de mélange d'expressions faciales.

XrSession session; // previously initialized, for example created at app startup.

// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrCreateFaceTrackerANDROID xrCreateFaceTrackerANDROID; // previously initialized
PFN_xrDestroyFaceTrackerANDROID xrDestroyFaceTrackerANDROID; // previously initialized
PFN_xrGetFaceStateANDROID xrGetFaceStateANDROID; // previously initialized
PFN_xrGetFaceCalibrationStateANDROID xrGetFaceCalibrationStateANDROID; // previously initialized

XrFaceTrackerANDROID faceTracker;
XrFaceTrackerCreateInfoANDROID
        createInfo{.type = XR_TYPE_FACE_TRACKER_CREATE_INFO_ANDROID,
                    .next = nullptr};
CHK_XR(xrCreateFaceTrackerANDROID(session, &createInfo, &faceTracker));

// If the system supports face calibration:
bool isCalibrated;
CHK_XR(xrGetFaceCalibrationStateANDROID(faceTracker, &isCalibrated));
if (!isCalibrated) {
    // Redirect the user to system calibration setting.
}

XrFaceStateANDROID faceState;
float faceExpressionParameters[XR_FACE_PARAMETER_COUNT_ANDROID];
faceState.type = XR_TYPE_FACE_STATE_ANDROID;
faceState.next = nullptr;
faceState.parametersCapacityInput = XR_FACE_PARAMETER_COUNT_ANDROID;
faceState.parameters = faceExpressionParameters;

while (1) {
    // ...
    // For every frame in the frame loop
    // ...
    XrFrameState frameState; // previously returned from xrWaitFrame

    XrFaceStateGetInfoANDROID faceGetInfo{
            .type = XR_TYPE_FACE_STATE_GET_INFO_ANDROID,
            .next = nullptr,
            .time = frameState.predictedDisplayTime,
    };

    CHECK_XR(xrGetFaceStateANDROID(faceTracker, &faceGetInfo, &faceState));
    if (faceState.isValid) {
        for (uint32_t i = 0; i < XR_FACE_PARAMETER_COUNT_ANDROID; ++i) {
            // parameters[i] contains a weight of specific blend shape
        }
    }
}

// after usage
CHK_XR(xrDestroyFaceTrackerANDROID(faceTracker));

Nouveaux types d'objets

Nouvelles constantes d'énumération

  • XR_FACE_PARAMETER_COUNT_ANDROID

L'énumération XrObjectType est étendue avec:

  • XR_OBJECT_TYPE_FACE_TRACKER_ANDROID

L'énumération XrStructureType est étendue avec:

  • XR_TYPE_FACE_TRACKER_CREATE_INFO_ANDROID
  • XR_TYPE_FACE_STATE_GET_INFO_ANDROID
  • XR_TYPE_FACE_STATE_ANDROID

Nouvelles énumérations

Nouvelles structures

Nouvelles fonctions

Problèmes

Historique des versions

  • Révision 1, 5 septembre 2024 (Levana Chen)
    • Description initiale de l'extension