Face Tracking API позволяет разработчикам использовать абстрагированные данные о выражениях лиц для улучшения социального присутствия. Например, отслеживание лица может помочь сделать более естественной мимику персонажа при виртуальном взаимодействии с другими пользователями. В общих чертах создание персонажа с отслеживанием лица состоит из создания персонажа, который будет показан с блендшейпами, представляющими мимику, и добавления к нему скриптов, содержащих блендшейпы для чтения API и сопоставления обнаруженных выражений с блендшейпами персонажа.
Face Tracking API поддерживает выражения на основе системы кодирования движений лица (FACS) или Oculus Viseme. Выражения FACS представляют 70 различных мышц, которые используются для анимации лица. Виземы представляют форму рта при произношении фонем (звуков) и представлены 15 блендшейпами. Face Tracking API и традиционная библиотека Lipsync, описанные в этом разделе, используют одни и те же 15 визем Oculus.
В Quest Pro движения лица, обнаруженные датчиками гарнитуры, активируют выражения блендшейпов FACS, такие как опускание челюсти и сморщивание носа. В других гарнитурах Quest аудиопоток анализируется и преобразуется либо в выражения FACS, либо в виземы Oculus с использованием модели машинного обучения, обученной на примерах речи с использованием функции, которая называется мимикой на основе аудио.
В рамках реализации отслеживания лица в Unity эти выражения сопоставляются с блендшейпами FACS, которые художник создал для представления мимики персонажа. В очень реалистичных случаях и в приведенных примерах каждое из выражений, обнаруженных датчиками, представлено одним из таких блендшейпов. Однако важно понимать, что человек, носящий гарнитуру, обычно демонстрирует несколько таких выражений одновременно. Например, при улыбке не только приподнимаются уголки губ, но также движутся щеки, и глаза. API возвращает вес, соответствующий силе выражения (например, едва приподнятая или высоко поднятая бровь). Список демонстрируемых выражений и их весов затем используется для активации блендшейпов. Поскольку эти сетки блендшейпов могут деформироваться в соответствии с силой (или весом) выражения, комбинация различных сеток создает желаемый эффект. Абсолютного требования к соответствию количества блендшейпов FACS количеству выражений нет. Например, вы можете создать простой аватар с двумя блендшейпами (нейтральное выражение лица и улыбка). Затем вы можете использовать лишь несколько выражений (например, поднятие уголка губ) для обнаружения улыбки и активации ее блендшейпа.
Face Tracking API предоставляет FACS блендшейпы, которые представляют большую часть лица, в том числе нос, рот, челюсть, брови и области около глаз. Это позволяет создать выражения лица, которые формируют улыбку, хмурый взгляд, удивление и другие. Благодаря этому разработчики предоставляют пользователям широкий выбор: от высококачественных 3D-персонажей для реалистичного опыта взаимодействия в VR до чрезвычайно стилизованных персонажей для фэнтезийных и научно-фантастических сред.
Для очень реалистичных персонажей особенно важно использовать точную фотограмметрию, которая позволит сгенерировать объекты лица и обеспечить каждое из 70 выражений FACS или визем, определяемых Face Tracking API. Их можно объединить в сетку со скином.
Правила и отказ от ответственности
Когда пользователь включает функцию естественной мимики, приложение получает доступ к абстрагированным данным о мимике в режиме реального времени, которые в соответствии с Политикой использования данных для разработчиков являются данными пользователей. Эти данные разрешается использовать только в целях, указанных в Правилах использования данных разработчиками. Вам явным образом запрещается использовать эти данные запрещенными способами, описанными в этих правилах. Функция "Естественная мимика" работает на основе нашего Face Tracking API.
В частности, вы должны опубликовать и соблюдать общедоступную и легкодоступную политику конфиденциальности, в которой четко регламентируется сбор, использование, хранение и обработка данных с помощью Face Tracking API. Вы обязаны обеспечить предоставление пользователям четкой и полной информации о доступе к абстрагированным данным мимики и их использовании до начала сбора, в том числе в соответствии с требованиями действующего законодательства о конфиденциальности и защите данных, и пользователь должен дать согласие на это.
Обратите внимание: мы оставляем за собой право контролировать использование вами Face Tracking API для обеспечения соблюдения наших правил.
Известные проблемы
Ниже перечислены известные проблемы:
Значения достоверности для мимики в Face Tracking API не заполняются.
Мимика на основе аудио — зевание может не привести к тому, что персонаж откроет рот, поскольку модели обучаются в основном на вербальном вводе.
Мимика на основе аудио — при первом запуске приложения голос может полностью подключится к анимации лица в течение 10 секунд. Эта проблема наблюдалась после перезагрузки устройства.
Подобно визуальному отслеживанию лица, модель мимики на основе аудио обучается на основе того, как пользователи двигают губами на самом деле. Для пользователей, которые ожидают более подчеркнутых движений, как в случае с виземами, можно увеличить множители в файле конфигурации ретаргетинга. См. раздел "Конфигурация JSON".
Интеграция отслеживания лица
После прохождения этого раздела разработчик научится:
Настраивать новые проекты, поддерживающие отслеживание лица.
Включать персонажей, используя блендшейпы для отслеживания лица в соответствии с Face Tracking API.
Включать персонажей, использующего блендшейпы ARKit для отслеживания лица.
Включать персонажей, используя виземы для отслеживания лица.
Примечание. Прежде чем выполнять эти действия, ознакомьтесь с предварительными требованиями в статье Начало работы с Movement SDK.
Настройка проекта, поддерживающего отслеживание лица
После настройки проекта для VR выполните следующие действия.
Убедитесь, что в вашей сцене есть prefab OVRCameraRig. Этот prefab расположен по адресу Packages/com.meta.xr.sdk.core/Prefabs/OVRCameraRig.prefab.
Выберите объект OVRCameraRig на панели Hierarchy (Дерево). Затем найдите компонент OVRManager на панели Inspector (Инспектор).
Разверните Quest Features (Функции Quest) и нажмите General (Общие).
Если вам необходимо отслеживание движений рук, выберите для параметра Hand Tracking Support (Поддержка отслеживания движений рук) значение Controllers and Hands (Контроллеры и руки).
Убедитесь, что для параметра Face Tracking Support (Поддержка отслеживания лица) установлено значение Supported.
Устраните все проблемы, выявленные инструментом настройки проектов. Чтобы перейти к нему, в меню Unity откройте Edit (Редактирование) > Project Settings (Настройки проекта) > Meta XR.
Выберите вкладку платформы Android, Meta Quest.
Если имеются какие-либо проблемы, нажмите Fix All (Устранить все). Узнать больше можно из статьи Инструмент настройки проектов.
Примечание. Если в вашем проекте используется отслеживание движений лиц, глаз или рук, убедитесь, что оно включены на гарнитуре. Обычно это выполняется в процессе настройки устройства, но вы можете проверить или изменить настройки, нажав Settings (Настройки) > Movement Tracking (Отслеживание движений).
Настройка персонажа для отслеживания лица на основе FACS
Примечание/ Некоторые упомянутые ниже скрипты ниже распространяются с примером, а не с Meta XR All-in-One SDK. Поэтому, чтобы получить доступ к этим скриптам, необходимо скачать примеры из репозитория примеров Oculus на GitHub. Они распространяются в виде пакета, поэтому вы можете добавить его в существующий проект.
Шаг 1. Персонажи с блендшейпами FACS. Если у вашего персонажа есть блендшейпы, соответствующие нашим блендшейпам Face Tracking API (см. раздел блендшейпы FACS), выполните этот шаг. В противном случае перейдите к шагу 2.
Шаг 1а. Функция-помощник находится в разделе Game Object (Игровой объект) > Movement SDK > Face Tracking (Отслеживание лица) > Add A2E Face (Добавить лицо A2E). Эта функция предоставляет базовые настройки, их нужно проверить и изменить в зависимости от целевого персонажа, чтобы гарантировать предсказуемую совместную работу блендшейпов.
Шаг 2. Персонажи с блендшейпами ARKit. Нажмите правой кнопкой мыши на сетке лица персонажа со скином и блендшейпами, а затем используйте функцию-помощник ARKit в разделе Game Object (Игровой объект) > Movement SDK > Face Tracking (Отслеживание лица) > Add A2E ARKit Face (Добавить лицо A2E), которая устанавливает наши стандартные сопоставления для ARKit.
Шаг 3. Убедитесь, что у персонажа есть компоненты FaceDriver и FaceRetargeterComponent, а компонент FaceRetargeterComponent ссылается на OVRWeightsProvider. FaceDriver должен ссылаться на сетки, которые анимируются в ответ на отслеживание лица.
Шаг 5. Тестирование персонажа. На этом этапе персонаж должен быть готов к тестированию. Для тестирования наденьте гарнитуру с используемым персонажем. Поле "Конфигурация ретаргетера" компонента FaceRetargeterComponent ссылается на файл JSON, который можно изменять, чтобы повлиять на анимацию персонажа.
Примечание. Если вы заметили неправильное освещение персонажа во время анимации, например необычные складки около век, используйте компонент RecalculateNormals.
Чтобы настроить компонент RecalculateNormals:
Назначьте рендерер сетки скинов лица персонажа в поле Skinned Mesh Renderer (Рендерер сетки со скином).
Для нормальной работы пересчета в рендерере сетки со скином необходимо использовать совместимый материал на основе Movement/PBR (Specular) или Movement/PBR (Metallic).
Задайте в массиве Recalculate Material Indices (Пересчитать индексы материалов) индексы материалов, для которых необходимо пересчитать нормали. Укажите индекс подсетки, на которой должен выполняться пересчет, используя массив "Подсетка".
Задайте в поле Duplicate Layer (Дублирующий слой) слой, на котором находится персонаж.
Задайте в поле Hidden Mesh Layer Name (Название слоя скрытой сетки) имя слоя, который не показывается камерой.
Если ни одного слоя нет, перейдите в меню Edit (Редактировать) > Project Settings (Настройки проекта) > Tags and Layers (Метки и слои), раскройте раздел Layers (Слои) и создайте новый слой в пустом слоте (например, введите имя, например HiddenMesh, в одном из полей User Layer (Слой пользователя)). Укажите это новое имя слоя в поле Hidden Mesh Layer Name (Имя слоя скрытой сетки). Скрипт RecalculateNormals изменит маску отсечения для всех камер в сцене, чтобы исключить рендеринг этого слоя.
Включите поле Recalculate Independently (Пересчитать независимо).
Скрипты и компоненты
В этом разделе представлено краткое описание компонента OVR Face Expressions, определяющего блендшейпы для отслеживания лица.
OVR Face Expressions
Компонент OVRFaceExpressions запрашивает и обновляет данные мимики на каждом кадре. Скрипт компонента OVRFaceExpressions определяет индексатор для доступа к данным мимики. Поле ValidExpressions показывает, действительны ли эти данные. Этот компонент работает только в тех приложениях, для которых пользователи предоставили разрешение на отслеживание лица.
FaceRetargeterComponent
Реализует WeightsProvider ретаргетинга для сопоставления исходных весовых коэффициентов отслеживания с набором целевых весовых коэффициентов на основе файла конфигурации JSON. Каждый элемент в этом файле определяет набор входных драйверов и то, какой комбинации выходных весов должна соответствовать эта конкретная комбинация. Затем класс FaceRetargeterComponent создает реализующую их функцию сопоставления. Эти веса предназначаются для экземпляра FaceDriver.
FaceDriver
Реализует концепцию рига на основании системы имен и управляет деформацией. Используя список блендшейпов, извлеченных из списка сеток со скинами, он создает экземпляр RigLogic, который интерпретирует каждое имя в прямых сигналах драйвера, промежуточных и корректирующих, а также собирает их функции активации. Сигналы от связанного WeightsProvider затем задают деформацию.
WeightsProvider
Абстрактный класс, предоставляющий потребителям значения весов. Примеры: FaceRetargeterComponent и OVRWeightsProvider.
Конфигурация JSON
FaceRetargeterComponent каждого персонажа ссылается на поле Retargeter Config2, которое позволяет настроить характеристики персонажа путем изменения драйверов (FaceExpression), которые управляют целями (целевыми блендшейпами FACS) с помощью весов. Например, при настройке персонажа с использованием Game Object (Игровой объект) > Movement SDK > Face Tracking (Отслеживание лица) > Add A2E ARKit Face (Добавить лицо A2E) добавляется конфигурация по умолчанию arkit_retarget_a2e_v10.json. Все записи в этой конфигурации имеют имя FaceExpression, за которым следует список имен управляемых им блендшейпов ARKit. Если вы хотите, чтобы соответствующий блендшейп ARKit реагировал по-другому, можно увеличить его вес. При желании можно изменять модифицированные блендшейпы FACS, удаляя и добавляя записи. Этот рабочий процесс не применяется к блендшейпам на основе визем.
Настройка персонажа для отслеживания лица на основе визем
В этом разделе описана настройка персонажа с помощью блендшейпов, совместимых с виземами.
Чтобы использовать виземы, выполните перечисленные выше действия и включите следующие параметры:
Выберите OVRCameraRig на панели Hierarchy (Дерево). Найдите элемент OVR Manager (Script) (OVR Менеджер (Скрипт)) на панели Inspector (Инспектор).
Разверните раздел Quest Features (Функции Quest). Затем нажмите Experimental (Экспериментальные) и установите флажок Experimental Features Enabled (Экспериментальные функции включены).
Разверните Tracking (Отслеживание) > Face Tracking (Отслеживание лица). Затем установите флажки Visual (Визуальные), Audio (Звуковые) и Enable visemes (Включить виземы).
Разверните Permission Requests On Startup (Запросы разрешений при запуске). Затем установите флажок Record Audio for audio base Face Tracking (Запись звука для базового отслеживания лица).
OVRFaceExpressions содержит сведения о нескольких свойствах и функциях для доступа к виземам. Вы можете использовать параметр AreVisemesValid компонента для запроса действительности виземы и GetViseme для получения веса конкретной виземы FaceViseme. Параметр TryGetFaceViseme аналогичен GetViseme, но возвращает false, если предоставленная визема FaceViseme недействительна.
Чтобы ускорить интеграцию виземы, используйте компонент VisemeDriver из пакета Oculus Samples на GitHub. Для этого выполните следующие действия:
Шаг 1. Добавьте VisemeDriver в качестве компонента к каждому рендереру сетки со скинами, который имеет совместимые с виземами блендшейпы.
Шаг 2. Нажмите на кнопку Auto Generate Mapping (Генерировать сопоставления автоматически), чтобы связать блендшейпы рендерера сетки со скинами с виземами.
Шаг 2а. Для удаления этих связей можно использовать кнопку Clear Mapping (Очистить сопоставление).
Шаг 3. Проверьте сопоставления, сгенерированные в компоненте VisemeDriver. При необходимости внесите изменения.
Если вы заметили необычные складки около век, воспользуйтесь описанным выше компонентом RecalculateNormals.
Часто задаваемые вопросы
Какие модели гарнитур поддерживают функцию отслеживания лица?
Функция "Естественная мимика", которая оценивает движения лица с помощью камер, направленных внутрь, доступна только в гарнитурах Meta Quest Pro. Однако мимика на основе аудио работает на устройствах Meta Quest 2, Meta Quest 3 и Meta Quest 3S с тем же API.
Как адаптировать существующие блендшейпы к блендшейпам FACS, предоставляемым Face Tracking API?
Если названия существующих блендшейпов не соответствуют ожидаемым в OVRFace, их нужно будет назначить вручную. Можно также создать собственное сопоставление через наследование OVRCustomFace. Визуальный справочник по блендшейпам см. в теме Движение: блендшейпы лица.
Поддерживаются ли блендшейпы языка?
Да, среди блендшейпов FACS поддерживается семь блендшейпов языка, в том числе высунутый.
Блендшейпы FACS
Блендшейпы
BROW_LOWERER_L и BROW_LOWERER_R хмурят и опускают область бровей и нижнюю центральную часть лба.
CHEEK_PUFF_L и CHEEK_PUFF_R наполняют щеки воздухом, заставляя их округляться и выступать.
CHEEK_RAISER_L и CHEEK_RAISER_R стягивают внешние кольца глазных орбит и сжимают внешние уголки глаз.
CHEEK_SUCK_L и CHEEK_SUCK_R втягивают щеки внутрь и прижимают их к зубам, создавая эффект впадинок на щеках.
CHIN_RAISER_B и CHIN_RAISER_T подтягивают кожу подбородка и нижнюю губу вверх. Когда губы соприкасаются, сила, направленная вверх от нижней губы, толкает и верхнюю губу.
DIMPLER_L и DIMPLER_R прижимают уголки губ к зубам, слегка оттягивая их назад и часто поднимая вверх.
EYES_CLOSED_L и EYES_CLOSED_R опускают верхнее веко, чтобы прикрыть глаз.
EYES_LOOK_DOWN_L и EYES_LOOK_DOWN_R двигают веко в соответствии со взглядом, направленным вниз.
LOOK_LEFT_L и LOOK_LEFT_R двигают веко в соответствии со взглядом влево.
LOOK_RIGHT_L и LOOK_RIGHT_R двигают веко в соответствии со взглядом вправо.
LOOK_UP_L и LOOK_UP_R двигают веко в соответствии со взглядом, направленным вверх.
INNER_BROW_RAISER_L и INNER_BROW_RAISER_R подтягивают центральную зону бровей и лба.
JAW_DROP двигает нижнюю челюсть вниз и к шее.
JAW_SIDEWAYS_LEFT двигает нижнюю челюсть влево.
JAW_SIDEWAYS_RIGHT двигает нижнюю челюсть вправо.
JAW_THRUST выдвигает нижнюю челюсть вперед.
LID_TIGHTENER_L и LID_TIGHTENER_R сужают кольца вокруг век и сдвигают кожу нижнего века к внутренним уголкам глаз.
LIP_CORNER_DEPRESSOR_L и LIP_CORNER_DEPRESSOR_R опускают уголки губ.
LIP_CORNER_PULLER_L и LIP_CORNER_PULLER_R вытягивают уголки губ вверх, назад и в стороны.
LIP_FUNNELER_LB, LIP_FUNNELER_LT, LIP_FUNNELER_RB и LIP_FUNNELER_RT вытягивают губы вперед, часто округляя рот и раскрывая губы.
LIP_PRESSOR_L и LIP_PRESSOR_R прижимают верхнюю и нижнюю губы друг к другу.
LIP_PUCKER_L и LIP_PUCKER_R сдвигают уголки губ к центру, в результате чего губы выпячиваются.
LIP_STRETCHER_L и LIP_STRETCHER_R вытягивают уголки губ в стороны, растягивая губы и расширяя линию челюсти.
LIP_SUCK_LB, LIP_SUCK_LT, LIP_SUCK_RB и LIP_SUCK_RT втягивают губы в рот.
LIP_TIGHTENER_L и LIP_TIGHTENER_R сужают или сжимают каждую губу в горизонтальной плоскости.
LIPS_TOWARD обеспечивает контакт между верхней и нижней губами, чтобы удерживать рот закрытым независимо от положения челюстей.
LOWER_LIP_DEPRESSOR_L и LOWER_LIP_DEPRESSOR_R оттягивают нижнюю губу вниз и немного в сторону.
MOUTH_LEFT оттягивает левый уголок губы влево и подтягивает правую сторону рта к левому уголку губы.
MOUTH_RIGHT оттягивает правый уголок губы вправо и подтягивает левую сторону рта к правому уголку губы.
NOSE_WRINKLER_L и NOSE_WRINKLER_R приподнимают боковые стороны носа, ноздри и центральную область верхней губы. Часто сочетаются с мышцами, опускающими брови, чтобы опустить медиальные кончики бровей.
OUTER_BROW_RAISER_L и OUTER_BROW_RAISER_R подтягивают боковые области бровей и лба.
UPPER_LID_RAISER_L и UPPER_LID_RAISER_R оттягивают верхнее веко вверх и назад, чтобы расширить глаза.
UPPER_LIP_RAISER_L и UPPER_LIP_RAISER_R приподнимают верхнюю губу (более латерально, чем носогубная складка).
TONGUE_TIP_INTERDENTAL поднимает кончик языка, чтобы он касался верхних зубов, как при использовании виземы TH. Язык виден и слегка высовывается за линию зубов.
TONGUE_TIP_ALVEOLAR поднимает кончик языка, чтобы он касался верхних зубов сзади, как при использовании виземы NN.
TONGUE_FRONT_DORSAL_PALATE прижимает переднюю часть языка к нёбу, как при использовании виземы CH.
TONGUE_MID_DORSAL_PALATE прижимает середину языка к нёбу, как при использовании виземы DD.
TONGUE_BACK_DORSAL_VELAR прижимает спинку языка к нёбу, как при использовании виземы KK.
TONGUE_OUT высовывает язык.
TONGUE_RETREAT втягивает и опускает язык, как при использовании виземы AA.