CitizenCon 2947: улучшаем анимации

CitizenCon 2947: улучшаем анимации

CitizenCon 2947: улучшаем анимации

Улучшаем анимации от захвата движений при помощи процедурных систем

Перевод от H_Rush

Эта панель посвящена работе команды аниматоров с данными от мокапа (захвата движений актеров) для создания по-настоящему интерактивных анимаций.

Первым с презентацией выступил Джейсон Коул – ведущий аниматор синематиков для SQ42.

Тема его доклада – инверсная кинематика взгляда (Look IK) или, как они называют эту систему, изменение взгляда PCap. Она используется для того, чтобы заставить ИИ или НИП смотреть на игрока или какой-то определенный объект.

Первый ролик демонстрирует нам персонажа Моро, к которому не применяется система Look IK. (Стоит отметить, что все материалы еще находятся в процессе работы, и нам показывают только специальный тестовый уровень.)

Это стандартный PCap, который аниматоры обычно получают. На видео камера двигается вокруг персонажа, имитируя перемещение игрока, но персонаж никак не реагирует на это.

ScBkzCG.jpg

Следующий этап – приказать Моро смотреть на камеру, как будто там находится игрок. Второй отрезок показывает работу стандартной системы Look IK, которой аниматоры пользовались раньше. Она все время включена. Теперь персонаж постоянно смотрит на камеру, что, конечно, хорошо, но из-за этого теряется множество нюансов актерской игры. И это стало одной из главных проблем года, с которой предстояло разобраться.

Чтобы решить ее аниматоры разбили IK на три части: глаза, голова и тело, и каждому участку присвоили числовое значение от 0 до 100. 0 означает, что Look IK полностью выключена, а 100 – что полностью включена.  Первое, что сделали разработчики, – вручную распределили эти значения по ключам всей анимации. Это дало довольно неплохие результаты работы Look IK, но какие-то тонкости актерской игры все равно пропадали. К тому же ручной подход отнимал очень много времени. Так что в качестве следующего шага аниматоры создали вспомогательный объект для управления анимацией в Maya и разместили его перед актером. Ему было присвоено правило: всякий раз, когда персонаж смотрит на этот вспомогательный объект, Look IK включается на 100%. И чем сильнее персонаж отводит взгляд в сторону, тем больше снижается степень активности Look IK, вплоть до 0. На картинке видно, что если персонаж отвернется от объекта на 90°, то Look IK полностью выключится.

DYI5p6A.jpg

Такой подход дал гораздо лучшие результаты, но на обработку вспомогательных объектов все равно тратилось много времени. И тогда Оуэн Робертсон, коллега Джейсона, предложил свою помощь в разработке специального инструментария. Параллельно работе с анимацией он также практиковался в программировании, поэтому он решил, что сможет написать скрипт для обработки анимаций.

Его код автоматически проводит все те операции, которые ранее приходилось делать вручную, чем существенно экономит время и силы команды аниматоров. Причем Оуэну удалось разместить Look IK для глаз и головы на двух разных слоях в Maya, в результате чего аниматоры получили возможность дополнительно гасить или увеличивать воздействие системы на эти части тела, а затем запекать результат в единую анимацию.

Третий видеоролик показывает результаты использования Look IK с применением дополнительного инструментария. Вначале результаты могут показаться неочевидными, но если сравнить старую версию с новой, то положительные изменения сразу бросятся в глаза. Актерская игра персонажа значительно улучшилась: он стал оглядываться назад, вертеть и кивать головой.

BzXXaKj.jpg

В последнем видео Джейсон продемонстрировал обработку крайних состояний. То есть случаев, когда игрок (камера) находится очень низко или очень высоко относительно персонажа. Система Look IK обрабатывает максимально допустимые параметры, при которых анимация не сломается. Можно заметить, что голова на нижнем левом сегменте немного вытягивается, и в дальнейшем аниматоры займутся исправлением этой проблемы. В целом же команде удалось добиться значительного прогресса за 8 месяцев.

8xwp389.jpg

Вторым докладчиком стал Иво Герзег – ведущий инженер по анимации. Он рассказал о том, как его команда учила персонажа ходить по лестницам и пересеченной местности и преодолевать препятствия на пути.

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

Есть и другая проблема: когда персонаж стоит на уклоне, одна его нога проваливается в физическую сетку, а другая в этот момент висит в воздухе. Аналогичная ситуация с висячей ногой случается, когда персонаж стоит на краю объекта. Так происходит, потому что для определения расстояния до земли используется точка центра модели персонажа, а идея, что ноги персонажа могут находиться на разных поверхностях пока не реализована.

zNIeAX2.jpg

