7 вещей, которые я понял, делая анимацию для инди-хоррора Static Dread: Submarine
Сегодня хочу рассказать, как создавались персонажи и анимации в Static Dread: Submarine, и почему переход из 2D в 3D оказался одновременно лучшим и самым опасным решением для инди-проекта.
Всем привет! Меня зовут Данис, я занимаюсь персонажной анимацией уже больше 10 лет.
В первой части игры Static Dread: Lighthouse были 2D персонажи, и почти вся анимация собиралась в Spine 2D. Это были классные риги, но у каждого персонажа обычно была одна анимация, максимум несколько (например, у пса, который шатался за нами по маяку).
Когда мы начали работать над новой игрой, прозвучала фраза, которая регулярно усложняет жизнь разработчикам: «А давайте так же, но теперь всё в 3D!»
Это означало что работы будет куда больше:
- полноценные 3D модели персонажей
- риги
- десятки анимаций
- катсцены
- анимации от первого лица
Но и возможностей будет тоже больше. В крупных игровых студиях, каждый этап делается отдельным узким специалистом, но в реалиях инди-геймдева… Я назначил себя “Лордом по персонажам”, и подошел к задаче как к единому пайплайну. Это помогло не вставлять самому себе палки в колеса на каждом следующем шаге.
- Удобная топология ->
удобная текстура ->
удобный риг ->
удобный префаб в Юнити.
За время разработки я сделал несколько выводов, которыми и хочу поделиться.
1. Если можно переиспользовать - переиспользуй
Первое правило клуба инди-разработки: не делай одну и ту же работу дважды (и никому не рассказывай о клубе).
Все персонажи в игре создавались на основе единого базового меша. На нем сразу были хорошо сделана основа: лупы на лице под будущую мимику, лупы на сгибах конечностей и пальцах, более менее равномерная сетка под редактирование. Необходимый минимум.
А еще у них максимально похожая UV-развертка, что позволило:
- быстрее делать текстуры. Даже иногда копировать куски текстуры с одного персонажа на другого. Например уши и кисти это одна текстура на всех с небольшими правками.
- ускорить риггинг. Так мы можем сохранить карту весов и настроенные веса буквально переносить с одного персонажа на другого.
- сохранить единый визуальный стиль. Это буквально один подход к форме и полигонажу на всех персонажах (общий базовый меш!)
При этом сами персонажи всё равно выглядят разными, потому что геометрия редактируется и добавляются детали, а изначальный концепт-арт, к которому надо стремиться, очень выразительный и понятный.
Каждый персонаж в игре использует примерно ~3000 полигонов. И 2 - 4 текстуры в разрешении 2K, которые уже в движке сжимаются до 512x512.
По современным меркам это полигонаж голубя пролетающего на заднем плане в каком-нибудь Человеке Пауке, и текстура волос в ноздре metahuman-персонажа. Но для стилистики PSX эпохи как раз то, что нужно.
2. Иногда концепт-арт можно просто «наклеить» на модель
Для текстурирования использовался довольно простой трюк, которому я научился еще когда занимался моушн-дизайном.
Сначала концепт-арт проецировался прямо на модель.
После этого геометрия немного корректировалась, чтобы лучше совпадать с проекцией. Затем текстура запекалась на клон модели с продуманной и подготовленной UV.
А дальше модель отправлялась в Procreate, где недостающие части дорисовывались вручную.
Главное преимущество Procreate это возможность красить модель прямо в 3D.
Это полностью избавляет от проблем с продолжением текстуры на UV швах.
Однако, это оставляет проблему с темными швами между UV-островами. Особенно это заметно при компрессии текстур или искусственном понижении разрешения. А это как раз наш случай. Поэтому дополнительно пришлось дописать небольшой скрипт, который расширяет пиксели текстуры вокруг UV-островов и заполняет пустоты. Это предотвращает появление темных швов после компрессии.
В итоге получился быстрый способ превращать концепт-арт в 3D модель + игровую текстуру. С последующим медитативным процессом дорисовывания текстуры прямо на модельке.
3. Проще = лучше
Так как игра стилизована под эпоху PSX, риг тоже хотелось сделать минималистично простым. В итоге на персонажа используется около 60 костей, включая:
- основные кости тела
- полный риг пальцев
- кости лица под мимику
Сейчас в видеоиграх twist-joints (дополнительные кости для правильного поворота вдоль конечности) используются на каждый член руки и ноги, шею, обычно от 2 до 3 штук на каждый. У нас же twist-joints используются только на предплечьях - этого достаточно, чтобы руки не деформировались со слишком большими искажениями.
Несмотря на общий базовый меш, пропорции персонажей заметно отличаются, поэтому для каждого персонажа создавалась своя версия скелета. Обычно это было изменение пропорций, но иногда приходилось добавлять кости под физику, например, для хвостика инженера или узла на бандане повара.
В скининге (это процесс привязывания геометрии персонажа к костям) я использовал в основном 3 веса на вершину, что вполне достаточно при таком низком полигонаже и не приводит к путаннице при дальнейшем редактировании.
Больше весов я использовал только на монстрах вроде щупалец или маленьких хтоней с длинными усиками. Все эти длинные извивающиеся и пластичные штуки требуют большой плавности, поэтому у них и полигонаж довольно высокий и весов больше. Это дает максимальное сглаживание без использования тесселяции и прочих слишком уж современных технологий.
Помимо костей на персонажах людях было еще 5 морф-таргетов для лица, чтобы добавить моргание и прочую микромимику, что создало ощущение постоянной живости на лицах.Цифры ну очень небольшие по-меркам современной разработки.
4. Старая школа анимации всё ещё работает
Для мимики я решил использовать олдскульный подход, вдохновленный играми вроде Half-Life, где ртом управляла всего 1 кость. Вместо сложной системы blendshape используется всего 5 костей для рта:
- челюсть
- губы верх/низ
- губы левый край/правый край
Этого оказалось достаточно, чтобы передавать фонемы и эмоции. При этом сохраняется немного угловатая стилизация, которая хорошо подходит под ретро-визуал.
5. Не бойся странных решений
Моя отдельная гордость это как сделаны глаза! Это, пожалуй, одно из самых необычных решений, которые появились в процессе разработки.
Как обычно делают глаза.
Есть глазное яблоко сделанное отдельным мешем, веки следящие за направлением взгляда и закрывающие глаза, на вкус можно добавить ресницы/анимацию зрачка.
Почему это не подошло.
У нас очень выразительный концепт-арт и PSX стилизация с ограничениями в полигонаже. В случае с классическим подходом приходилось бы под эти глазные яблоки деформировать модель головы, что уведет от форм задуманного концепта.
В итоге я сделал неочевидную вещь и полностью убрал глазные яблоки.
Как работает UV-глаз.
Вместо глазных яблок используется маленький плейн, на котором нарисован глаз, а зрачок двигается по UV-координатам.
Это решение оказалось очень удобным:
- экономит полигоны
- хорошо вписывается в ретро-стиль
- позволяет делать глаза и череп любой формы
Для направления взгляда используется отдельная кость, идущая от головы, на которую ничего не заскинено.
Уже в Unity плагин SALSA читает направление этой кости, а кастомный шейдер смещает UV-координаты зрачка.Пришлось немного методом экспериментов подогнать множитель rotate joint на UV-offset, но это делается один раз и затем используется на всех персонажах.
Еще из интересного - у глаза есть характерный круглый блик, который можно получить только при накладывании на правильную окружность. Так как форма глаз в нашей игре вообще ни разу не ровная и не сферичная, если добавить блеск просто на материале, то блик будет тоже искаженным и некрасивым. Кто работает с 3D графикой отлично понимают что я имею ввиду.
Поэтому в тот же шейдер глаза с UV-offset я добавил фейковый блик который накладывается прямо по UV координатам и добавляет живости взгляду. Официально считаю это финальной вишенкой на торте.
6. Любой персонаж выглядят живым благодаря мелочам
В первой версии системы анимации было только два состояния, что выглядело скучновато.
Они либо стояли, либо говорили.
И всё.
Через несколько дней тестирования с грустным лицом (моим, не персонажей, они тогда еще не умели) стало понятно, что это слишком уж статично.
Поэтому я стал усложнять animator. Сначала добавил несколько вариантов idle - теперь персонажи в разных сценах и ситуациях по разному ждали игрока.
Потом я добавил вариации talk анимаций - теперь это была не всегда одна и та же анимация, а персонажи могли разговаривать по-разному жестикулируя.
А потом появилась и система behavior-анимаций.
Когда персонаж ничего не делает, он может начать потягиваться, смотреть на ногти, оглядываться вокруг.Это сильно оживляет сцену.
Достаточно пары секунд случайной анимации, чтобы персонаж перестал выглядеть как манекен.
7. Старые инструменты экономят огромное количество времени
Основным инструментом для работы с персонажами в Unity стал плагин SALSA. Я пользовался им на разных проектах ранее в течение последних 5 лет, и был с ним хорошо знаком.
Он используется для:
- lip-sync
- направления взгляда
- небольших движений головы во время речи
Для глаз пришлось написать кастомный шейдер, который смещает UV-координаты зрачка.
А для системы анимаций несколько небольших скриптов, которые управляют тем, когда и какие анимации можно запускать.
Например, если персонаж сидит, система не позволит ему внезапно начать тянуться вверх.
Физику тканей/волос было решено делать Magica Cloth. Плагином с которым я был также знаком уже несколько лет. Его преимущество над встроенным cloth в Unity - высокая стабильность и возможность быстро создавать proxy (упрощенные) версии меша для просчета физики.
Я делал на нем физику для проекта целиком состоящим из анимаций танцев, где очевидно было много критических и резких движений. Поэтому с тем, что плагин хорошо справится с физикой в нашей “визуальной новелле” я был уверен.
Выводы
Персонажи смогли сохранить стиль оригинальной 2D версии Static Dread, но при этом стали гораздо более живыми.
Переход из 2D в 3D оказался трудоемким, очень интересным, и открыл огромное количество новых возможностей.
Теперь в игре есть:
- десятки анимаций персонажей
- полноценные диалоговые сцены
- катсцены
- анимации от первого лица
И самое приятное - персонажи наконец перестали быть гифками.
Они начали жить своей маленькой жизнью внутри подводной лодки!
Static Dread: The Submarine все еще в разработке.
Если вам было интересно заглянуть за кулисы разработки, можете поддержать проект и добавить Static Dread: Submarine в вишлист:
https://store.steampowered.com/app/4042160/Static_Dread_The_Submarine
Всем спасибо и хорошего дня!