Extensão OpenXR XR_ANDROID_face_tracking

String de nome

XR_ANDROID_face_tracking

Tipo de extensão

Extensão de instância

Número de ramal registrado

459

Revisão

3

Dependências de extensão e versão

OpenXR 1.0

Data da última modificação

2025-06-04

Status do IP

Não há reivindicações de IP conhecidas.

Colaboradores

Spencer Quin, Google

Jared Finder, Google

Levana Chen, Google

Visão geral

Essa extensão permite que os aplicativos recebam pesos de formas de combinação e renderizem expressões faciais em experiências de XR.

Ela foi criada para fornecer as informações necessárias para criar avatares realistas e representações expressivas de usuários no espaço virtual. O aplicativo pode verificar a ativação da calibragem facial antes de receber os pesos das formas de combinação.

Rastreamento de rostos

Um rastreador facial é um dispositivo de detecção que acompanha a expressão facial usando fluxos de imagens voltados para o usuário e calibragem da câmera. O objetivo principal dessa extensão é mapear as expressões faciais dos usuários para os avatares deles em uma cena virtual.

Os dados de rastreamento facial são informações pessoais sensíveis e estão intimamente ligados à privacidade e integridade pessoais. Recomendamos que os aplicativos que armazenam ou transferem dados de rastreamento facial sempre peçam ao usuário uma permissão ativa e específica para fazer isso.

  • Os aplicativos vão receber XR_ERROR_PERMISSION_INSUFFICIENT ao criar um rastreador de rosto ativo até que o aplicativo tenha permissão para acessar o rastreador de rosto.
  • Ao receber estados de rosto usando xrGetFaceStateANDROID, XrFaceStateANDROID::isValid não vai retornar XR_TRUE, a menos que o acesso do aplicativo tenha sido permitido.

Inspecionar a capacidade do sistema

A estrutura XrSystemFaceTrackingPropertiesANDROID é definida da seguinte forma:

typedef struct XrSystemFaceTrackingPropertiesANDROID {
    XrStructureType    type;
    void*              next;
    XrBool32           supportsFaceTracking;
} XrSystemFaceTrackingPropertiesANDROID;

Descrições de membros

  • type é o XrStructureType dessa estrutura.
  • next é NULL ou um ponteiro para a próxima estrutura em uma cadeia de estruturas.
  • supportsFaceTracking é um XrBool32 que indica se o sistema atual é compatível com o rastreamento facial.

Um aplicativo pode inspecionar se o sistema é capaz de fazer o rastreamento facial estendendo o XrSystemProperties com a estrutura XrSystemFaceTrackingPropertiesANDROID ao chamar xrGetSystemProperties.

Se e somente se um ambiente de execução retornar XR_FALSE para supportsFaceTracking, o ambiente de execução deverá retornar XR_ERROR_FEATURE_UNSUPPORTED de xrCreateFaceTrackerANDROID.

Criar um handle para rastreador facial

XR_DEFINE_HANDLE(XrFaceTrackerANDROID)

O handle XrFaceTrackerANDROID representa um rastreador de rosto para rastreamento facial.

Esse identificador pode ser usado para acessar dados de rastreamento facial usando outras funções nesta extensão.

A função xrCreateFaceTrackerANDROID é definida como:

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

Descrições dos parâmetros

Um aplicativo pode criar um identificador XrFaceTrackerANDROID usando a função xrCreateFaceTrackerANDROID.

Se o sistema não for compatível com o rastreamento facial, xrCreateFaceTrackerANDROID vai retornar XR_ERROR_FEATURE_UNSUPPORTED.

Uso válido (implícito)

Códigos de retorno

Sucesso

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Falha

  • 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

A estrutura XrFaceTrackerCreateInfoANDROID é descrita da seguinte maneira:

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

Descrições de membros

  • type é o XrStructureType dessa estrutura.
  • next é NULL ou um ponteiro para a próxima estrutura em uma cadeia de estruturas. Nenhuma dessas estruturas é definida no OpenXR principal ou nesta extensão.