Впрочем, такие проблемы относятся к области визуализации и не оказывают непосредственного влияния на игровой процесс. Но следующая проблема действительно серьезная. Она дает понять, почему до сих пор в играх не используются физически-корректные модели лестниц. В прошлом каждая часть тела персонажа имела физическое представление, в том числе и ноги. Проблема в том, что если у персонажа есть только анимации для перемещения по ровной плоской поверхности, он не сможет перешагнуть через препятствие. Это значит, что любой прямоугольный объект, который выше 20см, окажется для персонажа непреодолимым. На видео демонстрируется такой случай. Ситуация еще больше усугубляется, когда вы двигаетесь боком или задом при виде от первого лица. Это как невидимая стена – зачастую просто не очевидно, что блокирует путь. И, конечно, нельзя сказать дизайнеру уровней, чтобы он все объекты под ногами игрока сделал плоскими.

ELOG7xl.jpg

Один из вариантов решения этой проблемы – записать больше анимаций. Но это не всегда поможет, поскольку существует слишком много непредсказуемых ситуаций. Так что единственным выходом остается поиск процедурного решения.

Что касается наклонных поверхностей, с ними разобраться несложно. Даже в SDK движка Lumberyard уже есть подходящее решение, которое называется выравниванием по земле. Если для персонажа на склоне включить выравнивание по земле, обе его ноги будут касаться ступнями поверхности. Эта система берет анимацию передвижения по ровной поверхности и на лету преобразует ее в анимацию передвижения по наклонной поверхности. При этом в качестве входного значения она принимает только угол наклона плоскости. С технической точки зрения она работает достаточно просто: в каждом кадре мы испускаем луч под каждую ступню, а затем смотрим, находится ли точка пересечения луча с землей выше или ниже положения для текущей анимации. После чего мы регулируем положение бедер персонажа. Эта система позволяет персонажу стоять на наклонной поверхности, идти или бежать по ней в любом направлении, при этом его ступни всегда будут иметь полный контакт с поверхностью. Однако после применения выравнивания нужно протестировать все наборы анимаций, чтобы убедиться, что не возникнет неожиданных проблем. Например, при ходьбе в вертикальном положении достаточно просто немного опустить бедра персонажа и выровнять ноги относительно земли. Однако при перемещении на корточках придется сделать все с точностью до наоборот, а именно поднять бедра и вытянуть ноги.

rYPZ1BT.jpg

Также нужно учитывать углы поворота суставов. При использовании инверсной кинематики (IK) "сломать" сочленения в коленях очень легко. Например, если цель для IK находится очень далеко, то ближняя и дальняя нога могут повернуться практически в одном направлении, что полностью сломает всю анимацию. А порой ноги могут и вовсе сгибаться в противоположные стороны. Вдобавок много проблем доставляет голеностопный сустав. Он не должен вращаться больше чем на 30°, поэтому когда персонаж стоит на склоне, не всегда оказывается возможным корректно выровнять его ногу с землей, не превысив пределов поворота сустава. А затем персонажу еще нужно вставать на цыпочки одной или двумя ногами при ходьбе из стороны в сторону или во время спуска. И все эти передвижения не являются частью изначальных анимаций – они генерируются на лету системой IK.

Тем не менее, выравнивание корректно работает только со склонами и не может справиться с лестницей или случайным препятствием на пути. Поэтому перед разработчиками встает задача – научить персонажа обходить препятствия. На следующем видео загружен небольшой тестовый уровень, на котором разбросано множество мелких препятствий. Можно заметь, что персонаж во время ходьбы иногда наступает на препятствие и переносит вес всего тела, а иногда перешагивает объект. Для работы такой механики персонаж должен хорошо понимать, что находится перед ним. Также ему приходится как бы смотреть в будущее и предугадывать, куда он поставит ногу в следующий момент. Вычислить это несложно, поскольку мы точно знаем скорость и направление движения персонажа в каждый момент времени. Если следующий шаг приходится на область внутри объекта или оказывается на пару сантиметров выше поверхности, тогда в ход вступает система IK, которая заблаговременно модифицирует траекторию анимации. После этого не составляет большого труда  отладить систему для работы с лестницами.

pQEEEkp.jpg

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

TvZcMlp.jpg

На следующем видео персонаж бежит через препятствия, и мы видим, как он пытается процедурно перепрыгивать их. Во время бега необходимо сканировать окружение вокруг персонажа в радиусе 1-2 метров. Если в этой области оказывается препятствие, то система вычисляет новую траекторию и вносит корректировки в анимацию. Это работает при движении в любую сторону и с любой скоростью.

k7fPtWr.jpg

Разработчики не стали использовать нейронные сети или компьютерное зрение для имитации реальных процессов анализа местности человеческим мозгом, поскольку это отняло бы очень много ресурсов. Вместо этого они применили алгоритм анализа, который отчасти напоминает то, как слепой человек при помощи палочки определяет, что находится перед ним. Для сканирования окружения решено было задействовать систему простых лучей, которыми управляет специальная функция пересечения лучей в мировом пространстве. Она же используется для выравнивания ног персонажа по земле из прошлого примера, однако там нет механизма предсказания, поэтому ей хватает всего двух лучей. Здесь же тестирование было начато с 50 лучей, хотя для получения исключительно точной картинки окружения их требовалось в разы больше. Однако во время тестирования этой функции частота кадров в сцене сразу же упала с 50 до 5, и все перестало работать. Причиной падения оказались чрезмерно сложные бинарные деревья, которые используются для формирования мира.

