XR_ANDROID_face_tracking Расширение OpenXR

Имя Строка

XR_ANDROID_face_tracking

Тип расширения

Расширение экземпляра

Зарегистрированный добавочный номер

459

Пересмотр

3

Зависимости расширений и версий

OpenXR 1.0

Дата последнего изменения

2025-06-04

Статус IP

Известных претензий на права интеллектуальной собственности нет.

Авторы

Спенсер Куин, Google

Джаред Файндер, Google

Левана Чен, Google

Обзор

Это расширение позволяет приложениям получать веса смешанных форм и отображать выражения лиц в XR-опытах.

Это расширение предназначено для предоставления информации, необходимой для создания реалистичных аватаров и выразительных представлений пользователей в виртуальном пространстве. Приложение может проверять активацию калибровки лица перед получением весов для смешанных форм.

Отслеживание лица

Фейс-трекер — это сенсорное устройство, отслеживающее выражение лица пользователя с помощью потоков изображений и калибровки камеры. Основная цель этого расширения — сопоставить выражение лица пользователя с его аватарами в виртуальной сцене.

Данные отслеживания лица являются конфиденциальной персональной информацией и тесно связаны с конфиденциальностью и неприкосновенностью личной жизни. Настоятельно рекомендуется, чтобы приложения, хранящие или передающие данные отслеживания лица, всегда запрашивали у пользователя активное и конкретное согласие на это.

  • Приложения будут получать XR_ERROR_PERMISSION_INSUFFICIENT при создании активного средства отслеживания лиц до тех пор, пока приложению не будет разрешен доступ к средству отслеживания лиц.
  • При получении состояний лица с помощью xrGetFaceStateANDROID метод XrFaceStateANDROID::isValid не вернет XR_TRUE , если приложению не разрешен доступ.

Проверить возможности системы

Структура XrSystemFaceTrackingPropertiesANDROID определяется как:

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

Описания участников

  • typeXrStructureType этой структуры.
  • nextNULL или указатель на следующую структуру в цепочке структур.
  • supportsFaceTracking — это XrBool32 , указывающий, поддерживает ли текущая система отслеживание лица.

Приложение может проверить, способна ли система отслеживать лица, расширив XrSystemProperties с помощью структуры XrSystemFaceTrackingPropertiesANDROID при вызове xrGetSystemProperties .

Если и только если среда выполнения возвращает XR_FALSE для supportsFaceTracking , среда выполнения должна вернуть XR_ERROR_FEATURE_UNSUPPORTED из xrCreateFaceTrackerANDROID .

Создайте идентификатор для отслеживания лица

XR_DEFINE_HANDLE(XrFaceTrackerANDROID)

Дескриптор XrFaceTrackerANDROID представляет собой средство отслеживания лица.

Этот дескриптор можно использовать для доступа к данным отслеживания лица с помощью других функций этого расширения.

Функция xrCreateFaceTrackerANDROID определяется как:

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

Описания параметров

  • session — это дескриптор XrSession , в котором будет активен трекер лиц.
  • createInfo — это XrFaceTrackerCreateInfoANDROID , используемый для указания средства отслеживания лиц.
  • faceTracker — это возвращенный дескриптор XrFaceTrackerANDROID .

Приложение может создать дескриптор XrFaceTrackerANDROID с помощью функции xrCreateFaceTrackerANDROID .

Если система не поддерживает отслеживание лица, xrCreateFaceTrackerANDROID вернет XR_ERROR_FEATURE_UNSUPPORTED .

Допустимое использование (неявное)

Коды возврата

Успех

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Отказ

  • 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

Структура XrFaceTrackerCreateInfoANDROID описывается следующим образом:

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

Описания участников

  • typeXrStructureType этой структуры.
  • next — это NULL или указатель на следующую структуру в цепочке структур. Такие структуры не определены ни в ядре OpenXR, ни в этом расширении.

Структура XrFaceTrackerCreateInfoANDROID описывает информацию для создания дескриптора XrFaceTrackerANDROID .

Допустимое использование (неявное)

Функция xrDestroyFaceTrackerANDROID определяется как:

XrResult xrDestroyFaceTrackerANDROID(
    XrFaceTrackerANDROID                        faceTracker);

Описания параметров

Функция xrDestroyFaceTrackerANDROID освобождает faceTracker и базовые ресурсы после завершения процесса отслеживания лица.

Допустимое использование (неявное)

Безопасность потока

  • Доступ к faceTracker и любым дочерним дескрипторам должен быть синхронизирован извне.

Коды возврата

Успех

  • XR_SUCCESS

Отказ

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID

Проверьте калибровку лица

Функция xrGetFaceCalibrationStateANDROID определяется как:

XrResult xrGetFaceCalibrationStateANDROID(
    XrFaceTrackerANDROID                        faceTracker,
    XrBool32*                                   faceIsCalibratedOutput);

Описания параметров

  • faceTracker — это XrFaceTrackerANDROID , ранее созданный xrCreateFaceTrackerANDROID .
  • faceIsCalibratedOutput указывает, откалибровано ли устройство отслеживания лиц.

Приложение может проверить состояние калибровки лица с помощью функции xrGetFaceCalibrationStateANDROID .

Когда служба отслеживания все еще находится в стадии инициализации, среда выполнения может вернуть XR_ERROR_SERVICE_NOT_READY_ANDROID из xrGetFaceCalibrationStateANDROID , чтобы указать, что приложение может повторить попытку позже.

Если система не поддерживает калибровку лица, xrGetFaceCalibrationStateANDROID вернёт XR_ERROR_FEATURE_UNSUPPORTED . В противном случае faceIsCalibratedOutput может быть установлен в XR_TRUE , чтобы отразить состояние калибровки лица.

Допустимое использование (неявное)

Коды возврата

Успех

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Отказ

  • 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

Получить выражения лица

Функция xrGetFaceStateANDROID возвращает смешанные формы выражений лица в заданный момент времени.

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

Описания параметров

  • faceTracker — это XrFaceTrackerANDROID , ранее созданный xrCreateFaceTrackerANDROID .
  • getInfo — указатель на XrFaceStateGetInfoANDROID , описывающий информацию для получения выражений лица.
  • faceStateOutput — указатель на XrFaceStateANDROID , принимающий возвращаемое состояние отслеживания лица и выражения лица.

Допустимое использование (неявное)

Коды возврата

Успех

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Отказ

  • 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

Структура XrFaceStateGetInfoANDROID описывает информацию для получения выражений лица.

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

Описания участников

  • typeXrStructureType этой структуры.
  • next — это NULL или указатель на следующую структуру в цепочке структур. Такие структуры не определены ни в ядре OpenXR, ни в этом расширении.
  • time — это XrTime , в течение которого запрашиваются выражения лица.

Приложения должны запрашивать время, равное прогнозируемому времени отображения визуализированного кадра.

Допустимое использование (неявное)

Структура XrFaceStateANDROID возвращает состояние отслеживания лица и выражения лица.

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;

Описания участников

  • typeXrStructureType этой структуры.
  • next — это NULL или указатель на следующую структуру в цепочке структур. Такие структуры не определены ни в ядре OpenXR, ни в этом расширении.
  • parametersCapacityInput — это uint32_t описывающий емкость массива parameters , или 0 для указания запроса на извлечение требуемой емкости.
  • parametersCountOutput — это uint32_t , описывающий количество parameters или требуемую емкость в случае, если parametersCapacityInput недостаточно.
  • parameters — указатель на выделенный приложением массив float с плавающей точкой, который будет заполнен весами форм смешивания выражений лица.
  • faceTrackingState — это XrFaceTrackingStateANDROID статуса достоверности отслеживания лиц.
  • sampleTime — это время XrTime , на которое отслеживаются или экстраполируются возвращаемые выражения. Оно равно времени запроса весовых коэффициентов выражений, если экстраполяция в тот момент прошла успешно.
  • isValid указывает, являются ли данные действительными, даже если они не из текущего кадра.
  • regionConfidencesCapacityInput — это uint32_t описывающий емкость массива regionConfidences , или 0 для указания запроса на извлечение требуемой емкости.
  • regionConfidencesCountOutput — это uint32_t описывающий количество regionConfidences или требуемую емкость в случае, если regionConfidencesCapacityInput недостаточен.
  • regionConfidences — указатель на выделенный приложением массив float с плавающей точкой, который будет заполнен значениями уверенности для каждой области лица.
  • Подробное описание получения требуемых parameters и размера regionConfidences см. в разделе «Параметры размера буфера».