A estrutura XrFaceTrackerCreateInfoANDROID descreve as informações para criar um identificador XrFaceTrackerANDROID.

Uso válido (implícito)

A função xrDestroyFaceTrackerANDROID é definida como:

XrResult xrDestroyFaceTrackerANDROID(
    XrFaceTrackerANDROID                        faceTracker);

Descrições dos parâmetros

A função xrDestroyFaceTrackerANDROID libera o faceTracker e os recursos subjacentes quando a experiência de rastreamento facial termina.

Uso válido (implícito)

Concorrência segura

  • O acesso a faceTracker e a qualquer identificador filho precisa ser sincronizado externamente.

Códigos de retorno

Sucesso

  • XR_SUCCESS

Falha

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID

Verificar a calibragem do rosto

A função xrGetFaceCalibrationStateANDROID é definida como:

XrResult xrGetFaceCalibrationStateANDROID(
    XrFaceTrackerANDROID                        faceTracker,
    XrBool32*                                   faceIsCalibratedOutput);

Descrições dos parâmetros

Um aplicativo pode verificar o estado da calibragem do rosto usando a função xrGetFaceCalibrationStateANDROID.

Quando o serviço de rastreamento ainda está sendo inicializado, o ambiente de execução pode retornar XR_ERROR_SERVICE_NOT_READY_ANDROID de xrGetFaceCalibrationStateANDROID para indicar que o aplicativo pode tentar de novo mais tarde.

Se o sistema não for compatível com a calibragem facial, xrGetFaceCalibrationStateANDROID vai retornar XR_ERROR_FEATURE_UNSUPPORTED. Caso contrário, faceIsCalibratedOutput pode ser definido como XR_TRUE para refletir o estado de calibragem do rosto.

Uso válido (implícito)

Códigos de retorno

Sucesso

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Falha

  • 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_SERVICE_NOT_READY_ANDROID

Receber expressões faciais

A função xrGetFaceStateANDROID retorna formas de combinação de expressões faciais em um determinado momento.

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

Descrições dos parâmetros

Uso válido (implícito)

Códigos de retorno

Sucesso

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Falha

  • 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

A estrutura XrFaceStateGetInfoANDROID descreve as informações para obter expressões faciais.

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

Descrições de membros

  • type é o XrStructureType dessa estrutura.
  • next é NULL ou um ponteiro para a próxima estrutura em uma cadeia de estruturas. Nenhuma dessas estruturas é definida no OpenXR principal ou nesta extensão.
  • time é um XrTime em que as expressões faciais são solicitadas.

Os aplicativos devem solicitar um tempo igual ao tempo de exibição previsto para o frame renderizado.

Uso válido (implícito)

A estrutura XrFaceStateANDROID retorna o estado de monitoramento facial e as expressões faciais.

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

Descrições de membros

  • type é o XrStructureType dessa estrutura.
  • next é NULL ou um ponteiro para a próxima estrutura em uma cadeia de estruturas. Nenhuma dessas estruturas é definida no OpenXR principal ou nesta extensão.
  • parametersCapacityInput é um uint32_t que descreve a capacidade da matriz parameters ou 0 para indicar uma solicitação de recuperação da capacidade necessária.
  • parametersCountOutput é um uint32_t que descreve o número de parameters ou a capacidade necessária caso parametersCapacityInput seja insuficiente.
  • parameters é um ponteiro para uma matriz alocada pelo aplicativo de float que será preenchida com ponderações de formas de combinação de expressões faciais.
  • faceTrackingState é o XrFaceTrackingStateANDROID do status de validade do acompanhamento de rosto.
  • sampleTime é um XrTime em que as expressões retornadas são rastreadas ou extrapoladas. É igual ao momento em que os pesos da expressão foram solicitados, se a extrapolação na época foi bem-sucedida.
  • isValid indica se os dados são válidos mesmo que não sejam do frame atual.
  • regionConfidencesCapacityInput é um uint32_t que descreve a capacidade da matriz regionConfidences ou 0 para indicar uma solicitação de recuperação da capacidade necessária.
  • regionConfidencesCountOutput é um uint32_t que descreve o número de regionConfidences ou a capacidade necessária caso regionConfidencesCapacityInput seja insuficiente.
  • regionConfidences é um ponteiro para uma matriz alocada pelo aplicativo de float que será preenchida com valores de confiança para cada região facial.
  • Consulte a seção Parâmetros de tamanho do buffer para uma descrição detalhada de como recuperar o tamanho necessário de parameters e regionConfidences.

