Добрый день! Меня зовут Дарья, я 3d artist в студии RainStyle production. В настоящее время мы заняты разработкой игры в жанре Sci-fi horror под названием “On Air”.
Игра рассказывает о загадочных событиях, случившихся с главным героем, который волей случая остановился в американском отеле Алгол. Это происшествие полностью поменяет его жизнь и заставит столкнуться с неизвестным.
Это наш первый игровой проект и в нем мы стараемся добиться максимальной реалистичности персонажей, передать их эмоции и характер. Поэтому для их создания было принято решение использовать технологию сканирования лиц. В рамках задач проекта нам потребуется две степени детализации персонажей: под рендер — для синематика и low poly — для использования в самой игре.
Игра On Air разрабатывается на движке Unreal Engine 4. Мы планируем написать несколько статей, в которых расскажем подробно этапы подготовки персонажа.
В данный момент мы занимаемся созданием демо версии игры, которая уже в скором времени появится в Стиме. В данной статье я расскажу о начальном этапе создания лица главного персонажа нашей игры.
На изображении ниже представлены некоторые из эмоций, которые мы получили после обработки сканов.
В основном они утрированы и не кажутся реалистичными. Это было сделано намеренно. Дело в том, что в основе данного метода создания лица лежит принцип смешивания форм «Blend shapes». То есть, каждая из этих эмоций будет применяться не в “чистом” виде, а в совокупности с другими. Об этом я подробнее расскажу в самом конце статьи. Для начала, надо разобраться, что делать с отсканированной головой и как мы можем ее использовать. Очевидно, что топология скана не позволяет применить ее в качестве модели, но при помощи запечения карты нормалей мы получим основные черты лица, морщины, поры, неровности или шрамы. Также со скана мы можем извлечь текстуру базового цвета.
В этом нам поможет программа Wrap 3.3. Она широко используется для обработки отсканированных моделей. С ее помощью мы будем проецировать нашу будущую модель головы на сканы.
Для начала необходимо создать так называемый базовый меш. То есть, нейтральное выражение лица, которое будет лежать в основе всех эмоций. Наш скан с нейтральной эмоцией выглядит так:
Программа Wrap 3.3 имеет нодовую систему, то есть все функции представлены в виде узлов (нод), которые связаны друг с другом цепочкой.
Выбор нод осуществляется при помощи клавиши Tab. При помощи нод «LoadGeom» и «LoadImage» подгружаются скан с нейтральной эмоцией и соответствующая ему текстура. Для этого в окне File Names надо указать путь. В настройках ноды «LoadGeom» вы можете выбрать различные режимы отображения геометрии (на изображении ниже отключена функция wireframe). Также здесь можно изменить цвет геометрии (не работает, если подключена текстура), координаты и масштаб.
Далее необходимо подгрузить базовый меш, который будет проецироваться на данный скан. Найти его можно на вкладке “Gallery”. Здесь представлено множество уже готовых эмоций. В данном случае я выбираю Basemesh.
Basemesh стоит приближенно сопоставить со сканом. Для этого можно использовать оси координат.
Чтобы спроецировать базовый меш на скан, я использую ноду Wrapping. При наведении курсора мыши на узлы ноды, высвечивается подсказка: первый узел, Floating geometry — предназначен для проецируемой геометрии, второй узел, Fixet geometry — для фиксированного объекта, по которому будет проецироваться геометрия (в нашем случае это скан с нейтральной эмоцией).
Чтобы запустить вычисление, необходимо отметить точки на обеих моделях, которые будут соответствовать друг другу. Для этого используется нода Select points, которая подключается в соответствующие узлы моделей. Выбрав эту ноду, следует перейти на вкладку Visual Editor. Включенная функция Sync views позволяет синхронизировать камеры для левого и правого окон.
Если проецируемая модель содержит полигоны, которые должны оставаться на месте, необходимо выделить их, воспользовавшись функцией Select Polygons. Иначе могут возникнуть артефакты, связанные со внутренними деталями меша.
Для применения ноды Select Polygons используется вкладка Visual Editor. Здесь можно выделить те полигоны, которые Модели из галереи разбиты на полигруппы, это упрощает задачу: их можно выделить или снять выделение на верхней панели.
Я выделяю внутренние детали горла, ноздри, крайние лупы век и нижнюю часть шеи.
После этого модель будет проецироваться корректно.
Также, для большей детализации, можно использовать ноду Subdivide. Она подключается к базовому мешу и все ноды, которые находятся ниже, подсоединяются к ее нижнему узлу (Output).
Далее, надо запечь текстуру со скана на базовый меш. Для этого применяется нода Transfer Texture. Узел Source geometry подключается к модели, с которой будет запекаться текстура. В нашем случае это скан. Узел Target geometry подключается к базовому мешу, но уже не к ноде LoadGeom, а к ноде Wrapping, так как мы будем использовать уже измененную, спроецированную геометрию.
В настройках этой ноды можно выбрать качество запеченной текстуры. После этого стоит добавить ноду Extrapolate Image, чтобы заполнить прозрачные места, и сохранить полученную текстуру с помощью ноды Save Image и нажатием кнопки Compute current frame. Геометрия сохраняется аналогично, с помощью ноды Save Geom.
После того, как мы получили нейтральную эмоцию и текстуру для нее, можно перейти к получению геометрии для других эмоций. Для этого подгружаем модель скана и Basemesh с текстурами.
Далее нужно выровнять Basemesh по скану. Для начала можно сопоставить модели приближенно, воспользовавшись координатными осями.
Нода, которая позволяет более точно выравнивать модели относительно друг друга — Rigid Alignment. В узел Floating geometry подсоединяется геометрия, которую необходимо выровнять. В узле Fixed geometry, соответственно, будет статичная геометрия (в нашем случае это скан).
При использовании ноды Rigid Alignment необходимо использовать ноду Select Points:
На моей модели есть контрольные маркеры, которые упрощают задачу при выборе точек. Для выравнивания моделей относительно друг друга точки необходимо ставить на тех частях лица, которые незначительно меняются при изображении той или иной эмоции. В случае с данной эмоцией это лоб, верхняя часть носа, шея и тп. Также, точки желательно расставлять по всем сторонам модели (то есть, например не только на лице, но и на затылке и ушах).
В результате мы получаем выровненные относительно друг друга модели:
В настройках ноды Rigid Alignment есть функция “Match skale”. Она используется, если модели необходимо выровнять также по масштабу.
После этого можно заняться проекцией базового меша на скан. Для этого мы будем использовать ноду Optical Flow Wrapping (оптический поток). Она позволяет выравнивать геометрию по текстуре скана. При этом полученная в итоге текстура эмоции будет полностью совпадать с текстурой базового меша за исключением складок, морщин и других изменений. Все неровности кожи и поры при использовании этого метода остаются на своих местах.
Перед использованием оптического потока, как и в первом случае, используется нода Select Polygons:
Таким образом, неподвижные части головы останутся на месте.
Также можно использовать ноду Select Points. Здесь указываются точки на подвижных частях лица:
Далее переходим в настройки оптического потока. В окне Visual Editor вокруг модели появились камеры, которые можно корректировать.
Сверху есть выпадающее меню, с помощью которого можно перейти в вид из камеры. По умолчанию их 13. Надо поставить их так, чтобы лицо полностью попадало в кадр.
По рекомендации разработчиков почти все настройки я оставляю по умолчанию за исключением параметров Resolution final и Optical flow smoothness final:
После этого, можно нажать Compute и посмотреть результат:
После того, как меш ровно спроецировался на скан, нужно запечь текстуру. делается это по тому же принципу, что и в первой части статьи:
В итоге, если совместить полученную текстуру с текстурой базового меша, добавятся некоторые детали, но, при этом, контрольные точки будут совпадать:
После этого, текстуру и полученную геометрию можно сохранить.
В итоге, мы получили меш новой эмоции с текстурой.
Метод Blend shapes позволяет “смешивать эмоции”. Для этого нужно подгрузить уже полученные меши в ноду Blend shapes.
Я подгрузила в первый узел нейтральную эмоцию. Двигая ползунки в настройках ноды, можно выбрать, насколько сильно будет выражена та или иная эмоция. Для того, чтобы этот метод сработал, модели должны иметь одинаковую топологию.
Вышеописанный процесс — это лишь небольшая часть очень объемной работы. После получения LowPoly моделей головы необходимо было создать карты нормалей, rougness, subsurface и т.д., а также настроить шейдер (в нашем случае мы настраивали шейдер для рендера и для движка). Также отдельно создавались глаза, одежда и волосы. Стоит также отметить, что данную задачу выполняли всего три человека. Это был наш первый опыт в создании высокодетализированного персонажа. Мы остались довольны результатом, но будем стремиться к большему.
Игра рассказывает о загадочных событиях, случившихся с главным героем, который волей случая остановился в американском отеле Алгол. Это происшествие полностью поменяет его жизнь и заставит столкнуться с неизвестным.
Это наш первый игровой проект и в нем мы стараемся добиться максимальной реалистичности персонажей, передать их эмоции и характер. Поэтому для их создания было принято решение использовать технологию сканирования лиц. В рамках задач проекта нам потребуется две степени детализации персонажей: под рендер — для синематика и low poly — для использования в самой игре.
Игра On Air разрабатывается на движке Unreal Engine 4. Мы планируем написать несколько статей, в которых расскажем подробно этапы подготовки персонажа.
В данный момент мы занимаемся созданием демо версии игры, которая уже в скором времени появится в Стиме. В данной статье я расскажу о начальном этапе создания лица главного персонажа нашей игры.
Часть 1
На изображении ниже представлены некоторые из эмоций, которые мы получили после обработки сканов.
В основном они утрированы и не кажутся реалистичными. Это было сделано намеренно. Дело в том, что в основе данного метода создания лица лежит принцип смешивания форм «Blend shapes». То есть, каждая из этих эмоций будет применяться не в “чистом” виде, а в совокупности с другими. Об этом я подробнее расскажу в самом конце статьи. Для начала, надо разобраться, что делать с отсканированной головой и как мы можем ее использовать. Очевидно, что топология скана не позволяет применить ее в качестве модели, но при помощи запечения карты нормалей мы получим основные черты лица, морщины, поры, неровности или шрамы. Также со скана мы можем извлечь текстуру базового цвета.
В этом нам поможет программа Wrap 3.3. Она широко используется для обработки отсканированных моделей. С ее помощью мы будем проецировать нашу будущую модель головы на сканы.
Часть 2
Для начала необходимо создать так называемый базовый меш. То есть, нейтральное выражение лица, которое будет лежать в основе всех эмоций. Наш скан с нейтральной эмоцией выглядит так:
Программа Wrap 3.3 имеет нодовую систему, то есть все функции представлены в виде узлов (нод), которые связаны друг с другом цепочкой.
Выбор нод осуществляется при помощи клавиши Tab. При помощи нод «LoadGeom» и «LoadImage» подгружаются скан с нейтральной эмоцией и соответствующая ему текстура. Для этого в окне File Names надо указать путь. В настройках ноды «LoadGeom» вы можете выбрать различные режимы отображения геометрии (на изображении ниже отключена функция wireframe). Также здесь можно изменить цвет геометрии (не работает, если подключена текстура), координаты и масштаб.
Далее необходимо подгрузить базовый меш, который будет проецироваться на данный скан. Найти его можно на вкладке “Gallery”. Здесь представлено множество уже готовых эмоций. В данном случае я выбираю Basemesh.
Basemesh стоит приближенно сопоставить со сканом. Для этого можно использовать оси координат.
Чтобы спроецировать базовый меш на скан, я использую ноду Wrapping. При наведении курсора мыши на узлы ноды, высвечивается подсказка: первый узел, Floating geometry — предназначен для проецируемой геометрии, второй узел, Fixet geometry — для фиксированного объекта, по которому будет проецироваться геометрия (в нашем случае это скан с нейтральной эмоцией).
Чтобы запустить вычисление, необходимо отметить точки на обеих моделях, которые будут соответствовать друг другу. Для этого используется нода Select points, которая подключается в соответствующие узлы моделей. Выбрав эту ноду, следует перейти на вкладку Visual Editor. Включенная функция Sync views позволяет синхронизировать камеры для левого и правого окон.
Если проецируемая модель содержит полигоны, которые должны оставаться на месте, необходимо выделить их, воспользовавшись функцией Select Polygons. Иначе могут возникнуть артефакты, связанные со внутренними деталями меша.
Для применения ноды Select Polygons используется вкладка Visual Editor. Здесь можно выделить те полигоны, которые Модели из галереи разбиты на полигруппы, это упрощает задачу: их можно выделить или снять выделение на верхней панели.
Я выделяю внутренние детали горла, ноздри, крайние лупы век и нижнюю часть шеи.
После этого модель будет проецироваться корректно.
Также, для большей детализации, можно использовать ноду Subdivide. Она подключается к базовому мешу и все ноды, которые находятся ниже, подсоединяются к ее нижнему узлу (Output).
Далее, надо запечь текстуру со скана на базовый меш. Для этого применяется нода Transfer Texture. Узел Source geometry подключается к модели, с которой будет запекаться текстура. В нашем случае это скан. Узел Target geometry подключается к базовому мешу, но уже не к ноде LoadGeom, а к ноде Wrapping, так как мы будем использовать уже измененную, спроецированную геометрию.
В настройках этой ноды можно выбрать качество запеченной текстуры. После этого стоит добавить ноду Extrapolate Image, чтобы заполнить прозрачные места, и сохранить полученную текстуру с помощью ноды Save Image и нажатием кнопки Compute current frame. Геометрия сохраняется аналогично, с помощью ноды Save Geom.
Часть 3
После того, как мы получили нейтральную эмоцию и текстуру для нее, можно перейти к получению геометрии для других эмоций. Для этого подгружаем модель скана и Basemesh с текстурами.
Далее нужно выровнять Basemesh по скану. Для начала можно сопоставить модели приближенно, воспользовавшись координатными осями.
Нода, которая позволяет более точно выравнивать модели относительно друг друга — Rigid Alignment. В узел Floating geometry подсоединяется геометрия, которую необходимо выровнять. В узле Fixed geometry, соответственно, будет статичная геометрия (в нашем случае это скан).
При использовании ноды Rigid Alignment необходимо использовать ноду Select Points:
На моей модели есть контрольные маркеры, которые упрощают задачу при выборе точек. Для выравнивания моделей относительно друг друга точки необходимо ставить на тех частях лица, которые незначительно меняются при изображении той или иной эмоции. В случае с данной эмоцией это лоб, верхняя часть носа, шея и тп. Также, точки желательно расставлять по всем сторонам модели (то есть, например не только на лице, но и на затылке и ушах).
В результате мы получаем выровненные относительно друг друга модели:
В настройках ноды Rigid Alignment есть функция “Match skale”. Она используется, если модели необходимо выровнять также по масштабу.
После этого можно заняться проекцией базового меша на скан. Для этого мы будем использовать ноду Optical Flow Wrapping (оптический поток). Она позволяет выравнивать геометрию по текстуре скана. При этом полученная в итоге текстура эмоции будет полностью совпадать с текстурой базового меша за исключением складок, морщин и других изменений. Все неровности кожи и поры при использовании этого метода остаются на своих местах.
Перед использованием оптического потока, как и в первом случае, используется нода Select Polygons:
Таким образом, неподвижные части головы останутся на месте.
Также можно использовать ноду Select Points. Здесь указываются точки на подвижных частях лица:
Далее переходим в настройки оптического потока. В окне Visual Editor вокруг модели появились камеры, которые можно корректировать.
Сверху есть выпадающее меню, с помощью которого можно перейти в вид из камеры. По умолчанию их 13. Надо поставить их так, чтобы лицо полностью попадало в кадр.
По рекомендации разработчиков почти все настройки я оставляю по умолчанию за исключением параметров Resolution final и Optical flow smoothness final:
После этого, можно нажать Compute и посмотреть результат:
После того, как меш ровно спроецировался на скан, нужно запечь текстуру. делается это по тому же принципу, что и в первой части статьи:
В итоге, если совместить полученную текстуру с текстурой базового меша, добавятся некоторые детали, но, при этом, контрольные точки будут совпадать:
После этого, текстуру и полученную геометрию можно сохранить.
В итоге, мы получили меш новой эмоции с текстурой.
Часть 4
Метод Blend shapes позволяет “смешивать эмоции”. Для этого нужно подгрузить уже полученные меши в ноду Blend shapes.
Я подгрузила в первый узел нейтральную эмоцию. Двигая ползунки в настройках ноды, можно выбрать, насколько сильно будет выражена та или иная эмоция. Для того, чтобы этот метод сработал, модели должны иметь одинаковую топологию.
Результат
Вышеописанный процесс — это лишь небольшая часть очень объемной работы. После получения LowPoly моделей головы необходимо было создать карты нормалей, rougness, subsurface и т.д., а также настроить шейдер (в нашем случае мы настраивали шейдер для рендера и для движка). Также отдельно создавались глаза, одежда и волосы. Стоит также отметить, что данную задачу выполняли всего три человека. Это был наш первый опыт в создании высокодетализированного персонажа. Мы остались довольны результатом, но будем стремиться к большему.