Приложение может установить parametersCapacityInput в XR_FACE_PARAMETER_COUNT_ANDROID чтобы получить выражения лица, индексируемые XrFaceParameterIndicesANDROID .

Возвращаемые parameters представляют собой веса смешанных форм текущих выражений лица.

Обновления массива parameters будут упорядочены таким образом, чтобы приложение могло индексировать элементы, используя соответствующее перечисление выражений лица (например, XrFaceParameterIndicesANDROID ).

Допустимое использование (неявное)

  • Перед использованием XrFaceStateANDROID необходимо включить расширение XR_ANDROID_face_tracking
  • type должен быть XR_TYPE_FACE_STATE_ANDROID
  • next должен быть NULL или действительным указателем на следующую структуру в цепочке структур
  • Если parametersCapacityInput не равен 0, parameters должен быть указателем на массив значений parametersCapacityInput float
  • Если regionConfidencesCapacityInput не равен 0, regionConfidences должен быть указателем на массив значений regionConfidencesCapacityInput float
  • faceTrackingState должно быть допустимым значением XrFaceTrackingStateANDROID

Перечисление XrFaceTrackingStateANDROID идентифицирует различные состояния устройства отслеживания лиц.

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;

Перечисления имеют следующие значения:

Перечисление

Описание

XR_FACE_TRACKING_STATE_PAUSED_ANDROID

Указывает на то, что отслеживание лица приостановлено, но может быть возобновлено в будущем.

XR_FACE_TRACKING_STATE_STOPPED_ANDROID

Отслеживание остановлено, но у клиента все еще активен трекер лица.

XR_FACE_TRACKING_STATE_TRACKING_ANDROID

Лицо отслеживается и его поза является актуальной.

Регионы доверия

Расширение XR_ANDROID_face_tracking также предоставляет значения достоверности для трёх областей лица: левого глаза, правого глаза и нижней части лица. Эти значения, варьирующиеся от 0 (нет достоверности) до 1 (максимальная достоверность), указывают на точность отслеживания лица для каждой области.

Вы можете использовать эти значения достоверности для постепенного отключения эффектов смешивания или применения визуальных фильтров (например, размытия) к соответствующей области лица. Для базового управления включением/выключением мы рекомендуем использовать пороговое значение 0,3 для полной деактивации эффектов смешивания в соответствующей области лица.

Нижняя часть лица охватывает всё, что находится под глазами, включая рот, подбородок, щёки и нос. Область глаз включает в себя область вокруг глаз и бровей.

В следующей таблице описываются смешанные формы, соответствующие каждой области уверенности:

Регион доверия Blendshapes
Нижняя часть лица `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`
Левая/правая верхняя часть лица `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_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`

Условные обозначения форм смешивания

Это расширение определяет 68 форм смешивания через XR_FACE_PARAMETER_COUNT_ANDROID для сокращённого формата G-Nome. Каждый параметр в этом перечислении представляет собой индекс в массиве форм смешивания, значения которого имеют тип float , а среда выполнения нормализуется до 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,
    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;
