Анимация от "А" до "Я"

Содержание:
ВЖУХ! И мы переместились во времени. Не знаю, что вам рассказал WebSter в предыдущей подстатье, но точно знаю, что он вам соврал эта информация несколько устарела. Весь этот цикл статей расписывает процесс анимирования моделей формата mdx v800, но с тех пор много воды утекло, в частности, начиная с 900-ой версии, появилась поддержка карты весов вершин (vertex weight map).
Она позволяет более тонко связать скелет и меш, определив степени влияния костей на каждую вершину. К сожалению, упоминаемые в этой статье mdlvis и War3ME не поддерживают работу с весами (надеемся, что разработчики это скоро исправят!), но эта возможность доступна в серьёзных 3D-редакторах, вроде 3D Studio Max, Blender или Maya.
Увы, это не то место, время, формат и, что самое главное, не тот автор, чтобы расписать актуальную методику скиннинга “от а до я”, поэтому статья будет в формате эдакого ликбеза для самых маленьких, ну а в конце я приложу ссылки на пару хороших видеоуроков по которым я сам разбирался два дня назад.

Теория

Связывая вершину с костью в mdlvis, мы заставляем её полностью повторять движение этой кости, вызывая соответствующую деформацию меша во время анимаций. Иногда, такой грубой привязки оказывается достаточно, но часто анимации у таких моделей могут выглядеть неестественно. Например, при изгибе мы должны наблюдать некоторое сопротивление части вершин, располагающихся вблизи линии сгиба. Причём у куска картона, человеческого локтевого сустава и гидравлического шланга объём этого сопротивления будет разным. Достичь этого можно путём распределения веса вершин, находящихся на стыке костей. Под весом в данном случае подразумевается степень влияния костей на положение привязанной к ним вершины. Условно, мы можем привязать изгибаемую поверхность к двум костям, и распределить вес 70/30. Если мы двигаем только одну кость, а вторую оставляем на месте, то поверхность повторит за этой костью 70% от её объёма движения, что сымитирует реалистичное растяжение на сгибе.
Собственно, в варкрафте это работает точно также. Вот как это реализовано в mdl:
SkinWeights 3 {
        { 1, 0, 0, 0, 255, 0, 0, 0 },
        { 2, 3, 0, 0, 200, 55, 0, 0 },
        { 3, 2, 0, 0, 139, 116, 0, 0 },
}
Внутри модели располагается раздел SkinWeights, хранящий веса. Количество значений в этом массиве равно количеству вершин. И на каждую вершину приходится таблица из восьми значений. Первые четыре значения это ID костей, к которым привязана данная вершина, а следующие четыре — значения веса соответственно указанным костям. Приведённый пример говорит нам, что первая вершина привязана к первой кости с весом 255, а вторая вершина — к кости 2 с весом 200 и к кости 3 с весом 55. Из примере можно сделать два вывода:
  • Одну вершину можно прикрепить не более, чем к четырём костям.
  • Общий вес вершины равен 255.
Вес измеряется в абстрактных варкрафтовских единицах, которые не используются в других средах, например общий вес вершины в 3D Studio Max равен 1.0. Впрочем, это не проблема, так как важны не конкретные значения, а именно пропорции распределения. Да, Варкрафт не поддерживает несбалансированные веса, и у каждой вершины он должен быть суммарно равен 255, не больше и не меньше. В противном случае мы гарантированно получим проблемы, от незначительных артефактов в виде выпадающих из общего меша вершин, до полной неработоспособности анимационной линейки! Как правило, в 3D-редакторах есть настройка вроде Normalize, ограничивающая общее значение веса, чтобы избежать разбалансировки.

Практика

Теперь небольшая демонстрация того, как это работает. Создадим в 3DS Max примитивную модель, и добавим внутрь простой риг.
Теперь свяжем наш своеобразный тентакль со скелетом. Выделяем меш и идём во вкладку Modify. В списке Modifier List ищем модификатор Skin и применяем. В разделе Bones нажимаем Add и вяжем со всеми костями.
А теперь попробуем с помощью инструмента Rotate повернуть вторую кость. И что мы увидим?
Вершины, обведённые на скрине красным, последовали за костью, а вершины из голубого прямоугольника остались на месте. Деформируется только несколько рёбер в месте стыка костей, а меш с правой стороны вот-вот проткнёт сам себя.
С помощью Warcraft III Reforged Tools экспортируем модель в mdx v1000 для дальнейших испытаний, и вернёмся назад в модификатор Skin.
Нажимаем большую кнопку Edit Envelopes, выделяем вторую косточку и смотрим на окрашенную поверхность.
Весь меш, окрашенный красным, полностью опирается на выделенный энвелоп. Белый меш вообще никак с ним не связан, а все промежуточные цвета (оранжевый, жёлтый, синий) показывают некоторую степень влияния.
Установим галочку на Select Vertices, и начнём выделять вершины сечений, несвязанные с текущим энвелопом. Переходим в раздел Weight Properties, и повышаем там значение параметра Abs. Effect.
Мы видим, что область возле выделенных вершин тут же окрасилась в синий цвет. Мы распределили часть веса этой вершины на нашу косточку. Я установлю 0.9, и буду спускаться по мешу ниже, устанавливая параметр Abs. Effect всё ближе и ближе к нулю. Получилась вот такая окраска, от тёплого к холодному.
Теперь попробуем также согнуть наш меш, и посмотрим на результат.
Видно, что простой поворот кости потянул за собой ещё некоторую часть тентакля, деформировав его так, будто он резиновый. Не то чтобы это был очень красивый и реалистичный изгиб (с торчащей наружу родительской костью, ага), но тут важна сама демонстрация. В принципе, после настройки весов модель можно анимировать сразу тут же, в максе. Но мы не будем этим заниматься, а просто экспортируем эту модель в mdx и закончим с 3DS Max.
Теперь откроем наши модели в Retera’s Model Studio и протестируем. Точнее, убедимся, что наши веса сохранились. Для начала попробуем также повращать вторую косточку.
Результат, который мы видели в 3DS Max, сохранился. У модели с настроенным весом присутствует та же “резиновость”.
Откроем вкладку Text, и проверим раздел SkinWeights.
Значения в таблицах веса присутствуют, и их пропорциональное отношение друг к другу осталось таким же, каким было в максе. Видно, что кости нумеруются с нуля, так как у промежуточных вершин вес прописан для нулевой и первой костей. Ну вот и всё, мы убедились, что наша таблица весов работает в варкрафте.

Полезные видеоуроки


`
ОЖИДАНИЕ РЕКЛАМЫ...