Разработка

Отслеживание лица в Movement SDK для OpenXR

В этой статье представлены:
  • обзор естественной мимики лица;
  • правила;
  • руководство по использованию расширения Face Tracking OpenXR.

Что такое отслеживание движений лица?

Отслеживание лица для Meta Quest Pro использует обращенные внутрь камеры для обнаружения выразительных движений лица. В устройствах без направленных внутрь камер, например в Meta Quest 2 и Meta Quest 3, функция отслеживания лица использует звук с микрофона. Эти движения классифицируются по выражениям на основании системы кодирования действий лица (FACS). В этом справочнике движения лица разбиты на выражения, которые соответствуют обычным движениям лицевых мышц, таким как поднятие брови, сморщивание носа и т. д. Некоторые общие движения лица могут быть представлены комбинацией нескольких из этих движений. Например, улыбка может быть сочетанием движения правого и левого уголков рта, подъема щек или даже легкого прикрытия глаз. По этой причине часто используется одновременное сочетание нескольких движений. Чтобы добиться этого в VR или AR, обычно используются блендшейпы (или морф-таргеты в некоторых инструментах), которые представляют собой выражения с указанием силы, обозначающей интенсивность этого действия на лице. Этот API передает все выражения лица в виде определенных блендшейпов с указанием силы, которая обозначается степень его активации. Эти блендшейпы могут быть интерпретированы напрямую, чтобы понять, открыты ли у человека глаза, моргает ли он или улыбается. Вы также можете комбинировать блендшейпы между собой и перенацеливать их на персонажа для создания естественной мимики.

Правила и отказ от ответственности

При использовании Face Tracking API необходимо соблюдать лицензионное соглашение Oculus SDK, Политику использования данных для разработчиков, а также все применимые правила, положения и условия Oculus и Meta. На использование вами Movement могут распространяться действующие законы о конфиденциальности и защите данных.
В частности, вы должны опубликовать и соблюдать общедоступную и легкодоступную политику конфиденциальности, в которой четко регламентируется сбор, использование, хранение и обработка данных с помощью Face Tracking API. Вы обязаны обеспечить предоставление пользователям четкой и полной информации о доступе к абстрагированным данным мимики и их использовании до начала сбора, в том числе в соответствии с требованиями действующего законодательства о конфиденциальности и защите данных, и пользователь должен дать согласие на это.
Обратите внимание: мы оставляем за собой право контролировать использование вами Face Tracking API для обеспечения соблюдения наших правил.
Когда пользователь включает функцию естественной мимики, приложение получает доступ к абстрагированным данным о мимике в режиме реального времени, которые в соответствии с Правилами использования данных разработчиками являются данными пользователей. Эти данные разрешается использовать только в целях, указанных в Правилах использования данных разработчиками. Вам явным образом запрещается использовать эти данные запрещенными способами, описанными в этих правилах. Функция "Естественная мимика" работает на основе нашего Face Tracking API.

Образец приложения XrFace

Создание образца приложения XrFace

Скачайте Oculus Mobile OpenXR SDK (версии 47 или более поздней), а затем создайте пример приложения XrFace с помощью:
adb uninstall com.oculus.sdk.xrface
cd XrSamples/XrFace/Projects/Android
../../../../gradlew installDebug

Использование образца приложения XrFace

Как пользователь, открыв образец приложения, вы увидите заблокированную таблицу с 70 весами блендшейпов, двумя уровнями достоверности лица и флагами достоверности, соответствующими всем блендшейпам и блендшейпам взгляда соответственно. Источник данных представляет собой данные датчика, по которым оценивается отслеживание лица. Visual означает, что движения лица оцениваются на основе данных с камер, направленных внутрь, и дополнительных данных с микрофона. Audio означает, что движения лица оцениваются только на основе данных с микрофона.
Using the XrFace Sample App
Вы можете двигать области лица, такие как рот, щеки, глаза и т.д., и заметить, как срабатывают/изменяются веса соответствующих блендшейпов. Вы также можете наблюдать, как изменяется достоверность областей отслеживания движения мимики.

Расширение отслеживания лица