Индекс Имя Справочное изображение
0 BROW_LOWERER_L
Эталонное изображение нейтрального лица
BROW_LOWERER_L = 0.0
эталонное изображение для отслеживания лица
BROW_LOWERER_L = 1.0
1 BROW_LOWERER_R
Эталонное изображение нейтрального лица
BROW_LOWERER_R = 0.0
эталонное изображение для отслеживания лица
BROW_LOWERER_R = 1.0
2 CHEEK_PUFF_L
Эталонное изображение нейтрального лица
CHEEK_PUFF_L = 0.0
эталонное изображение для отслеживания лица
CHEEK_PUFF_L = 1.0
3 CHEEK_PUFF_R
Эталонное изображение нейтрального лица
CHEEK_PUFF_R = 0.0
эталонное изображение для отслеживания лица
CHEEK_PUFF_R = 1.0
4 CHEEK_RAISER_L
Эталонное изображение нейтрального лица
CHEEK_RAISER_L = 0.0
эталонное изображение для отслеживания лица
CHEEK_RAISER_L = 1.0
5 CHEEK_RAISER_R
Эталонное изображение нейтрального лица
CHEEK_RAISER_R = 0.0
эталонное изображение для отслеживания лица
CHEEK_RAISER_R = 1.0
6 CHEEK_SUCK_L
Эталонное изображение нейтрального лица
CHEEK_SUCK_L = 0.0
эталонное изображение для отслеживания лица
CHEEK_SUCK_L = 1.0
7 CHEEK_SUCK_R
Эталонное изображение нейтрального лица
CHEEK_SUCK_R = 0.0
эталонное изображение для отслеживания лица
CHEEK_SUCK_R = 1.0
8 CHIN_RAISER_B
Эталонное изображение нейтрального лица
CHIN_RAISER_B = 0.0
эталонное изображение для отслеживания лица
CHIN_RAISER_B = 1.0
9 CHIN_RAISER_T
Эталонное изображение нейтрального лица
CHIN_RAISER_T = 0.0
эталонное изображение для отслеживания лица
CHIN_RAISER_T = 1.0
10 DIMPLER_L
Эталонное изображение нейтрального лица
ДИМПЛЕР_Л = 0,0
эталонное изображение для отслеживания лица
ДИМПЛЕР_Л = 1,0
11 DIMPLER_R
Эталонное изображение нейтрального лица
ДИМПЛЕЕР_Р = 0,0
эталонное изображение для отслеживания лица
ДИМПЛЕЕР_Р = 1,0
12 ГЛАЗА_ЗАКРЫТЫ_Л
Эталонное изображение нейтрального лица
ГЛАЗА_ЗАКРЫТЫ_Д = 0,0
эталонное изображение для отслеживания лица
ГЛАЗА_ЗАКРЫТЫ_Д = 1.0
13 ГЛАЗА_ЗАКРЫТЫ_Р
Эталонное изображение нейтрального лица
ГЛАЗА_ЗАКРЫТЫ_Р = 0,0
эталонное изображение для отслеживания лица
ГЛАЗА_ЗАКРЫТЫ_П = 1.0
14 ГЛАЗА_ВЗГЛЯД_ВНИЗ_Л
Эталонное изображение нейтрального лица
ГЛАЗА_ВЗГЛЯД_ВНИЗ_Л = 0.0
эталонное изображение для отслеживания лица
ГЛАЗА_ВЗГЛЯД_ВНИЗ_Л = 1.0
15 EYES_LOOK_DOWN_R
Эталонное изображение нейтрального лица
ГЛАЗА_ВЗГЛЯД_ВНИЗ_R = 0.0
эталонное изображение для отслеживания лица
ГЛАЗА_ВЗГЛЯД_ВНИЗ_R = 1.0
16 EYES_LOOK_LEFT_L
Эталонное изображение нейтрального лица
ГЛАЗА_ВЗГЛЯД_ВЛЕВО = 0.0
эталонное изображение для отслеживания лица
ГЛАЗА_ВЗГЛЯД_ВЛЕВО = 1.0
17 EYES_LOOK_LEFT_R
Эталонное изображение нейтрального лица
ГЛАЗА_ВЗГЛЯД_ВЛЕВО_ПРАВО = 0.0
эталонное изображение для отслеживания лица
ГЛАЗА_ВЗГЛЯД_ВЛЕВО_ПРАВО = 1.0
18 EYES_LOOK_RIGHT_L
Эталонное изображение нейтрального лица
ГЛАЗА_ПРАВЫЙ_ВЗГЛЯД = 0.0
эталонное изображение для отслеживания лица
ГЛАЗА_ПРАВИЛЬНЫЙ_ВЗГЛЯД = 1.0
19 EYES_LOOK_RIGHT_R
Эталонное изображение нейтрального лица
ГЛАЗА_ПРАВЫЙ_ВЗГЛЯД = 0.0
эталонное изображение для отслеживания лица
ГЛАЗА_ПРАВЫЙ_ВЗГЛЯД = 1.0
20 EYES_LOOK_UP_L
Эталонное изображение нейтрального лица
ГЛАЗА_ВЗГЛЯД_ВВЕРХ_Л = 0.0
эталонное изображение для отслеживания лица
ГЛАЗА_ВЗГЛЯД_ВВЕРХ_Л = 1.0
21 EYES_LOOK_UP_R
Эталонное изображение нейтрального лица
EYES_LOOK_UP_R = 0.0
эталонное изображение для отслеживания лица
EYES_LOOK_UP_R = 1.0
22 INNER_BROW_RAISER_L
Эталонное изображение нейтрального лица
ВНУТРЕННИЙ_ПОДЪЕМ_БРОВИ = 0.0
эталонное изображение для отслеживания лица
ВНУТРЕННИЙ_ПОДЪЕМ_БРОВИ = 1.0
23 INNER_BROW_RAISER_R
Эталонное изображение нейтрального лица
ВНУТРЕННИЙ_ПОДЪЕМ_БРОВИ = 0.0
эталонное изображение для отслеживания лица
ВНУТРЕННИЙ_ПОДЪЕМ_БРОВИ = 1.0
24 JAW_DROP
Эталонное изображение нейтрального лица
JAW_DROP = 0.0
эталонное изображение для отслеживания лица
JAW_DROP = 1.0
25 JAW_SIDEWAYS_LEFT
Эталонное изображение нейтрального лица
JAW_SIDEWAYS_LEFT = 0.0
эталонное изображение для отслеживания лица
JAW_SIDEWAYS_LEFT = 1.0
26 JAW_SIDEWAYS_RIGHT
Эталонное изображение нейтрального лица
JAW_SIDEWAYS_RIGHT = 0.0
эталонное изображение для отслеживания лица
JAW_SIDEWAYS_RIGHT = 1.0
27 JAW_THRUST
Эталонное изображение нейтрального лица
JAW_THRUST = 0.0
эталонное изображение для отслеживания лица
JAW_THRUST = 1.0
28 LID_TIGHTENER_L
Эталонное изображение нейтрального лица
LID_TIGHTENER_L = 0.0
эталонное изображение для отслеживания лица
LID_TIGHTENER_L = 1.0
29 LID_TIGHTENER_R
Эталонное изображение нейтрального лица
LID_TIGHTENER_R = 0.0
эталонное изображение для отслеживания лица
LID_TIGHTENER_R = 1.0
30 LIP_CORNER_DEPRESSOR_L
Эталонное изображение нейтрального лица
LIP_CORNER_DEPRESSOR_L = 0.0
эталонное изображение для отслеживания лица
LIP_CORNER_DEPRESSOR_L = 1.0
31 LIP_CORNER_DEPRESSOR_R
Эталонное изображение нейтрального лица
LIP_CORNER_DEPRESSOR_R = 0.0
эталонное изображение для отслеживания лица
LIP_CORNER_DEPRESSOR_R = 1.0
32 LIP_CORNER_PULLER_L
Эталонное изображение нейтрального лица
LIP_CORNER_PULLER_L = 0.0
эталонное изображение для отслеживания лица
LIP_CORNER_PULLER_L = 1.0
33 LIP_CORNER_PULLER_R
Эталонное изображение нейтрального лица
LIP_CORNER_PULLER_R = 0.0
эталонное изображение для отслеживания лица
LIP_CORNER_PULLER_R = 1.0
34 LIP_FUNNELER_LB
Эталонное изображение нейтрального лица
LIP_FUNNELER_LB = 0.0
эталонное изображение для отслеживания лица
LIP_FUNNELER_LB = 1.0
35 LIP_FUNNELER_LT
Эталонное изображение нейтрального лица
LIP_FUNNELER_LT = 0.0
эталонное изображение для отслеживания лица
LIP_FUNNELER_LT = 1.0
36 LIP_FUNNELER_RB
Эталонное изображение нейтрального лица
LIP_FUNNELER_RB = 0.0
эталонное изображение для отслеживания лица
LIP_FUNNELER_RB = 1.0
37 LIP_FUNNELER_RT
Эталонное изображение нейтрального лица
LIP_FUNNELER_RT = 0.0
эталонное изображение для отслеживания лица
LIP_FUNNELER_RT = 1.0
38 LIP_PRESSOR_L
Эталонное изображение нейтрального лица
LIP_PRESSOR_L = 0.0
эталонное изображение для отслеживания лица
LIP_PRESSOR_L = 1.0
39 LIP_PRESSOR_R
Эталонное изображение нейтрального лица
LIP_PRESSOR_R = 0.0
эталонное изображение для отслеживания лица
LIP_PRESSOR_R = 1.0
40 LIP_PUCKER_L
Эталонное изображение нейтрального лица
LIP_PUCKER_L = 0.0
эталонное изображение для отслеживания лица
LIP_PUCKER_L = 1.0
41 LIP_PUCKER_R
Эталонное изображение нейтрального лица
LIP_PUCKER_R = 0.0
эталонное изображение для отслеживания лица
LIP_PUCKER_R = 1.0
42 LIP_STRETCHER_L
Эталонное изображение нейтрального лица
LIP_STRETCHER_L = 0.0
эталонное изображение для отслеживания лица
LIP_STRETCHER_L = 1.0
43 LIP_STRETCHER_R
Эталонное изображение нейтрального лица
LIP_STRETCHER_R = 0.0
эталонное изображение для отслеживания лица
LIP_STRETCHER_R = 1.0
44 LIP_SUCK_LB
Эталонное изображение нейтрального лица
LIP_SUCK_LB = 0.0
эталонное изображение для отслеживания лица
LIP_SUCK_LB = 1.0
45 LIP_SUCK_LT
Эталонное изображение нейтрального лица
LIP_SUCK_LT = 0.0
эталонное изображение для отслеживания лица
LIP_SUCK_LT = 1.0
46 LIP_SUCK_RB
Эталонное изображение нейтрального лица
LIP_SUCK_RB = 0.0
эталонное изображение для отслеживания лица
LIP_SUCK_RB = 1.0
47 LIP_SUCK_RT
Эталонное изображение нейтрального лица
LIP_SUCK_RT = 0.0
эталонное изображение для отслеживания лица
LIP_SUCK_RT = 1.0
48 LIP_TIGHTENER_L
Эталонное изображение нейтрального лица
LIP_TIGHTENER_L = 0.0
эталонное изображение для отслеживания лица
LIP_TIGHTENER_L = 1.0
49 LIP_TIGHTENER_R
Эталонное изображение нейтрального лица
LIP_TIGHTENER_R = 0.0
эталонное изображение для отслеживания лица
LIP_TIGHTENER_R = 1.0
50 LIPS_TOWARD
Эталонное изображение нейтрального лица
LIPS_TOWARD = 0.0
эталонное изображение для отслеживания лица
JAW_DROP = 1.0 и LIPS_TOWARD = 1.0
51 НИЖНЯЯ_ГУБА_ДЕПРЕССОР_Л
Эталонное изображение нейтрального лица
НИЖНЯЯ_ГУБА_ДЕПРЕССОР_Л = 0,0
эталонное изображение для отслеживания лица
НИЖНЯЯ_ГУБА_ДЕПРЕССОР_Л = 1.0
52 НИЖНЯЯ_ГУБА_ДЕПРЕССОР_Р
Эталонное изображение нейтрального лица
НИЖНЯЯ_ГУБА_ДЕПРЕССОР_Р = 0,0
эталонное изображение для отслеживания лица
НИЖНЯЯ_ГУБА_ДЕПРЕССОР_Р = 1.0
53 MOUTH_LEFT
Эталонное изображение нейтрального лица
MOUTH_LEFT = 0.0
эталонное изображение для отслеживания лица
MOUTH_LEFT = 1.0
54 MOUTH_RIGHT
Эталонное изображение нейтрального лица
MOUTH_RIGHT = 0.0
эталонное изображение для отслеживания лица
MOUTH_RIGHT = 1.0
55 NOSE_WRINKLER_L
Эталонное изображение нейтрального лица
NOSE_WRINKLER_L = 0.0
эталонное изображение для отслеживания лица
NOSE_WRINKLER_L = 1.0
56 NOSE_WRINKLER_R
Эталонное изображение нейтрального лица
NOSE_WRINKLER_R = 0.0
эталонное изображение для отслеживания лица
NOSE_WRINKLER_R = 1.0
57 OUTER_BROW_RAISER_L
Эталонное изображение нейтрального лица
OUTER_BROW_RAISER_L = 0.0
эталонное изображение для отслеживания лица
OUTER_BROW_RAISER_L = 1.0
58 OUTER_BROW_RAISER_R
Эталонное изображение нейтрального лица
OUTER_BROW_RAISER_R = 0.0
эталонное изображение для отслеживания лица
OUTER_BROW_RAISER_R = 1.0
59 UPPER_LID_RAISER_L
Эталонное изображение нейтрального лица
UPPER_LID_RAISER_L = 0.0
эталонное изображение для отслеживания лица
UPPER_LID_RAISER_L = 1.0
60 UPPER_LID_RAISER_R
Эталонное изображение нейтрального лица
UPPER_LID_RAISER_R = 0.0
эталонное изображение для отслеживания лица
UPPER_LID_RAISER_R = 1.0
61 UPPER_LIP_RAISER_L
Эталонное изображение нейтрального лица
UPPER_LIP_RAISER_L = 0.0
эталонное изображение для отслеживания лица
UPPER_LIP_RAISER_L = 1.0
62 UPPER_LIP_RAISER_R
Эталонное изображение нейтрального лица
UPPER_LIP_RAISER_R = 0.0
эталонное изображение для отслеживания лица
UPPER_LIP_RAISER_R = 1.0
63 ВЫСУНУТЬ ЯЗЫК
Эталонное изображение нейтрального лица
ВЫХОД_ЯЗЫКА = 0.0
эталонное изображение для отслеживания лица
ВЫСЫПЬ_ЯЗЫКА = 1.0
64 ЯЗЫК_ЛЕВЫЙ
Эталонное изображение нейтрального лица
ЯЗЫК_ЛЕВЫЙ = 0.0
эталонное изображение для отслеживания лица
ЯЗЫК_ЛЕВЫЙ = 1.0
65 TONGUE_RIGHT
Эталонное изображение нейтрального лица
ПРАВЫЙ_ЯЗЫК = 0.0
эталонное изображение для отслеживания лица
ПРАВЫЙ_ЯЗЫК = 1.0
66 ЯЗЫК_ВВЕРХ
Эталонное изображение нейтрального лица
ЯЗЫК_ВВЕРХ = 0.0
эталонное изображение для отслеживания лица
ЯЗЫК_ВВЕРХ = 1.0
67 ЯЗЫК_ВНИЗ
Эталонное изображение нейтрального лица
ЯЗЫК_ВНИЗ = 0.0
эталонное изображение для отслеживания лица
ЯЗЫК_ВНИЗ = 1.0

Пример кода для отслеживания лица

В следующем примере кода показано, как получить все веса для форм смешивания выражений лица.

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));

Новые типы объектов

Новые константы перечисления

  • XR_FACE_PARAMETER_COUNT_ANDROID

Перечисление XrObjectType расширено:

  • XR_OBJECT_TYPE_FACE_TRACKER_ANDROID

Перечисление XrStructureType расширено:

  • 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

Новые перечисления

Новые структуры

Новые функции

Проблемы

История версий

  • Редакция 1, 5 сентября 2024 г. (Левана Чен)
    • Первоначальное описание расширения
  • Редакция 2, 01.04.2025 (Кенни Веркемер)
    • Добавлены области уверенности в лице
  • Редакция 3, 04 июня 2025 г. (Левана Чен)
    • Добавлен новый код ошибки.

OpenXR™ и логотип OpenXR являются товарными знаками компании Khronos Group Inc. и зарегистрированы в качестве товарных знаков в Китае, Европейском Союзе, Японии и Великобритании.