O aplicativo pode definir parametersCapacityInput como XR_FACE_PARAMETER_COUNT_ANDROID para receber expressões faciais indexadas por XrFaceParameterIndicesANDROID.

Os parameters retornados representam os pesos das formas de combinação das expressões faciais atuais.

As atualizações da matriz parameters serão ordenadas para que o aplicativo possa indexar elementos usando a enumeração de expressão facial correspondente (por exemplo, XrFaceParameterIndicesANDROID).

Uso válido (implícito)

  • A extensão XR_ANDROID_face_tracking precisa ser ativada antes de usar XrFaceStateANDROID.
  • type precisa ser XR_TYPE_FACE_STATE_ANDROID
  • next precisa ser NULL ou um ponteiro válido para a próxima estrutura em uma cadeia de estruturas
  • Se parametersCapacityInput não for 0, parameters, precisará ser um ponteiro para uma matriz de valores parametersCapacityInput float.
  • Se regionConfidencesCapacityInput não for 0, regionConfidences, precisará ser um ponteiro para uma matriz de valores regionConfidencesCapacityInput float.
  • faceTrackingState precisa ser um valor XrFaceTrackingStateANDROID válido

A enumeração XrFaceTrackingStateANDROID identifica os diferentes estados do rastreador facial.

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;

Os tipos enumerados têm os seguintes significados:

Enum

Descrição

XR_FACE_TRACKING_STATE_PAUSED_ANDROID

Indica que o rastreamento de rosto está pausado, mas pode ser retomado no futuro.

XR_FACE_TRACKING_STATE_STOPPED_ANDROID

O rastreamento foi interrompido, mas o cliente ainda tem um rastreador facial ativo.

XR_FACE_TRACKING_STATE_TRACKING_ANDROID

O rosto é rastreado e a pose está atual.

Regiões de confiança

A extensão XR_ANDROID_face_tracking também fornece valores de confiança para três regiões faciais: olho esquerdo, olho direito e parte inferior do rosto. Esses valores, que variam de 0 (nenhuma confiança) a 1 (maior confiança), indicam a precisão do rastreamento de rosto em cada região.

Você pode usar esses valores de confiança para desativar progressivamente as blendshapes ou aplicar filtros visuais (como desfoque) à região correspondente do rosto. Para um controle básico de ativação/desativação, recomendamos usar um limite de 0,3 para desativar totalmente as unidades de forma na região correspondente do rosto.

A área do "terço inferior do rosto" representa tudo abaixo dos olhos, incluindo a boca, o queixo, a bochecha e o nariz. A região dos olhos inclui os olhos e a área das sobrancelhas.

A tabela a seguir descreve as deformações associadas a cada região de confiança:

