Во время GDC Summer 2020 старший инженер по программному обеспечению Respawn Entertainment Бартломей Васак провёл лекцию о создании физических анимаций для Star Wars Jedi: Fallen Order и проблемах, с которыми столкнулись разработчики при их реализации.
Мы побывали на лекции и перевели главное.
Лекцию пересказал Никита Казимиров.
Так называемая «физическая» анимация не просто проигрывает фиксированную последовательность движений, а использует физику, чтобы заставить части тел двигаться в соответствии с ситуацией в пространстве.
На примере ниже воспроизводится одна и та же анимация. Но справа — «физическая», которая помогает определить точки коллизий и избежать провала текстур и частей тела друг в друга. Иными словами, анимация немного изменяется, подстраиваясь под законы физики. Слева же видна стандартная анимация, из-за которой рука персонажа проходит сквозь стену.
Есть три способа подстроить анимацию под физику. Первый — использование моторов. Мотор — это часть шарнирных соединений между разными частями модели. Он использует специальный алгоритм, чтобы определить источник распределяемой между телом силы. И эта сила как бы задаёт движение отдельных частей согласно конечной точки анимации, которую разработчики прописывают заранее.
Второй метод — использование скоростей. В этом случае рассчитывается скорость, необходимая для перемещения тела из одной точки в другую за отведённое время. Тело заставляют двигаться с нужной скоростью, чтобы оно достигло конечной точки анимации.
Третий метод — применение ограничителей. В этом случае разработчики создают новые ограничители между динамическим ragdoll-телом и конечной точкой анимации. Все параметры нового ограничителя определяют, как заставить динамическое тело двигаться к конечной точке анимации.
При разработке Star Wars Jedi: Fallen Order начали с первого метода. Впервые его применили на штурмовиках, которых главный герой хватает при помощи Силы. В этом случае центр тяжести штурмовика движется строго согласно анимации, а вот конечности уже поддаются законам физики. Красным помечены объекты, которые двигаются исключительно благодаря прописанной анимации, — то есть физика не используется. Можно увидеть, как благодаря физической анимации ноги штурмовика взаимодействуют с ящиками. Без использования физики они просто прошли бы сквозь него.
Было очень важно правильно настроить несколько физических параметров. Первый — это число итераций решателя (solver iterations), от которого зависит то, насколько часто движок просчитывает применение физики за один фрейм. По стандарту в Unreal Engine 4 их восемь для позиции тела и один для скорости. Но с «моторами» такие параметры не работают: в случае Fallen Order пришлось использовать 64 для позиции и 32 для скорости.
Дополнительно пришлось заняться вопросами трения объектов и их возвращения в исходное состояние (реституцией). Эти параметры создают множество проблем для физических анимаций: высокие значения трения затрудняют движение тела к нужной точке. При разработке Fallen Order использовались низкие значения трения и реституции. Когда главный герой хватает штурмовика при помощи Силы, то трение вообще отсутствует, — чтобы физике было проще соответствовать анимации.
Ещё одна важная деталь — непрерывное обнаружение столкновений (CCD — Continuous Collision Detection). Оно должно быть включено для высокого качества анимаций, но между телами внутри одного ragdoll-объекта его лучше отключить. С физикой Fallen Order CCD работало плохо, так что Respawn пришлось написать специальный код, который притягивал тела друг к другу, если они по какой-то причине лишком сильно отдалились и перешли заданные границы.
Также физические анимации в Fallen Order использовались в момент смерти штурмовиков. На примере ниже физика включается лишь под самый конец анимации, чтобы тело реалистично упало на землю под действием гравитации.
Подобный метод хорошо работал на открытых локациях, но в закрытых помещениях части тела слишком часто проходили сквозь текстуры стен. Смерть врагов тогда выглядела не очень естественно.
Чтобы улучшить анимацию гибели штурмовиков, разработчики включили физические анимации для всех частей тела, а также применили моторы для всех соединений. Теперь основной проблемой стали бёдра штурмовика, которые служат в качестве центра его модели — из-за их подвижности бёдра могли постоянно проходить сквозь другие объекты. Но разработчики всё равно стремились к тому, чтобы центр модели поддавался законам физики, — ведь только в этом случае тела могли совершать все эти предсмертные акробатические кульбиты.
В Respawn решили сделать центр модели отдельным физическим объектом и создали для него новые ограничения, которые принуждали центр модели двигаться к конечной точке анимации. Но затем возникла другая проблема: когда тело сталкивалось с объектом, прописанные условия всё равно могли подталкивать его к финальной точке. В таком случае разработчики решили отслеживать расстояние между центром модели и финальной точкой анимации. Если оно превышало определённую величину, то для тела включался режим свободного падения.
На примере ниже показана подобная анимация. Центр модели определил, что тело не может пройти сквозь препятствие, и поэтому включилась анимация падения.
Все эти случаи актуальны только для штурмовиков. Для них было важно, чтобы физика работала как можно ближе к анимации, а также поддерживала коллизии. А вот для главного героя коллизии уже не так важны, зато его анимации должны были быть максимально плавными и естественными.
Первой разработчики реализовали физическую анимацию карабканья по выступам. Руки во время неё двигаются согласно заранее прописанной траектории, а вот все остальные части тела уже подчиняются законам физики.
На красной модели видно, что без добавления физики анимация выглядит несколько статичной. А с физикой появляются дополнительные движения, которые придают герою плавности.
Физика упростила работу аниматоров — благодаря ней они могли сконцентрироваться только на ключевых позах. А дополнительные движения и детали появлялись как раз за счёт физических анимаций. Использование моторов для главного героя на первый взгляд показалось очень хорошим решением. Но быстро выяснилось, что моторы подходят не для всех действий героя.
К примеру, анимация скольжения. При использовании слабых моторов оказалось, что когда герой сталкивается с препятствием или быстро меняет направление движения, то слишком интенсивно и нереалистично сильно качается. С сильными моторами анимации тоже выглядели неправдоподобно, — ведь герой был чересчур устойчивым.
Изменение скорости анимаций также не помогло. Тогда в Respawn решили использовать другой подход. Разработчики сделали этакую «смесь из нескольких анимаций сразу», а физику ослабили. При скольжении действие физики уменьшили в два раза. В результате герой начал скользить плавнее, а ещё им оказалось более приятно управлять стиком.
Такой вариант и вошёл в релизную версию игры. Также ослабление физики и смешивание анимаций применяются при карабканьи по верёвке и движении против сильного ветра.
Очередным испытанием для команды стала анимация балансирования при движении под вертикальной балкой. В первых версиях Кэл двигался слишком агрессивно и активно раскачивался из стороны в сторону. А итоговая поза героя была будто «оторвана» от остальной анимации.
Для начала в Respawn рассчитали желаемую линейную скорость. Это скорость, необходимая для полного движения тела из текущей позиции в конечную в одном кадре. Затем посчитали текущую скорость — уже исходя из анимации. А потом провели линейную интерполяцию между желаемой и текущей скоростью. Полученные скорости и применили к анимации балансирования (конкретно — к рукам героя), добившись желаемой плавности.
Все эти случаи описывают ситуации, когда герой находится в каком-то особом положении движения. В Respawn также хотели улучшить и стандартные ходьбу и бег, но поначалу не понимали, как именно это сделать. В итоге разработчики сконцентрировались на трёх конкретных моментах: начале движения, повороте и остановке. В них команда видела потенциал для применения физических анимаций.
Каждая физическая анимация при обычном движении Кэла длится около двух секунд и постепенно затухает. Именно она сглаживают переход между движениями героя и добавляет им инерции. По руке Кэла можно увидеть, что благодаря инерции его движения иногда отстают от заданной анимации, иногда — опережают. Благодаря этому бег выглядит реалистично. Дополнительно в Respawn создали новые ограничения для рук, чтобы те не слишком сильно отклонялись от желаемых анимаций.
Похожее решение команда применила для анимации ходьбы по балке — для рук вновь задали ограничения. В итоге балансирование выглядит аккуратно и естественно.
Особые анимации пришлось отдельно прописать для напарника Кэла — BD-1. Большую часть времени он проводит на спине главного героя. В Respawn хотели сделать анимации дроида более «расслабленными», чтобы он реагировал на каждое движение Кэла естественным образом.
В игре это выглядит так: ноги дроида строго подчиняются анимации, а движение остальных частей BD-1 уже зависит от физики.
В случае некоторых очень быстрых движений Кэла с анимациями BD-1 возникали проблемы. Его физические анимации становились нестабильными, и поэтому разработчикам пришлось создать новый ограничитель — между головой дроида и целью анимации.
Граница, после которой изменялась анимация, была динамической. Если герой двигается медленно, то предел выше, но если Кэл перемещался слишком быстро, то предел для BD-1 становится близким к нулю. Благодаря этому голова дроида всегда находится возле цели анимации.
Ниже показана работа этого ограничителя. Слева он отключён, и голова BD-1 при перекате Кэла практически полностью проходит в модель главного героя. Справа же ограничитель включен, потому голова всегда остаётся в нужной позиции. При этом остальное тело подчиняется всем законам физики.
Создание физических анимаций для дроида в целом оказалось трудной задачей — пришлось повозиться с масштабированием анимаций, а это всегда создаёт проблемы. Также нужно было разобраться с порядком выполнения анимации, особенно когда Кэл скользил или совершал другие активные действия — ведь в этом случае физические анимации были активны и для BD-1, и для главного героя. Движения дроида ещё и сильно зависели от частоты кадров. При 30 fps они смотрелись натурально, но при 60 теряли правдоподобность.
Чтобы решить эти проблемы, в Respawn решили отключить коллизию для большинства анимаций взаимодействия между дроидом и Кэлом. Также анимации BD-1 разворачивались в собственной физической сцене при фреймрейте, который оставался фиксированным в любых условиях.
Если анимация заканчивалась слишком быстро, то оставшиеся движения дроида игра предугадывала и дополняла самостоятельно. Все физические анимации начинались с Кэла, а дроид реагировал на движения главного героя своими физическими анимациями.