XR_FB_face_tracking2 представляет расширение для предоставления выходных данных лица. Оно отбирает изображения с пользовательских датчиков и выдает веса блендшейпа, соответствующие действию в различных областях лица. Мы настоятельно рекомендуем выбирать XR_FB_face_tracking2, а не устаревшее расширение XR_FB_face_tracking, поскольку расширение XR_FB_face_tracking не поддерживает отслеживание языка и отслеживание мимики с помощью звука. Информацию о старом расширении XR_FB_face_tracking см. на сайте Khronos OpenXR Registry.
Подробнее об API см. в статье Справочник по API.

Разрешения

Для использования отслеживания мимики приложение должно объявить следующие разрешения в манифесте Android. Вам также необходимо запросить разрешение RECORD_AUDIO, если вы хотите, чтобы движения мимики оценивались по звуку с микрофона.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ><!-- Tell the system this app can handle face tracking --><uses-feature android:name="oculus.software.face_tracking" android:required="true" /><uses-permission android:name="com.oculus.permission.FACE_TRACKING" /><!-- Tell the system this app can use audio for face tracking --><uses-permission android:name="android.permission.RECORD_AUDIO" /><!-- Tell the system this app can handle eye tracking --><uses-feature android:name="oculus.software.eye_tracking" android:required="true" /><uses-permission android:name="com.oculus.permission.EYE_TRACKING" />

  ....