Região de confiança Blendshapes
Parte inferior do rosto `XR_FACE_PARAMETER_INDICES_CHEEK_PUFF_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHEEK_PUFF_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHEEK_RAISER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHEEK_RAISER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHEEK_SUCK_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHEEK_SUCK_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHIN_RAISER_B_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHIN_RAISER_T_ANDROID`, `XR_FACE_PARAMETER_INDICES_DIMPLER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_DIMPLER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_JAW_DROP_ANDROID`, `XR_FACE_PARAMETER_INDICES_JAW_SIDEWAYS_LEFT_ANDROID`, `XR_FACE_PARAMETER_INDICES_JAW_SIDEWAYS_RIGHT_ANDROID`, `XR_FACE_PARAMETER_INDICES_JAW_THRUST_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_CORNER_DEPRESSOR_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_CORNER_DEPRESSOR_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_CORNER_PULLER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_CORNER_PULLER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_LB_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_LT_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_RB_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_RT_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_PRESSOR_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_PRESSOR_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_PUCKER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_PUCKER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_STRETCHER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_STRETCHER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_SUCK_LB_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_SUCK_LT_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_SUCK_RB_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_SUCK_RT_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_TIGHTENER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_TIGHTENER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIPS_TOWARD_ANDROID`, `XR_FACE_PARAMETER_INDICES_LOWER_LIP_DEPRESSOR_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LOWER_LIP_DEPRESSOR_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_MOUTH_LEFT_ANDROID`, `XR_FACE_PARAMETER_INDICES_MOUTH_RIGHT_ANDROID`, `XR_FACE_PARAMETER_INDICES_NOSE_WRINKLER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_NOSE_WRINKLER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_UPPER_LID_RAISER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_UPPER_LID_RAISER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_UPPER_LIP_RAISER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_UPPER_LIP_RAISER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_TONGUE_OUT_ANDROID`, `XR_FACE_PARAMETER_INDICES_TONGUE_LEFT_ANDROID`, `XR_FACE_PARAMETER_INDICES_TONGUE_RIGHT_ANDROID`, `XR_FACE_PARAMETER_INDICES_TONGUE_UP_ANDROID`, `XR_FACE_PARAMETER_INDICES_TONGUE_DOWN_ANDROID`
Parte superior esquerda/direita do rosto `XR_FACE_PARAMETER_INDICES_BROW_LOWERER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_BROW_LOWERER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_CLOSED_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_CLOSED_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_DOWN_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_DOWN_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_LEFT_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_LEFT_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_RIGHT_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_RIGHT_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_UP_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_UP_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_INNER_BROW_RAISER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_INNER_BROW_RAISER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LID_TIGHTENER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LID_TIGHTENER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_OUTER_BROW_RAISER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_OUTER_BROW_RAISER_R_ANDROID`

Convenções de formas de fusão