UEFUFZT.jpg

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

l82Fzon.jpg

В видеоролике можно хорошо наблюдать эту зону. Фактически, это отдельная физическая область в локальном пространстве персонажа. После получения данных о физических сетках можно провести их обработку и отбросить те их них, которые не будут влиять на анимацию. В итоге в списке остаются только такие объекты, которые потенциально могут изменить анимацию передвижения персонажа. Важно, что чем шире зона, тем больше в нее попадает объектов, а это приводит к снижению производительности. По этой причине реальная зона, использующаяся в игре, намного меньше. Она располагается прямо под персонажем, но динамически расширяется при движении. Это позволяет испускать лучи только в ту сторону, куда через мгновение переместится персонаж (за счет алгоритма предугадывания), и серьезно экономит ресурсы ЦП. В результате разработчикам удалось добиться повышения производительности от 20 до (в некоторых случаях) 50 раз – это зависит от количества и формы преград на пути.

lZi6Q7F.jpg

После решения проблем с производительностью пришло время протестировать систему на поверхности планеты. Ее ландшафт, фактически, представляет собой набор патчей (плоскостей, соединенных друг с другом под различными углами), спроецированных на гигантскую сферу. А раз это наклонные плоскости, то, казалось бы, проблемам взяться неоткуда, но все оказалось не так просто. Для визуализации рельефа разработчики используют механизм аппаратной тесселяции, т.е. разбиения полигона на треугольники. Проблема в том, что тесселяция  работает только для геометрии, но не работает для физической сетки. Как итог – персонаж стал проваливаться в рельеф местности из-за расхождений между геометрической и физической сетками.

zemSVSF.jpg

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

Следующее видео показывает нам новую физическую сетку, которая теперь корректно повторяет геометрический рельеф местности. Тесселяция – это ресурсозатратная операция, которая должна выполняться для каждого кадра. Физическая сетка не обрабатывается на ГП, поэтому ее тесселяция отнимает очень много ресурсов ЦП, но хорошая новость тут в том, что достаточно обработать лишь фрагмент сетки вокруг персонажа (ее площадь всего 1-2 кв.м, что намного меньше, чем показано на видео). Еще одна приятная новость – работать с патчами довольно просто, а поскольку алгоритм тесселяции вполне примитивный, обрабатывать лучи на тесселированной сетке получается даже быстрее, чем на тестовом уровне из прошлого ролика. Теперь персонаж наконец-то может пройтись по луне, не утопая при этом в грунте.

JtxSSy4.jpg

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

Тем не менее, все процедурные методы работают по одному принципу: компьютер следует заданному алгоритму для получения результата. И, конечно, все они обладают одним общим ограничением – они работают только в определенных случаях или для определенных движений. Поэтому если вам вдруг понадобится создать новую модель поведения или изменить существующую, программисту придется писать новый код, который всегда представляет собой комбинацию различных решений системы IK. Поскольку она по своей сути является просто методом кинематики, то не может быть физически-корректной. Работая с IK, вы можете создать совершенно безумные вещи. Например, если коробка на пути персонажа окажется слишком высокой, он может попытаться сесть на шпагат при попытке перешагнуть ее. IK пришла из индустрии робототехники, и если вы используете ее для создания человеческих движений, они могут начать выглядеть неестественно. Поэтому самая сложная задача здесь – это не просто предсказать корректное положение следующего шага, но и сохранить баланс и целостность оригинальной анимации.

Star Citizen – это все же игра с видом от первого лица. Поэтому посмотрев себе под ноги или на свою тень, вы увидите, как передвигается персонаж, и эти движения должны быть правдоподобными.

Дополнение от Стива Бендера – глобального директора по анимации:

Это только малая часть всех тех технических проблем, с которыми каждый день сталкивается команда аниматоров. В любой другой игре вы перемещаетесь по уровню, который создал дизайнер. Геометрия этого уровня тщательно проектировалась, его тестировала команда QA, поэтому в идеале там не должно быть таких мест, где поведение персонажа окажется непредсказуемым. В Star Citizen все несколько иначе. Из-за системы процедурной генерации во Вселенной присутствует огромное количество мест и территорий, которые никто никогда не видел и не проверял. Может быть вы станете первым игроком, который ступит на поверхность неизвестной планеты. И если там начнется перестрелка, система анимации не должна подвести. Люди с нетерпением ждут возможностей перевозить грузы, вести добычу, изучать неизведанное, и во всех случаях персонаж должен корректно двигаться, чтобы у игрока сохранялось чувство погружения в игру. Потому что мы создаем анимацию не просто для игры, а для целой Вселенной.

Admin administrator