Создаем Locomotion систему в UDK

Locomotion системаПродолжая работать над постановкой стоп персонажа в UDK через инверсную кинематику (IK), мы плавно переходим к созданию так называемой Locomotion-системы для UDK. Вечно меня тянет в те области, в которых я вообще не разбираюсь! ;)

В чем же заключаются недостатки обычной IK-системы для постановки стоп?

Во-первых, она работает пост-фактум. Т.е. корректировка стопы осуществляется уже после того, как в анимации стопа поставлена на землю. А учитывая неровность поверхности — поставлена изначально неправильно. Стопа проваливается в землю и только после получения сигнала из анимации корректируется IK-контроллером. Смотрится это, честно говоря, не айс!

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

А в чем же заключается отличие Locomotion-системы от постановки стоп при помощи IK-контроллеров?

Главное отличие Locomotion системы в том, что она предугадывает следующее положение стопы и уже с самого начала ее движения направляет стопу в точку приземления.

Полностью процедурная Locomotion анимация

Locomotion-системы можно строить по-разному. Есть, системы, в которых полностью отсутствует анимация, т.е. анимация формируется полностью программно (или, как еще говорят, процедурно) на базе некоторой математической модели. Это, конечно, рай для аниматора, ведь ему практически ничего не нужно делать! Но в то же время — ад для программиста :) Хотя тоже как посмотреть. Если у вас не стоит задача процедурно просчитывать физику работы отдельных мышц человека, как это сделано, например, в системах Morpheme или Euphoria, то все можно сделать достаточно просто.

Я за пару дней набросал основу простенькой Locomotion-системы для UDK на UnrealScript. В ней в виде мат.модели используется вращающийся маховик колеса. На этом колесе в разных его частях расположены точки, соответствующие стопам ног персонажа. Ног, кстати, может быть сколько угодно и взаимное расположение точек также может регулироваться, придавая движению различный характер (от хромания и старческой ходьбы до бега трусцой, галопа и прыжков двумя ногами вперед).

Locomotion в UDK: мат модель

На рисунке присутствует уровень земли. От него также зависит характер движения. Когда точка, соответствующая стопе, находится в секторе окружности, обозначающем землю — стопа находится на земле и жестко закреплена на месте. Когда же стопа отрывается от земли (выходит из соответствующего сектора окружности), значит стопа находится в движении к следующей точке.

Зная скорости вращения маховика, отвечающего за темп ходьбы, а также зная скорость перемещения персонажа, можно легко вычислить следующую точку на прямой перемещения персонажа и провести из нее трассировку луча для нахождения точного положения стопы на поверхности. Тут чистая математика (которую я так не люблю!).

Locomotion в UDK: предсказывание положения стоп

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

Колесо маховика, кстати, очень удобная математическая модель. Она позволяет использовать текущую фазу в расчетах всяких плавных интерполяционных движений, выдавая чистую синусоиду, которую можно быстро обсчитать при помощи формулы «быстрых» синусов или косинусов:


function float FastSin(float x)
{
    x = x * DegToRad;
    return (x - x * x * x / 6);
}

function float FastCos(float x)
{
    x = x * DegToRad;
    return (1 - x * x / 2);
}


Точность у этих формул достаточная. Косинус даже рассчитывается гораздо проще! Но это так, чтобы не забыть :)

Locomotion-система, управляемая анимацией

Второй подход — создание Locomotion системы, управляемой анимацией. Именно этот подход был использован создателем Locomotion-системы для движка Unity. (Там же по ссылке можно скачать основные тезисы его диссертации в PDF-формате). Основной смысл в том, что вместо математической модели колеса, как в примере выше, циклы анимации получаются в результате анализа заранее заготовленных анимаций. Аниматорам, конечно, придется потрудиться, но зато результат получается достаточно правдоподобный. Об этом можно судить, поиграв в Live-demo там же на сайте.

Locomotion система в Unity

Мне видится возможным реализация аналогичной Locomotion-системы в UDK на UnrealScript. Блендингом анимации будет заниматься сам движок Unreal Engine, используя AnimTree. Вместо математической модели вращающегося колеса можно использовать внутренние анимационные циклы Unreal Engine, а выработку сигналов об отрыве стопы от земли и ее опускании можно поручить анимационным нотификаторам (обработчикам событий анимации), о которых я уже писал ранее.

Важным моментом здесь является синхронизация анимаций движения таким образом, чтобы положения ног совпадали при блендинге из одной анимации в другую (например, из бега в ходьбу). Это позволит вырабатывать правильные сигналы для обработчиков событий анимации в UDK через UnrealScript. Добиться этого помогут анимационные группы AnimGroup, которые теперь используются в Unreal Engine:
  • +1
  • 05 ноября 2012, 14:20
  • dimanjy

Комментарии (1)

RSS свернуть / развернуть
+
0
Очень любопытно, я занимался именно таким же анализом. Но пока все что сделал: добавил наклон персонажа в зависимости от направления его ускорения, включил футплейсмент, и добавил нод в анимтри для синхронизации скорости движения с анимацией. Получилось намного лучше, хотя и не так красиво как в юнити. Через нотификаторы от анимации, думаю, вполне реально сделать красивую процедурную анимашку. Я так сделал хромого персонажа (меняя параметр foot offset в зависимости от того на какой ноге он стоит)
avatar

lorendroll

  • 06 декабря 2012, 15:29

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.