Essa extensão define 68 formas de combinação usando XR_FACE_PARAMETER_COUNT_ANDROID para o formato G-Nome reduzido. Cada parâmetro neste enum é um índice em uma matriz de formas combinadas cujos valores são do tipo float e o tempo de execução normaliza para 1 a 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,
    XR_FACE_PARAMETER_INDICES_TONGUE_OUT_ANDROID = 63,
    XR_FACE_PARAMETER_INDICES_TONGUE_LEFT_ANDROID = 64,
    XR_FACE_PARAMETER_INDICES_TONGUE_RIGHT_ANDROID = 65,
    XR_FACE_PARAMETER_INDICES_TONGUE_UP_ANDROID = 66,
    XR_FACE_PARAMETER_INDICES_TONGUE_DOWN_ANDROID = 67
} XrFaceParameterIndicesANDROID;
Índice Nome Imagem de referência
0 BROW_LOWERER_L
Imagem de referência de um rosto neutro
BROW_LOWERER_L = 0.0
imagem de referência para rastreamento de rostos
BROW_LOWERER_L = 1.0
1 BROW_LOWERER_R
Imagem de referência de um rosto neutro
BROW_LOWERER_R = 0.0
imagem de referência para rastreamento de rostos
BROW_LOWERER_R = 1.0
2 CHEEK_PUFF_L
Imagem de referência de um rosto neutro
CHEEK_PUFF_L = 0.0
imagem de referência para rastreamento de rostos
CHEEK_PUFF_L = 1.0
3 CHEEK_PUFF_R
Imagem de referência de um rosto neutro
CHEEK_PUFF_R = 0.0
imagem de referência para rastreamento de rostos
CHEEK_PUFF_R = 1.0
4 CHEEK_RAISER_L
Imagem de referência de um rosto neutro
CHEEK_RAISER_L = 0.0
imagem de referência para rastreamento de rostos
CHEEK_RAISER_L = 1.0
5 CHEEK_RAISER_R
Imagem de referência de um rosto neutro
CHEEK_RAISER_R = 0.0
imagem de referência para rastreamento de rostos
CHEEK_RAISER_R = 1.0
6 CHEEK_SUCK_L
Imagem de referência de um rosto neutro
CHEEK_SUCK_L = 0.0
imagem de referência para rastreamento de rostos
CHEEK_SUCK_L = 1.0
7 CHEEK_SUCK_R
Imagem de referência de um rosto neutro
CHEEK_SUCK_R = 0.0
imagem de referência para rastreamento de rostos
CHEEK_SUCK_R = 1.0
8 CHIN_RAISER_B
Imagem de referência de um rosto neutro
CHIN_RAISER_B = 0.0
imagem de referência para rastreamento de rostos
CHIN_RAISER_B = 1.0
9 CHIN_RAISER_T
Imagem de referência de um rosto neutro
CHIN_RAISER_T = 0.0
imagem de referência para rastreamento de rostos
CHIN_RAISER_T = 1.0
10 DIMPLER_L
Imagem de referência de um rosto neutro
DIMPLER_L = 0.0
imagem de referência para rastreamento de rostos
DIMPLER_L = 1.0
11 DIMPLER_R
Imagem de referência de um rosto neutro
DIMPLER_R = 0.0
imagem de referência para rastreamento de rostos
DIMPLER_R = 1.0
12 EYES_CLOSED_L
Imagem de referência de um rosto neutro
EYES_CLOSED_L = 0.0
imagem de referência para rastreamento de rostos
EYES_CLOSED_L = 1.0
13 EYES_CLOSED_R
Imagem de referência de um rosto neutro
EYES_CLOSED_R = 0.0
imagem de referência para rastreamento de rostos
EYES_CLOSED_R = 1.0
14 EYES_LOOK_DOWN_L
Imagem de referência de um rosto neutro
EYES_LOOK_DOWN_L = 0.0
imagem de referência para rastreamento de rostos
EYES_LOOK_DOWN_L = 1.0
15 EYES_LOOK_DOWN_R
Imagem de referência de um rosto neutro
EYES_LOOK_DOWN_R = 0.0
imagem de referência para rastreamento de rostos
EYES_LOOK_DOWN_R = 1.0
16 EYES_LOOK_LEFT_L
Imagem de referência de um rosto neutro
EYES_LOOK_LEFT_L = 0.0
imagem de referência para rastreamento de rostos
EYES_LOOK_LEFT_L = 1.0
17 EYES_LOOK_LEFT_R
Imagem de referência de um rosto neutro
EYES_LOOK_LEFT_R = 0.0
imagem de referência para rastreamento de rostos
EYES_LOOK_LEFT_R = 1.0
18 EYES_LOOK_RIGHT_L
Imagem de referência de um rosto neutro
EYES_LOOK_RIGHT_L = 0.0
imagem de referência para rastreamento de rostos
EYES_LOOK_RIGHT_L = 1.0
19 EYES_LOOK_RIGHT_R
Imagem de referência de um rosto neutro
EYES_LOOK_RIGHT_R = 0.0
imagem de referência para rastreamento de rostos
EYES_LOOK_RIGHT_R = 1.0
20 EYES_LOOK_UP_L
Imagem de referência de um rosto neutro
EYES_LOOK_UP_L = 0.0
imagem de referência para rastreamento de rostos
EYES_LOOK_UP_L = 1.0
21 EYES_LOOK_UP_R
Imagem de referência de um rosto neutro
EYES_LOOK_UP_R = 0.0
imagem de referência para rastreamento de rostos
EYES_LOOK_UP_R = 1.0
22 INNER_BROW_RAISER_L
Imagem de referência de um rosto neutro
INNER_BROW_RAISER_L = 0.0
imagem de referência para rastreamento de rostos
INNER_BROW_RAISER_L = 1.0
23 INNER_BROW_RAISER_R
Imagem de referência de um rosto neutro
INNER_BROW_RAISER_R = 0.0
imagem de referência para rastreamento de rostos
INNER_BROW_RAISER_R = 1.0
24 JAW_DROP
Imagem de referência de um rosto neutro
JAW_DROP = 0.0
imagem de referência para rastreamento de rostos
JAW_DROP = 1.0
25 JAW_SIDEWAYS_LEFT
Imagem de referência de um rosto neutro
JAW_SIDEWAYS_LEFT = 0.0
imagem de referência para rastreamento de rostos
JAW_SIDEWAYS_LEFT = 1.0
26 JAW_SIDEWAYS_RIGHT
Imagem de referência de um rosto neutro
JAW_SIDEWAYS_RIGHT = 0.0
imagem de referência para rastreamento de rostos
JAW_SIDEWAYS_RIGHT = 1.0
27 JAW_THRUST
Imagem de referência de um rosto neutro
JAW_THRUST = 0.0
imagem de referência para rastreamento de rostos
JAW_THRUST = 1.0
28 LID_TIGHTENER_L
Imagem de referência de um rosto neutro
LID_TIGHTENER_L = 0.0
imagem de referência para rastreamento de rostos
LID_TIGHTENER_L = 1.0
29 LID_TIGHTENER_R
Imagem de referência de um rosto neutro
LID_TIGHTENER_R = 0.0
imagem de referência para rastreamento de rostos
LID_TIGHTENER_R = 1.0
30 LIP_CORNER_DEPRESSOR_L
Imagem de referência de um rosto neutro
LIP_CORNER_DEPRESSOR_L = 0.0
imagem de referência para rastreamento de rostos
LIP_CORNER_DEPRESSOR_L = 1.0
31 LIP_CORNER_DEPRESSOR_R
Imagem de referência de um rosto neutro
LIP_CORNER_DEPRESSOR_R = 0.0
imagem de referência para rastreamento de rostos
LIP_CORNER_DEPRESSOR_R = 1.0
32 LIP_CORNER_PULLER_L
Imagem de referência de um rosto neutro
LIP_CORNER_PULLER_L = 0.0
imagem de referência para rastreamento de rostos
LIP_CORNER_PULLER_L = 1.0
33 LIP_CORNER_PULLER_R
Imagem de referência de um rosto neutro
LIP_CORNER_PULLER_R = 0.0
imagem de referência para rastreamento de rostos
LIP_CORNER_PULLER_R = 1.0
34 LIP_FUNNELER_LB
Imagem de referência de um rosto neutro
LIP_FUNNELER_LB = 0.0
imagem de referência para rastreamento de rostos
LIP_FUNNELER_LB = 1.0
35 LIP_FUNNELER_LT
Imagem de referência de um rosto neutro
LIP_FUNNELER_LT = 0.0
imagem de referência para rastreamento de rostos
LIP_FUNNELER_LT = 1.0
36 LIP_FUNNELER_RB
Imagem de referência de um rosto neutro
LIP_FUNNELER_RB = 0.0
imagem de referência para rastreamento de rostos
LIP_FUNNELER_RB = 1.0
37 LIP_FUNNELER_RT
Imagem de referência de um rosto neutro
LIP_FUNNELER_RT = 0.0
imagem de referência para rastreamento de rostos
LIP_FUNNELER_RT = 1.0
38 LIP_PRESSOR_L
Imagem de referência de um rosto neutro
LIP_PRESSOR_L = 0.0
imagem de referência para rastreamento de rostos
LIP_PRESSOR_L = 1.0
39 LIP_PRESSOR_R
Imagem de referência de um rosto neutro
LIP_PRESSOR_R = 0.0
imagem de referência para rastreamento de rostos
LIP_PRESSOR_R = 1.0
40 LIP_PUCKER_L
Imagem de referência de um rosto neutro
LIP_PUCKER_L = 0.0
imagem de referência para rastreamento de rostos
LIP_PUCKER_L = 1.0
41 LIP_PUCKER_R
Imagem de referência de um rosto neutro
LIP_PUCKER_R = 0.0
imagem de referência para rastreamento de rostos
LIP_PUCKER_R = 1.0
42 LIP_STRETCHER_L
Imagem de referência de um rosto neutro
LIP_STRETCHER_L = 0.0
imagem de referência para rastreamento de rostos
LIP_STRETCHER_L = 1.0
43 LIP_STRETCHER_R
Imagem de referência de um rosto neutro
LIP_STRETCHER_R = 0.0
imagem de referência para rastreamento de rostos
LIP_STRETCHER_R = 1.0
44 LIP_SUCK_LB
Imagem de referência de um rosto neutro
LIP_SUCK_LB = 0.0
imagem de referência para rastreamento de rostos
LIP_SUCK_LB = 1.0
45 LIP_SUCK_LT
Imagem de referência de um rosto neutro
LIP_SUCK_LT = 0.0
imagem de referência para rastreamento de rostos
LIP_SUCK_LT = 1.0
46 LIP_SUCK_RB
Imagem de referência de um rosto neutro
LIP_SUCK_RB = 0.0
imagem de referência para rastreamento de rostos
LIP_SUCK_RB = 1.0
47 LIP_SUCK_RT
Imagem de referência de um rosto neutro
LIP_SUCK_RT = 0.0
imagem de referência para rastreamento de rostos
LIP_SUCK_RT = 1.0
48 LIP_TIGHTENER_L
Imagem de referência de um rosto neutro
LIP_TIGHTENER_L = 0.0
imagem de referência para rastreamento de rostos
LIP_TIGHTENER_L = 1.0
49 LIP_TIGHTENER_R
Imagem de referência de um rosto neutro
LIP_TIGHTENER_R = 0.0
imagem de referência para rastreamento de rostos
LIP_TIGHTENER_R = 1.0
50 LIPS_TOWARD
Imagem de referência de um rosto neutro
LIPS_TOWARD = 0.0
imagem de referência para rastreamento de rostos
JAW_DROP = 1.0 and LIPS_TOWARD = 1.0
51 LOWER_LIP_DEPRESSOR_L
Imagem de referência de um rosto neutro
LOWER_LIP_DEPRESSOR_L = 0.0
imagem de referência para rastreamento de rostos
LOWER_LIP_DEPRESSOR_L = 1.0
52 LOWER_LIP_DEPRESSOR_R
Imagem de referência de um rosto neutro
LOWER_LIP_DEPRESSOR_R = 0.0
imagem de referência para rastreamento de rostos
LOWER_LIP_DEPRESSOR_R = 1.0
53 MOUTH_LEFT
Imagem de referência de um rosto neutro
MOUTH_LEFT = 0.0
imagem de referência para rastreamento de rostos
MOUTH_LEFT = 1.0
54 MOUTH_RIGHT
Imagem de referência de um rosto neutro
MOUTH_RIGHT = 0.0
imagem de referência para rastreamento de rostos
MOUTH_RIGHT = 1.0
55 NOSE_WRINKLER_L
Imagem de referência de um rosto neutro
NOSE_WRINKLER_L = 0.0
imagem de referência para rastreamento de rostos
NOSE_WRINKLER_L = 1.0
56 NOSE_WRINKLER_R
Imagem de referência de um rosto neutro
NOSE_WRINKLER_R = 0.0
imagem de referência para rastreamento de rostos
NOSE_WRINKLER_R = 1.0
57 OUTER_BROW_RAISER_L
Imagem de referência de um rosto neutro
OUTER_BROW_RAISER_L = 0.0
imagem de referência para rastreamento de rostos
OUTER_BROW_RAISER_L = 1.0
58 OUTER_BROW_RAISER_R
Imagem de referência de um rosto neutro
OUTER_BROW_RAISER_R = 0.0
imagem de referência para rastreamento de rostos
OUTER_BROW_RAISER_R = 1.0
59 UPPER_LID_RAISER_L
Imagem de referência de um rosto neutro
UPPER_LID_RAISER_L = 0.0
imagem de referência para rastreamento de rostos
UPPER_LID_RAISER_L = 1.0
60 UPPER_LID_RAISER_R
Imagem de referência de um rosto neutro
UPPER_LID_RAISER_R = 0.0
imagem de referência para rastreamento de rostos
UPPER_LID_RAISER_R = 1.0
61 UPPER_LIP_RAISER_L
Imagem de referência de um rosto neutro
UPPER_LIP_RAISER_L = 0.0
imagem de referência para rastreamento de rostos
UPPER_LIP_RAISER_L = 1.0
62 UPPER_LIP_RAISER_R
Imagem de referência de um rosto neutro
UPPER_LIP_RAISER_R = 0.0
imagem de referência para rastreamento de rostos
UPPER_LIP_RAISER_R = 1.0
63 TONGUE_OUT
Imagem de referência de um rosto neutro
TONGUE_OUT = 0.0
imagem de referência para rastreamento de rostos
TONGUE_OUT = 1.0
64 TONGUE_LEFT
Imagem de referência de um rosto neutro
TONGUE_LEFT = 0.0
imagem de referência para rastreamento de rostos
TONGUE_LEFT = 1.0
65 TONGUE_RIGHT
Imagem de referência de um rosto neutro
TONGUE_RIGHT = 0.0
imagem de referência para rastreamento de rostos
TONGUE_RIGHT = 1.0
66 TONGUE_UP
Imagem de referência de um rosto neutro
TONGUE_UP = 0.0
imagem de referência para rastreamento de rostos
TONGUE_UP = 1.0
67 TONGUE_DOWN
Imagem de referência de um rosto neutro
TONGUE_DOWN = 0.0
imagem de referência para rastreamento de rostos
TONGUE_DOWN = 1.0

