Захват лицевой анимации андроид

Motion Capture – своими руками

Всем привет, меня зовут Серго, живу я в городе Чебяркуля, катаюсь на байке, работаю в небольшом продакшене.

Хочу рассказать о реализации motion-capture без участия студии и прочего дорогостоящего оборудования. Данный способ получения движений занимает какоето время, но если всё грамотно один раз настроить, чтобы можно было потом быстро использовать в какихнибудь проектах, эта техника найдёт своё применение.

Рассмотрим пример лицевой анимации персонажа, что нам понадобится:

  1. Камеры, — будет очень неплохо, если у Вас под рукой 2 или более камеры, но в этом примере мы обойдёмся одной, я использовал встроенную веб-камеру в ноутбук;
  2. Зеркала, 2шт – они и заменят нам недостающие камеры;
  3. Маркеры — можно использовать кусочки липкой ленты, но они бликует на свете и плохо отлипают от кожи или, же наоборот хорошо прилипают не туда куда надо (проверено автором :), будем использовать синий фломастер (маркер), синий потому, что его будет хорошо видно на коже;
  4. Свет, — важно осветить актёра равномерно со всех сторон съёмки, будем использовать настольную лампу;
  5. Актёр — я снимал сам-себя почти без посторонней помощи (;
  6. И наконец программа, без которой нам не обойтись — PFTrack

И так начнём!

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

Вид сверху нашей студии будет выглядеть так:

Небольшое отступление, важно чтобы соблюдалось равенство: Z = A + B = X + Y, где Z — фокусное расстояние нашей одинокой камеры, а A+B и X+Y — фэйковые фокусные расстояния двух других камер соответственно. Но на самом деле равенство выполнятся не будет, Z будет всегда меньше, что приведёт к небольшой погрешности в виде немного углублённой формы лица в бедующем, но это нестрашно (: вот такая вот геометрия.

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

Мотор!

Произносим заранее подготовленную речь, ну или что-нибудь в духе «Превед, я креведко!», стоп. Смотрим чего у нас там отснялось, если всё нормально, все точки отчетливо видны и не уходят за пределы видоискателя идём дальше.

Загружаем отснятый материал в какой-нибудь композер, я использовал After Effects, режим кадр на три части, и сохраняем каждую в отдельную секвенцию предварительно отцентровав и флипнувпо горизонтали видео из зеркал, можно ещё немного поиграть с шарпеном и цветом. Для удобства назовём их center.avi, left.avi и right.avi

Переходим в PFTrack.

PFTrack — позволяет реализовывать различные задачи по трэкингу и нахождению движения камеры, мы же в данном уроке коснёмся только задач связанных с motion capture.

Создаём новый проект File — New Project, смотрим, что тут есть интересного.

Интерфейс программы интуитивно понятен, я разобрался со всем с первого раза непребегая к help

Жмём кнопку Import Footage, в появившемся окне выбираем наши центральную камеру center.avi, жмём load. Видим, что имя камеры автоматически поменялось на center, далее заходим в свойства нашей камеры — Camera — Camera Parameters или «ctrl+p» на клавиатуре.

Меняем тип камеры на Motion Capture, а также указываем, что фокусное расстояние мо время съёмки неменялось и нам неизвестно.

Жмём close. Обратим внимание, что ранее неактивная кнопка Import Footage, снова стала активной. Добавляем оставшиеся сиквенции left.avi и right.avi.

Теперь нужно синхронизировать все наши сиквенции, на самом деле нам этого делать ненужно, потому что снимали всё одной камерой, просто проверим, что все камеры стоят на начале и нажмём кнопку Sync

Читайте также:  Gradle run tests android

можно сильно упростить себе жизнь, если выставить окошки камер так, чтобы можно было всё сразу отслеживать, воспользуемся кнопками меню New Window и Tile Window Layout.

Дальше начинается самое интересное. (: Чтобы получить трёхмерные координаты наших маркеров, сначала нужно получить их двухмерные координаты на каждой камере, для этого воспользуемся трэкингом.

Смотрим на нашу центральную камеру, начнём с неё, потому-что на ней отчётливо видны все маркеры на протяжении всего видео. В PFtracke существует два типа 2d трэкеров: автоматические — Auto Features и пользовательские — User Features, мы воспользуемся вторыми, они позволяют точнее контролировать нужные нам области. И так, нажмём ctrl-F3 или выберем в меню Tracking — New User Features и выберем наш центральный маркер на лбу, раздвинем области трэкера как показано на рисунке, назовём его lob_c

Встаем в самое начало видео, вызываем контекстное меню трэкера (кликнем на нём правой кнопкой мыши) и выбираем пункт Track Forwards, наблюдаем как программа находит траекторию движения нашей метки.

В процессе трэкинга программа может выдавать ошибки, это нестрашно. Они могут быть вызваны несколькими причинами, восновном неправильно настроенной выдержкой из-за плохой освещённости, как это было с моей веб камерой. Решить эту проблему можно покрутив параметры в меню Trackig — Tracking parameters. либо использовать больше света при съёмках и более лучшую камеру, надеюсь, что у Вас таких проблем невозникнет (:

Далее нужно повторить все эти действия с каждым маркером, т.е. встаём на начало видео, заново нажимаем ctrl-F3 выбираем следующий маркер, двигаем ограничители трэкера, жмём Track Forwards. Советую называть трэкеры так чтобы было понятно чему она соответствует, например я следовал такому принципу: eye_L, eye — в переводе Глаз, _L — слева, всё это пригодится в дальнейшем.

Далее нам нужно сделать трэкинг всех этих же маркеров, но уже в другой камере. Для этого встаём в начало видео, выбираем какой-нибудь созданный нами трэкер в списке слева, и указываем его заново, но в уже в другом окне вида соответственно, также указываем его границы, и жмём Track Forwards. Проделываем эту операцию со всеми маркерами которые видны из этой камеры на всём промежутке времени, маркеры которые невидны, либо видны в начале видео, а потом невидны или наоборот- не трогаем. Потом всё тоже самое с последней камерой.

Итак мы имеем 2д координаты всех трэкеров со всех камер, теперь нам нужно преобразовать их в трёхмерные координаты, сделать это очень просто, основная работа позади (:

Чуть не забыл, для ускорения и точности дальнейшего просчёта необходимо указать неподвижные участки лица, выделяем точки носа и лба о которых было сказано выше, жмём Tracking — Constraints, в появившемся окне сначала нажимаем New потом выделяем наши точки справа, потом кнопку » 766 0 850 130

Источник

Анимации в Android по полочкам (Часть 1. Базовые анимации)

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

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

Часть 1. Базовые анимации
Часть 2. Комплексные анимации
Часть 3. «Низкоуровневые» анимации

Часть 1. Базовые анимации

1. Кадр за кадром

Предполагаю, что первая анимация в мире создавалась именно так, и в Android до сих пор доступна эта возможность.

Всё что нужно сделать это создать xml со ссылками на каждый кадр:

И запустить анимацию (Здесь и далее все примеры будут приведены на Kotlin):

Читайте также:  Как изменить заставку загрузки андроид

Сложные по графике анимации, небольших размеров и подготовленные во внешнем редакторе.

Возможность достичь любой сложности эффектов

Большое потребление ресурсов и, как следствие, довольно затратный импорт в приложение с возможностью получить OutOfMemory. Если по каким-то причинам вам нужно показывать большое количество кадров, то придётся писать свою реализацию с постепенной подгрузкой изображений в память. Но если так пришлось делать, возможно проще прибегнуть к видео?

2. Анимация свойств объекта (aka Property Animator)

Если нам нужно всего-лишь передвинуть что-нибудь на несколько пикселей в сторону или изменить прозрачность, чтобы не плодить миллион очень похожих друг на друга кадров на помощь приходит Animator. Фактически с помощью него можно анимировать любое свойство любых объектов.

Базовый абстрактный класс называется Animator, у него есть несколько наследников, нам важны:

ValueAnimator — позволяет анимировать любое свойство
ObjectAnimator — наследуется от ValueAnimator и имеет упрощённый интерфейс для анимации свойств View.
ViewPropertyAnimator — Предоставляет ещё один удобный интерфейс для анимации View. Не унаследован от Animator и используется в методе View::animate()

Анимацию выше можно описать как в коде:

так и в XML ( animator/open_animator.xml ):

Так-же есть возможность описать нашу анимацию переходов между стейтами View, что соответсвенно, с лёгкостью позволит создать анимированные переходы между стейтами у любых View. Описанная в XML анимация будет автоматически запущена при смене состояния View.
animator/state_animator.xml

Анимация View объектов и любых их параметров
Анимация любых других параметров

В некоторой степени требовательны к ресурсам

3. Анимация View (aka View animation)

До появления Animator в Android были только Animations. Основной недостаток которых был в том что они анимировали только представление вида и никак на самом деле не изменяли его свойства. Поэтому если хочется анимировать перемещение какого-либо элемента, то дополнительно по окончанию анимации нужно изменить ещё его свойства. Такой подход так или иначе не очень удобен, если вам нужна чуть более сложная анимация или нужно отлавливать нажатия в момент анимации.

Анимацию можно запустить как в коде:

так и в XML (обратите внимание, что синтаксис отличается от xml для Animator):
anim/open_animation.xml

Там, где API не позволяет использовать Animator.

Устаревший API, меняет только представление вида.

4. Анимация векторных ресурсов (aka AnimatedVectorDrawable)

На мой взгляд самая интересная часть в Android анимациях. Можно относительно малыми силами добиваться сложных и интересных эффектов. Трансформации иконок в Android сделаны именно так.

VectorDrawable состоит из Path и Group элементов. Создание анимации сводится к тому, чтобы прописать движение к этим элементам. Андроид на картинке выше, в коде будет выглядеть так:

Чтобы не писать XML вручную можно воспользоваться онлайн инструментом.

Начиная с API 25 векторные анимации отрисовываются в RenderThread, поэтому, даже если мы загрузим чем-то наш UI Thread (но мы же никогда так не делаем, да?), анимации всё равно будут проигрываться плавно.

Иконки
Анимационные эффекты

Нет возможности вручную управлять точкой анимации во времени (т.е. фактически отсутствует какой-либо метод, вроде setCurrentTime)

Источник

CGI в домашних условиях при помощи Unreal Engine и iPhone

Всем привет! Меня зовут Василий Мазалов, я работаю старшим видеомонтажером в компании Pixonic. Наш отдел занимается созданием видео-креативов для маркетинга и комьюнити: роликов для страниц в сторы, обзорных видео игровых нововведений и прочего контента.

Когда я не создаю креативы, я мониторю просторы интернета на предмет новых форматов и способов подачи материала, чтобы сделать наш собственный контент более разнообразным, интересным и привлекательным для новых игроков.

Год назад я наткнулся на следующее видео:

Что мы здесь видим? Парень нацепил на себя костюм захвата движения тела (пока ничего необычного), повесил перед собой iPhone (а вот это уже интересно) и таким образом транслирует анимацию лица и тела персонажа напрямую в режиме реального времени в Unreal Engine, и выглядит результат для столь незамысловатой реализации довольно качественно.

Классная идея, подумал я. Затем закрыл видео. И продолжил дальше работать.

Спустя полгода в открытом доступе оказался обучающий материал о том, как произвести захват анимации лица в Unreal Engine при помощи приложения на iPhone. В то же время я узнал, что в наш арт-отдел приобрели костюм для захвата движения. Посмотрел его совместимость с UE: всё подошло. Оставалось только найти iPhone для дальнейшей работы, но в наше время с этим проблем еще меньше.

Читайте также:  Apk instagram для android

Вопросов была масса. Передо мной было непаханное поле из неизученной анимации, Unreal Engine, моделирования человеческого лица и тела и других совершенно далеких от видеомонтажа вещей, но в то же время огромное желание воплотить в жизнь задуманное.

Начался долгий процесс изучения различной документации.

Что в результате получилось и как мы этого добились, читайте дальше.

Анимация лица

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

Для того, чтобы записать анимацию лица, нам нужен был только iPhone с TrueDepth front-facing camera ― то есть, от iPhone X и выше. Именно эта технология считывала топологию лица и передавала необходимые значения в Unreal уже на нашу модель.

За различные выражения лица отвечают блендшейпы ― 3D-модели идентичной топологии, то есть, с одинаковым количеством вершин, но отличающиеся формой. Face AR использует 51 блендшейп, и благодаря подробной документации Apple, в которой описано, какие конкретно блендшейпы используются в DAZ, нам удалось их сделать достаточно быстро.

Примерно так выглядит набор эмоций и блендшейпов в 3D-модели:


Блендшейпы из интернета


Наши блендшейпы

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

Анимация тела

Для создания тела необходимо было учитывать специфику софта для работы с костюмом. Мы работали с костюмом захвата движения Perception Neuron 2.0 Motion Capture System компании Noitom. Стоит таковой примерно 2500 долларов. Это самый дешевый костюм на рынке и не самый лучший представитель среди аналогов: он очень чувствителен к электромагнитным излучениям, отчего координаты датчиков могут съехать, если он будет находиться в радиусе активного излучения, и чистить анимацию окажется ещё труднее. К счастью, мы как раз переехали на другой этаж, и на новом месте было достаточно безлюдно, а значит, электромагнитные излучения сократились до минимума, ― то есть, было идеально для нас.

Почему именно костюм? Готовые анимации из различных библиотек нам не подходили, поскольку наш персонаж должен иметь уникальный характер и поведение, а лицо и тело должны точно их отражать. Если бы мы делали анимацию с нуля, это заняло бы месяц, а то и два. Использование же оборудования для захвата движения помогло сэкономить это время.

В отличие от лица, саму модель тела художники отрисовали с нуля. Затем необходимо было произвести ее риггинг и скиннинг в Maya. После сборки тела мы заводим его в Unreal, там собираем все для мокапа, записываем анимацию, после чего результат остается только замешать.

Для того, чтобы анимация передавалась точно, доработки были минимальными или вообще удалось их избежать, а также чтобы транслировать анимацию с костюма прямиком в Unreal Engine, необходимо было правильно выставить кости и убрать ненужные значения у нашей модели. У компании Noitom есть черновая 3D-модель для Unreal Engine, используя которую в качестве референса, нам было необходимо доработать нашу собственную модель: поставить ее в T-позу, расположить ладони и пальцы в нестандартные для моделирования позиции и сбросить все значения до нуля. Было очень важно, чтобы все кости были без лишних поворотов, иначе программа их умножит, тем самым сильно исказив движения.

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

После записи анимация нуждалась в доработке, поэтому мы поставили аниматору задачу ее почистить. Для чистки двух минут анимации ему понадобилось три дня.

Источник

Оцените статью