</manifest>
Важно. Разрешения на отслеживание глаз и лица разделены, поэтому пользователь может получить разрешение на отслеживание мимики, но получить запрет на отслеживание движения глаз. Отказ в разрешении отслеживать движений глаз не позволяет отслеживать блендшейпы взгляда.
Разрешения com.oculus.permission.EYE_TRACKING, com.oculus.permission.FACE_TRACKING и android.permission.RECORD_AUDIO — это разрешения среды выполнения, поэтому приложение должно явно запросить у пользователя предоставление разрешения. Подробнее о разрешениях см. в разделе Разрешения среды выполнения. В следующем примере показано, как это можно сделать.
  private static final String PERMISSION_FACE_TRACKING = "com.oculus.permission.FACE_TRACKING";
  private static final String PERMISSION_EYE_TRACKING = "com.oculus.permission.EYE_TRACKING";
  private static final String PERMISSION_RECORD_AUDIO = "android.permission.RECORD_AUDIO";
  private static final int REQUEST_CODE_PERMISSION_FACE_AND_EYE_TRACKING = 1;

   @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestFaceAndEyeTrackingPermissionIfNeeded();
  }

  private void requestFaceAndEyeTrackingPermissionIfNeeded() {
    List<String> permissionsToRequest = new ArrayList<>();
    if (checkSelfPermission(PERMISSION_EYE_TRACKING) != PackageManager.PERMISSION_GRANTED) {
      permissionsToRequest.add(PERMISSION_EYE_TRACKING);
    }
    if (checkSelfPermission(PERMISSION_FACE_TRACKING) != PackageManager.PERMISSION_GRANTED) {
      permissionsToRequest.add(PERMISSION_FACE_TRACKING);
    }
    if (checkSelfPermission(PERMISSION_RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
      permissionsToRequest.add(PERMISSION_RECORD_AUDIO);
    }

    if (!permissionsToRequest.isEmpty()) {
      String[] permissionsAsArray =
          permissionsToRequest.toArray(new String[permissionsToRequest.size()]);
      requestPermissions(permissionsAsArray, REQUEST_CODE_PERMISSION_FACE_AND_EYE_TRACKING);
    }
  }

Инициализация OpenXR

Прежде чем приложение получит доступ к функциям определенного расширения OpenXR, необходимо создать сеанс OpenXR и включить требуемое расширение OpenXR. Эта часть приложения служит общей для всех расширений.
Во время инициализации вы можете создать следующий набор объектов, который будет общим для всех расширений OpenXR приложения:
XrInstance instance;
XrSystemId system;
XrSession session;
XrSpace sceneSpace;
Подробнее см. в заголовке SampleXrFramework/Src/XrApp.h.
Процесс описан в спецификации OpenXR:
Вся эта инициализация реализована в SampleXrFramework/Src/XrApp.cpp.

Включение расширения

Все расширения должны быть явно перечислены для создания XrInstance:
std::vector<const char*> extensions;

XrInstance instance = XR_NULL_HANDLE;

    XrInstanceCreateInfo instanceCreateInfo = {XR_TYPE_INSTANCE_CREATE_INFO};
    ....
    instanceCreateInfo.enabledExtensionCount = extensions.size();
    instanceCreateInfo.enabledExtensionNames = extensions.data();

    ....
    OXR(initResult = xrCreateInstance(&instanceCreateInfo, &instance));
Подробнее см. в файле SampleXrFramework/Src/XrApp.cpp.

Настройка

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

Добавление заголовков

Добавьте в исходный код следующие заголовки для отслеживания лица.
   #include <openxr/openxr.h>

Инициализация OpenXR

Перед использованием отслеживания лица необходимо инициализировать сеанс OpenXR и включить расширение. Подробнее об инициализации сеанса см. в статье Создание экземпляров и сеансов.
Необходимо инициализировать расширение OpenXR один раз и использовать его совместно со всеми вызовами OpenXR API. Если вы сделаете это успешно, у вас будут следующие данные:
    XrSession Session;
    XrSpace StageSpace;
Подробнее см. в заголовке SampleXrFramework\Src\XrApp.h.
Мы рекомендуем вам использовать константу XR_FB_FACE_TRACKING2_EXTENSION_NAME в качестве имени расширения.

Известная проблема

Поскольку будет использоваться только одно расширение, вы должны включить XR_FB_EYE_TRACKING_SOCIAL_EXTENSION_NAME вместе с XR_FB_FACE_TRACKING2_EXTENSION_NAME, иначе блендшейпы для глаз EYES_LOOK_* не будут предоставлены.

Проверка совместимости

Необходимо проверить, поддерживает ли гарнитура пользователя отслеживание лица. Для этого XrInstance необходимо получить системные свойства, вызвав функцию xrGetSystemProperties, чтобы это проверить.
Для этого используйте структуру XrSystemFaceTrackingProperties2FB, которая описывает, поддерживает ли система отслеживание движений глаз. Ниже приводится определение.
typedef struct XrSystemFaceTrackingProperties2FB {
    XrStructureType    type;
    void* XR_MAY_ALIAS next;
    XrBool32           supportsVisualFaceTracking;
    XrBool32           supportsAudioFaceTracking;
} XrSystemFaceTrackingProperties2FB;
Подробнее об этой структуре см. в разделе XrSystemFaceTrackingProperties2FB.
В следующем примере показано, как проверить поддержку отслеживания лица.
    XrSystemFaceTrackingProperties2FB faceTrackingSystemProperties{
        XR_TYPE_SYSTEM_FACE_TRACKING_PROPERTIES2_FB};
    XrSystemProperties systemProperties{
        XR_TYPE_SYSTEM_PROPERTIES, &faceTrackingSystemProperties};
    OXR(xrGetSystemProperties(GetInstance(), GetSystemId(), &systemProperties));
    if (faceTrackingSystemProperties.supportsAudioFaceTracking ||
        faceTrackingSystemProperties.supportsVisualFaceTracking) {
        // face tracking is supported!
    }
Если поле supportsAudioFaceTracking структуры XrSystemFaceTrackingProperties2FB возвращает true, поддерживается отслеживание лица с помощью звука. Если поле supportsVisualFaceTracking возвращает true, устройство поддерживает отслеживание лица с помощью камер, направленных внутрь.

Получение указателей на функции

Чтобы создать трекер движений лица, необходимо получить ссылки на все функции расширения перед его использованием. Подробнее см. в разделе xrGetInstanceProcAddr в спецификации OpenXR. Следующий пример демонстрирует, как это сделать.
    PFN_xrCreateFaceTracker2FB xrCreateFaceTrackerFB_ = nullptr;
    PFN_xrDestroyFaceTracker2FB xrDestroyFaceTrackerFB_ = nullptr;
    PFN_xrGetFaceExpressionWeights2FB xrGetFaceExpressionWeightsFB_ = nullptr;

    OXR(xrGetInstanceProcAddr(
        GetInstance(),
        "xrCreateFaceTracker2FB",
        (PFN_xrVoidFunction*)(&xrCreateFaceTrackerFB_)));
    OXR(xrGetInstanceProcAddr(
        GetInstance(),
        "xrDestroyFaceTracker2FB",
        (PFN_xrVoidFunction*)(&xrDestroyFaceTrackerFB_)));
    OXR(xrGetInstanceProcAddr(
        GetInstance(),
        "xrGetFaceExpressionWeights2FB",
        (PFN_xrVoidFunction*)(&xrGetFaceExpressionWeightsFB_)));

Использование расширения отслеживания лица

Создание трекера лица

Чтобы создать трекер лица, необходимо вызвать дескриптор XrFaceTracker2FB для трекера отслеживания лиц. Чтобы создать и получить дескриптор XrFaceTracker2FB для трекера движения лица, необходимо вызвать функцию xrCreateFaceTracker2FB, определенную как:
XrResult xrCreateFaceTracker2FB(
   XrSession session,
   const XrFaceTrackerCreateInfo2FB* createInfo,
   XrFaceTracker2FB* faceTracker);
Подробнее см. в разделе xrCreateFaceTracker2FB. Следующий пример демонстрирует, как это использовать.
    XrFaceTracker2FB faceTracker_ = XR_NULL_HANDLE;

    XrFaceTrackerCreateInfo2FB createInfo{XR_TYPE_FACE_TRACKER_CREATE_INFO2_FB};
    createInfo.faceExpressionSet = XR_FACE_EXPRESSION_SET2_DEFAULT_FB;
    createInfo.requestedDataSourceCount = 2;
    XrFaceTrackingDataSource2FB dataSources[2] = {
        XR_FACE_TRACKING_DATA_SOURCE2_VISUAL_FB,
        XR_FACE_TRACKING_DATA_SOURCE2_AUDIO_FB};
    createInfo.requestedDataSources = dataSources;

    OXR(xrCreateFaceTracker2FB_(GetSession(), &createInfo, &faceTracker_));
Подробнее о faceExpressionSet и requestedDataSources см. в разделе XrFaceTrackerCreateInfo2FB.
Разрешен только один экземпляр трекера лица в одном процессе, и многократные вызовы этой функции вернут один и тот же дескриптор. Дескриптор уникален для каждого процесса.
Важно! Для успешного вызова, ваши приложения должны запросить разрешение com.oculus.permission.FACE_TRACKING в своем манифесте, а пользователь должен предоставить это разрешение.
Данные блендшейпа для отслеживания лица будут доступны через вызов xrGetFaceExpressionWeights2FB сразу после возврата этого вызова, как показано в следующем разделе.

Получение весов мимики лица/блендшейпа

Сначала необходимо выделить память для получения весов и доверительных интервалов для 70 смешанных форм, которые отслеживаются трекером лица в заданный момент времени. Для этой цели используйте перечисления XR_FACE_EXPRESSION2_COUNT_FB и XR_FACE_CONFIDENCE2_COUNT_FB.
    float weights_[XR_FACE_EXPRESSION2_COUNT_FB] = {};
    float confidence_[XR_FACE_CONFIDENCE2_COUNT_FB] = {};
Чтобы получить веса выражений лица, необходимо вызвать функцию xrGetFaceExpressionWeights2FB. Эта функция получает веса и достоверности для 70 смешанных форм, которые отслеживаются трекером лица в заданный момент времени. Его определение следующее:
XrResult XRAPI_CALL xrGetFaceExpressionWeights2FB(
   XrFaceTracker2FB faceTracker,
   const XrFaceExpressionInfo2FB* expressionInfo,
   XrFaceExpressionWeights2FB* expressionWeights);
Подробнее см. в разделе xrGetFaceExpressionWeights2FB.
Структура XrFaceExpressionInfo2FB представляет собой параметр функции xrGetFaceExpressionWeights2FB, который описывает время, в которое запрашиваются выражения лица. Вызывающие элементы должны запрашивать время, равное прогнозируемому времени отображения кадра, для которого выполнен рендеринг. Система вернет значение с максимально близкой к запрошенной временной меткой. Всегда указывается приблизительна метка времени, чтобы вызывающий абонент мог определить, в какой степени система смогла выполнить запрос. Система применит соответствующее моделирование для предоставления выражений в это время. Определение структуры XrFaceExpressionInfo2FB представлено ниже.
typedef struct XrFaceExpressionInfo2FB {
   XrStructureType type;
   const void*     XR_MAY_ALIAS next;
   XrTime          time;
} XrFaceExpressionInfo2FB;
Подробнее см. в разделе XrFaceExpressionInfo2FB.
Структура XrFaceExpressionWeights2FB представляет собой параметр функции xrGetFaceExpressionWeights2FB, содержащий массивы, описывающие веса и достоверности блендшейпа отслеживания лица. Ниже приводится определение.
typedef struct XrFaceExpressionWeights2FB {
    XrStructureType             type;
    void* XR_MAY_ALIAS          next;
    uint32_t                    weightCount;
    float*                      weights;
    uint32_t                    confidenceCount;
    float*                      confidences;
    XrBool32                    isValid;
    XrBool32                    isEyeFollowingBlendshapesValid;
    XrFaceTrackingDataSource2FB dataSource;
    XrTime                      time;
} XrFaceExpressionWeights2FB;
Подробнее см. в разделе XrFaceExpressionWeights2FB.
В следующем примере показано, как вызвать функцию xrGetFaceExpressionWeights2FB.
    XrFaceExpressionWeights2FB expressionWeights{XR_TYPE_FACE_EXPRESSION_WEIGHTS2_FB};
    expressionWeights.next = nullptr;
    expressionWeights.weights = weights_;
    expressionWeights.confidences = confidence_;
    expressionWeights.weightCount = XR_FACE_EXPRESSION2_COUNT_FB;
    expressionWeights.confidenceCount = XR_FACE_CONFIDENCE2_COUNT_FB;

    XrFaceExpressionInfo2FB expressionInfo{XR_TYPE_FACE_EXPRESSION_INFO2_FB};
    expressionInfo.time = GetPredictedDisplayTime();

    OXR(xrGetFaceExpressionWeights2FB_(faceTracker_, &expressionInfo, &expressionWeights));
Веса будут находиться в массиве, выделенном приложением. Следующий пример демонстрирует, как ссылаться на них.
    for (uint32_t i = 0; i < XR_FACE_EXPRESSION2_COUNT_FB; ++i) {
        // weights_[i] contains one specific weight
        ....
    }

Уничтожение трекера лица

Перед завершением приложения рекомендуется освободить ресурсы с помощью функции xrDestroyFaceTracker2FB.
    OXR(xrDestroyFaceTracker2FB_(faceTracker_));

Использование расширения визем

Виземы — это визуальные представления лица и рта при произнесении определенных звуков на разговорном языке. Можно использовать расширение XR_META_face_tracking_visemes, когда вам нужны виземы в качестве временного решения, прежде чем ваша установка начнет поддерживать блендшейпы.

Проверка совместимости

Необходимо проверить, поддерживаются ли виземы гарнитурой пользователя. Для этого XrInstance необходимо получить системные свойства, вызвав функцию xrGetSystemProperties, чтобы это проверить.
Для этого используйте структуру XrSystemFaceTrackingVisemesPropertiesMETA, которая описывает, поддерживаются ли виземы системой. Ниже приводится определение.
typedef struct XrSystemFaceTrackingVisemesPropertiesMETA {
    XrStructureType    type;
    void*              next;
    XrBool32           supportsVisemes;
} XrSystemFaceTrackingVisemesPropertiesMETA;
В следующем примере показано, как проверить поддержку визем.
    XrSystemFaceTrackingVisemesPropertiesMETA faceTrackingVisemesSystemProperties{
        XR_TYPE_SYSTEM_FACE_TRACKING_VISEMES_PROPERTIES_META};
    XrSystemProperties systemProperties{XR_TYPE_SYSTEM_PROPERTIES,
        &faceTrackingVisemesSystemProperties};
    OXR(xrGetSystemProperties(instance, systemId, &systemProperties));
    if (faceTrackingVisemesSystemProperties.supportsVisemes) {
        // visemes are supported!
    }

Получение веса виземы

Чтобы получить виземы, необходимо вызвать функцию xrGetFaceExpressionWeights2FB, добавив XrFaceTrackingVisemesMETA к следующей цепочке структуры XrFaceExpressionWeights2FB. Определение структуры XrFaceTrackingVisemesMETA представлено ниже. Обязательно проверьте достоверность возвращаемых данных, проверив флаг isValid после вызова xrGetFaceExpressionWeights2FB.
typedef struct XrFaceTrackingVisemesMETA {
    XrStructureType    type;
    const void*        next;
    XrBool32           isValid;
    float              visemes[XR_FACE_TRACKING_VISEME_COUNT_META];
} XrFaceTrackingVisemesMETA;
В следующем примере показано, как вызвать функцию xrGetFaceExpressionWeights2FB, чтобы получить виземы, а не блендшейпы.
    XrFaceExpressionWeights2FB expressionWeights{XR_TYPE_FACE_EXPRESSION_WEIGHTS2_FB};
    expressionWeights.weightCount = 0;
    expressionWeights.confidenceCount = 0;

    XrFaceTrackingVisemesMETA visemeInfo{XR_TYPE_FACE_TRACKING_VISEMES_META};
    expressionWeights.next = &visemeInfo;

    XrFaceExpressionInfo2FB expressionInfo{XR_TYPE_FACE_EXPRESSION_INFO2_FB};
    expressionInfo.time = GetPredictedDisplayTime();

    OXR(xrGetFaceExpressionWeights2FB_(faceTracker_, &expressionInfo, &expressionWeights));

    if (visemeInfo.isValid) {
        for (uint32_t i = 0; i < XR_FACE_TRACKING_VISEME_COUNT_META; ++i) {
            // visemeInfo.visemes[i] contains a weight of specific visemes
        }
    }
Если вы передаете в в weightCount и confidenceCount допустимые значения weightCount, weights, confidenceCount и confidences, а не 0, то функция xrGetFaceExpressionWeights2FB вернет и блендшейпы, и виземы.

Виземы: визуальная справка

ВиземаФонемыПримерыУмереннаяВыраженнаяВращающаяся
SIL
Нейтральная
 
XR_META_Face_Tracking_Viseme_SIL
Нет
XR_META_Face_Tracking_Viseme_SIL_rot
PP
p, b, m
put, bat, mat
XR_META_Face_Tracking_Viseme_PP
XR_META_Face_Tracking_Viseme_PP_emp
XR_META_Face_Tracking_Viseme_PP_rot
FF
f, v
fat, vat
XR_META_Face_Tracking_Viseme_FF
XR_META_Face_Tracking_Viseme_FF_emp
XR_META_Face_Tracking_Viseme_FF_rot
TH
th
think, that
XR_META_Face_Tracking_Viseme_TH
XR_META_Face_Tracking_Viseme_TH_emp
XR_META_Face_Tracking_Viseme_TH_rot
DD
t, d
tip, doll
XR_META_Face_Tracking_Viseme_DD
XR_META_Face_Tracking_Viseme_DD_emp
XR_META_Face_Tracking_Viseme_DD_rot
KK
k, g
call, gas
XR_META_Face_Tracking_Viseme_KK
XR_META_Face_Tracking_Viseme_KK_emp
XR_META_Face_Tracking_Viseme_KK_rot
CH
tS, dZ, S
chair, join, she
XR_META_Face_Tracking_Viseme_CH
XR_META_Face_Tracking_Viseme_CH_emp
XR_META_Face_Tracking_Viseme_CH_rot
SS
s, z
sir, zeal
XR_META_Face_Tracking_Viseme_SS
XR_META_Face_Tracking_Viseme_SS_emp
XR_META_Face_Tracking_Viseme_SS_rot
NN
n, l
lot, not
XR_META_Face_Tracking_Viseme_NN
XR_META_Face_Tracking_Viseme_NN_emp
XR_META_Face_Tracking_Viseme_NN_rot
RR
r
red
XR_META_Face_Tracking_Viseme_RR
XR_META_Face_Tracking_Viseme_RR_emp
XR_META_Face_Tracking_Viseme_RR_rot
AA
A:
car
XR_META_Face_Tracking_Viseme_AA
XR_META_Face_Tracking_Viseme_AA_emp
XR_META_Face_Tracking_Viseme_AA_rot
E
e
bed
XR_META_Face_Tracking_Viseme_E
XR_META_Face_Tracking_Viseme_E_emp
XR_META_Face_Tracking_Viseme_E_rot
IH
ih
tip
XR_META_Face_Tracking_Viseme_IH
XR_META_Face_Tracking_Viseme_IH_emp
XR_META_Face_Tracking_Viseme_IH_rot
OH
oh
toe
XR_META_Face_Tracking_Viseme_OH
XR_META_Face_Tracking_Viseme_OH_emp
XR_META_Face_Tracking_Viseme_OH_rot
OU
ou
book
XR_META_Face_Tracking_Viseme_OU
XR_META_Face_Tracking_Viseme_OU_emp
XR_META_Face_Tracking_Viseme_OU_rot
Логотип навигации
Русский
© 2026 Meta