Exemplo de código para rastreamento facial

O exemplo de código a seguir demonstra como receber todos os pesos para formas de combinação de expressões faciais.

XrInstance instance; // previously initialized
XrSystemId systemId; // previously initialized
XrSession session; // previously initialized, e.g. 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

// Inspect system capability
XrSystemProperties properties{XR_TYPE_SYSTEM_PROPERTIES};
XrSystemFaceTrackingPropertiesANDROID faceTrackingProperties{XR_TYPE_SYSTEM_FACE_TRACKING_PROPERTIES_ANDROID};
properties.next = &faceTrackingProperties;
CHK_XR(xrGetSystemProperties(instance, systemId, &properties));
if (!faceTrackingProperties.supportsFaceTracking) {
  // face tracking is not supported.
  return;
}

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:
XrBool32 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;
float regionConfidences[XR_FACE_REGION_CONFIDENCE_COUNT_ANDROID];
faceState.regionConfidencesCapacityInput = XR_FACE_REGION_CONFIDENCE_COUNT_ANDROID;
faceState.regionConfidences = regionConfidences;

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,
    };

    CHK_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
        }
        for (uint32_t i = 0; i < XR_FACE_REGION_CONFIDENCE_COUNT_ANDROID; ++i) {
            // regionConfidences[i] contains a confidence value of a specific region
        }
    }
}

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

Novos tipos de objetos

Novas constantes de enumeração

  • XR_FACE_PARAMETER_COUNT_ANDROID

A enumeração XrObjectType é estendida com:

  • XR_OBJECT_TYPE_FACE_TRACKER_ANDROID

A enumeração XrStructureType é estendida com:

  • XR_TYPE_FACE_TRACKER_CREATE_INFO_ANDROID
  • XR_TYPE_FACE_STATE_GET_INFO_ANDROID
  • XR_TYPE_FACE_STATE_ANDROID
  • XR_TYPE_SYSTEM_FACE_TRACKING_PROPERTIES_ANDROID

Novos enums

Novas estruturas

Novas funções

Problemas

Histórico de versões

  • Revisão 1, 05/09/2024 (Levana Chen)
    • Descrição inicial da extensão
  • Revisão 2, 01/04/2025 (Kenny Vercaemer)
    • Regiões de confiança de rosto adicionadas
  • Revisão 3, 04/06/2025 (Levana Chen)
    • Adicionamos um novo código de erro.

OpenXR™ e o logotipo OpenXR são marcas registradas de propriedade da The Khronos Group Inc. e estão registradas como marcas comerciais na China, na União Europeia, no Japão e no Reino Unido.