Как делать анимации в wow

Обновлено: 05.05.2024

В кинематиках для придания большей реалистичности действию часто используется триггерная команда
Анимация - Play unit animation.
Например, если какой-то герой по сюжету должен прыгать от радости, а он вместо этого стоит неподвижно, получится как-то неестественно. Самый лучший выход в этом случае - проиграть анимацию прыжка. Например, у Лорда Ужаса (Дридлорда) прыжок - это анимация Stand-3. И вот тут-то как раз и возникает проблема. Оказывается, что команда проигрывания анимации работает сразу с группой анимаций. Т.е. при попытке проиграть не Stand, а Stand 2, Stand 3 или Stand 4 результат будет непредсказуемый. Скорее всего, проиграется обычная анимация Stand (она же - Stand 1) или же вообще ничего не проиграется.
В случае с лордом ужаса проблема вполне разрешима - достаточно использовать для кинематики Вариматаса - у него есть анимация прыжка Spell Third, которая проигрывается без проблем.
Но в любом случае, очень обидно, что большинство анимаций юнитов оказываются триггерно недоступными. Особенно обидно бывает, когда импортируешь в карту модель WoW 10Мб весом, а потом оказывается, что из всех тамошних анимаций можно использовать лишь 3-4 штуки. Остальное же - просто мёртвый груз, ибо War вообще не понимает анимации с нестандартными именами (навроде Attack Very-Very Hard).

Триггерно решить эту проблему невозможно. А вот у JASS'еров есть шансы. Думаю, многие любители JASS во время просмотра common.j обращали своё внимание на функцию

Судя по её названию, она должна проигрывать анимацию не по имени, а по номеру. Т.е. всё, что надо сделать, это подставить туда номер анимации - и готово, имя не имеет значения!
Эх, если бы всё и впрямь было так просто :(. Blizzard'ы не были бы Blizzard'ами, если бы не придумали очередной способ сверления зубов дракона через задний проход. Т.е. данная функция попросту не работает! Причём абсолютно, все её вызовы просто игнорируются и на анимацию никак не влияют.

Так как же всё-таки проиграть нужную анимацию юнита?
Первое, что для этого нужно сделать - создать анимационный тег. Это особый объект, представляющий собой всего лишь список всех анимаций юнита. Создаётся он при помощи ещё одной "загадочной" JASS-функции:

Что только о ней не пишут во всяких мануалах! По одной версии, она добавляет новые имена анимаций; по другой - новые анимационные свойства (что бы это значило). В JASSWiki данная функция "поясняется" так: "Добавляет/удаляет анимационные свойства юнита".
На самом же деле она всего лишь создаёт анимационный тег (список анимаций юнита) и "цепляет" его на указанный юнит. Рассмотрим параметры этой функции:

  • whichUnit - всего-навсего тот юнит, анимационный тег которого мы хотим создать (или удалить, т.к. эта же функция способна и удалять анимационные теги).
  • animProperties - имя анимационного тега. Может быть любым. Используется для дальнейших ссылок на анимационный тег. Если ссылки на тег в дальнейшем не понадобятся, то в этом параметре можно передать null. Тогда ссылка на тег теряется и происходит утечка памяти (всем участникам команды DotaTeam рекомендуется всегда передавать сюда null).
  • add - если сюда передать true, то тег создаётся; если false - удаляется (при условии, конечно, что на юните есть тег с указанным именем). Все, кто озабочен утечками, должны непременно удалять теги, когда они становятся ненужными. Все остальные могут упростить себе жизнь и оставить теги неудалёнными (благо в любой кинематике и без того утечек масса).

Кстати, триггерщики для создания тега могут воспользоваться командой
Анимация - Add/Remove unit animation tag. Вообще говоря, это очень странно: создать тег триггеры позволяют, а работать с ним - нет :).

Итак, тег создан (для тех, кто забыл - напоминаю: тег есть список всех анимаций юнита). А вот теперь смело вызываем SetUnitAnimationByIndex. Триггерщики могут воспользоваться для этого Custom script:

Первый параметр этой функции - юнит, анимацию которого нужно проиграть. Второй - номер анимации (нумерация идёт с нуля, 0 - это, как правило, Stand 1).
Триггерщикам будет несколько сложновато определять, что нужно написать в качестве юнита :), выглядит это действительно страшновато. Ну что ж, могу посоветовать создать какой-нибудь триггер для тестирования, содержащий всего 1 команду, использующую данный юнит. Затем конвертировать триггер в текст и глянуть имя глобалки юнита. (Надеюсь, я вас ещё не загрузил?)
Вторая проблема - определить номер нужной анимации. WE тут ничем не поможет, т.к. его окошко анимаций сортирует их по алфавиту, а не по номеру. Номер можно определить, открыв файл модели юнита в блокноте (лучше - в виде MDL), War3Viewer, MdlVis, W3ME или подобной программе. После чего просто подсчитать анимации (от нуля), пока не дойдёте до нужной.

  1. Анимация - Add/Remove unit animation tag. Создаётся список анимаций на юните. Достаточно создать тег один раз, и можно проигрывать сколько угодно анимаций для этого юнита.
  2. Custom script: call SetUnitAnimationByIndex(gg_unit_XXXX_YYYY,N) предварительно определив имя глобалки, содержащей юнит и номер желаемой анимации.

Ну, вроде и всё. Если что-то будет непонятно - пишите. До скорых встреч :end:

Дополнение - загрузка игры

Появилась новая проблема - сбивание анимации, применённой с помощью "SetUnitAnimationByIndex" функцией "SetUnitPosition".

Возникает она после того, как игрок загрузит сохранённую ранее игру на вашей карте.

Голосовые Эмоции WOW (список)

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

Тема слеш-команд и эмоций в World of Warcraft продолжена в нашем разделе по макросам, а именно слеш команды WOW, где вы не найдете больше голосовых, но зато анимированных эмоций WOW там полно.

Введение

Уже много времени я с интересом просматриваю модели наших юзеров в "Моделях для базы", и мне, собственно говоря, порядком поднадоело видеть одни и те же "варовские" анимации, прилепленные к геометрии Пересадкой Мяса. Есть, конечно, энтузиасты, которые делают некоторые анимации или их части самостоятельно, но мало у кого это получается действительно хорошо.
И, смотря на всё это, я решил написать полную и подробную статью об анимировании, так сказать, от "А" до "Я".

Подготовка к работе

Основная часть

Предполагается, что читатель уже имеет базовые навыки работы с Mdlvis и War3 Model Editor. Если вы их не имеете, то советую прочитать соответствующие статьи на сайте.

В определённых заголовках вы можете увидеть цифры в скобках:

Практика (01-14)

ЧАСТЬ II. РЕДАКТОР АНИМАЦИЙ.


Видно, что по-прежнему активна навигационная панель, которая позволяет вра-щать, сдвигать и масштабировать систему координат. Также доступны панель вы-бора объектов переключение режимов. Надеюсь, у вас все текстуры на месте? Биб-лиотека ijl15.dll тоже? Тогда переходим в режим <Общий вид> (клавиша F) - так удобнее смотреть анимацию.
Как обычно, справа находится панель инструментов. Сейчас она практически пус-та. На ней сверху расположен список анимаций (сейчас там горит <Вся линейка>), а снизу - кнопка <Редактировать>.
Кроме того, прямо под рабочей областью появляется новый объект - Панель кад-ров. На этой панели выведены все кадры анимаций. Сейчас там изображена вся анимационная линейка, от 0 до 15167 кадра.
Следует отметить, что в WarIII разметка не покадровая, а посекундная. И ко-гда в MdlVis визуализируется анимация, то каждая секунда делится на 1000 кад-ров.
Получается, что суммарно всех анимаций этой модели набирается на 15,1 сек. времени. Нажатие кнопки

позволяет начать проигрывание. Нажимаем кнопку, смотрим: Видно, что модель как-то странно дергается. Дело в том, что в модели все ее анимации записаны последовательно друг за другом. Но при этом они вовсе не обязаны плотно прилегать друг к другу - между анимациями вполне могут быть <дырки> - пустые кадры, заполненные неким мусором. Поэтому при переходе от одной анимации к другой модель резко дергается. Останавливаем проигрывание, нажав на

. Видно, что модель застыла в той позе, в какой ее застал ос-танов, а посреди анимационной шкалы появилась красная черта:


Эта черта обозначает текущую позицию. Она всегда присутствует на шкале (толь-ко вначале она находится на нулевом кадре, у левой границы шкалы и ее почти не видно). А номер текущего кадра обозначается в соответствующем окошке справа (<Кадр>). Если навести курсор мыши на красную черту, то он примет форму двуна-правленной стрелочки. Тогда, нажав левую клавишу мыши (и удерживая ее) можно перемещать этот ползунок по анимационной шкале. Установив его в нужную пози-цию, отпустите кнопку мыши: при этом номер кадра в окошке изменится, изменит-ся и поза фигуры (она будет соответствовать выбранному кадру). Установить теку-щий кадр можно и просто введя его номер в окне кадра (нажав после этого Enter).
Обратите также внимание на флажок <МКИ>, расположенный между шкалой и окошком кадра. Он позволяет применить межкадровый интервал. Установите этот флажок. При этом под ним появится окошко со значением:

Число в этом окошке определяет межкадровый интервал (т.е. то, сколько кадров пропускается при просмотре). Чем этот интервал больше, тем больше скорость вос-произведения (но меньше качество). Установка малых МКИ позволяет просматри-вать анимацию на малой скорости. Снимите флажок МКИ (окошко интервала при этом исчезнет) - и анимация вновь будет проигрываться с реальной скоростью.

КЛЮЧЕВЫЕ КАДРЫ

АНИМАЦИИ.

инструментов список позволяет выбрать текущую анимацию для редактирования. В нем перечислены все анимации данной модели (у разной модели их набор различен). Кроме того, пункт <Вся линейка> позволяет вновь вернуться ко всей (полной) анимационной шкале. Вы, конечно, уже видели подобный список - в окне WarIIIViewer. Выберите какую-нибудь анимацию, например, Stand-1. При этом поза модели изменится(она будет соответствовать первому кадру указанной анимации), на шкале кадров появится разметка уже не всей анимационной линейки, а лишь ее части, соответствующей данной анимации; а панель инструментов заполнится:


Прежде всего, обратите внимание, что ключевые кадры теперь расположены редко (просто масштаб увеличился), так что их вполне можно свободно выбирать. Разуме-ется, выбранную анимацию можно проигрывать и выбирать кадр для просмотра. Но это все ерунда - просматривать анимации удобнее в Просмотрщике. А нам важно узнать, как эти анимации редактируются.

СКЕЛЕТ МОДЕЛИ

Предположим, что нам нужно изменить анимацию Walk - 1 (полет гарпии). Преж-де всего, выберем эту анимацию. Затем перейдем в контурный режим (отключим общий вид) и нажмем на кнопку <редактировать> панели инструментов. Кроме то-го, для наглядности установим галочку <Показ поверхностей>. При этом модель примет следующий вид:


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

При этом на панели инструментов в поле <Объект скелета> появится имя выбранной точки (так мы узнаем, что только что выбрали точку с именем bone_leg2_r), а чуть ниже указан тип объекта. Существует два типа объектов каркаса: кости и помощники. В MdlVis между ними нет никакой разницы (хотя в War'е обработка помощников идет быстрее, чем костей). Поэтому в дальнейшем все объекты скелета я буду называть костя-ми.
<Кроме того, иногда в модели бывают глобальные объекты, редактировать которые MdlVis пока не умеет. Эти объекты отвечают за глобальную анимацию, которая накладывается на все остальные: мерцание ауры героев, развевающийся плащ, флаг и др.>
Все кости связаны в единый скелет (каркас) модели. Вы, наверное, уже обратили внимание, что при выделении кости еще одна кость подсвечивается черным цветом, и еще несколько - желтым:


Черным цветом подсвечивается родительская для выделенной кость. Именно к ней прикреплена выделенная кость, и при изменении родителя это изменение пе-редается дочерним костям. У любой кости может быть только один родитель (а мо-жет и не быть родителя), но сколько угодно дочерних костей.
Кстати, попробуйте выделить родительскую (черную) кость. Прежде всего, вы уви-дите, что выделение с текущей кости снялось: в MdlVis только одна кость может быть выделена. А текущая кость перекрасилась в желтый цвет, т.к. для данной она дочерняя. Кроме того, те кости, которые уже были желтыми, ими и остаются. Тут действует следующее правило:
Дочерняя кость моей дочерней кости - тоже моя дочерняя кость=).
Зато теперь как родительская отмечена уже другая кость. Выделим теперь ее: дочерних костей станет еще больше. В большинстве случаев, двигаясь от родителя к родителю, можно найти такую кость, по отношению к которой все (или почти все) другие кости - дочерние. (В модели гарпии это сделать нелегко, т.к. несколько кос-тей имеют одинаковые координаты):

Это - т.н. корневая кость (прослеживается аналогия с каталогами файлов). Обычно в ее имени присутствует слово "Root".
Кстати, при попытке выделить кость можно часто столкнуться с ситуацией, когда две (или более) кости полностью накладываются друг на друга. Тогда для их выбора можно воспользоваться списком на панели инструментов. Если выбрать какую-либо кость из этого списка, то она сразу станет выделенной. Просмотрите этот список. Вы можете увидеть, что разработчики моделей обычно дают костям осмысленные имена. Например, если в имени кости присутствует строка "arm", то эта кость как-то связана с рукой модели (в случае гарпии - с крылом). Суффиксы "_r" и "_l" будут указывать на левое и правое крылья соответственно.
К сожалению, в моделях TFT моделисты Blizzard отступили от этой традиции, да-вая костям на редкость бессмысленные имена (а то и просто номера). Это, конечно, немного усложнит нам жизнь.

ПРИКРЕПЛЕННЫЕ ВЕРШИНЫ

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

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

.
Итак, выделите какую-нибудь вершину. При этом на панели инструментов появит-ся полоса прокрутки. Прокрутив ее, можно в самом низу увидеть список костей:

Причем если выделено несколько вершин, то в этот список попадет любая кость, которая непосредственно (без помощи потомков) влияет хотя бы на одну из выделенных вершин.
Когда нужные вершины выделены, их можно присоединить к кости. Зачем? Дело в том, что это сильно меняет анимацию.
Сейчас мы попробуем сделать так, чтобы гарпия трясла лапами во время полета (анимация Walk - 1).
Итак, надеюсь, вы выбрали анимацию Walk-1? (Если нет, то кликните по кнопке <список анимаций> и выберите нужную).
Теперь выбирайте кость mane4 (проще всего это сделать с помощью списка костей - там их имена отсортированы по алфавиту). Эта кость управляет движением: Че-го? Хвоста? Оперения спины? Или это у гарпии шлейф волос такой? Вообще-то слово <mane> переводится как <грива>, но какая грива может быть у гарпии? В об-щем, когда выделите нужную кость, посмотрите, на что она влияет:

я бы сказал, что это все-таки хвост (он находится между крыльев на спине, и очень длинный). Если вы просматривали анимацию Walk-1, то знаете, что в процессе по-лета этот хвост сильно дергается (вверх/вниз) на протяжении всей анимации. Итак, если мы присоединим лапы к кости хвоста, то их вершины начнут повторять все его движения (с небольшими вариациями, т.к. на них еще и свои собственные кости влиять будут). Значит, жмем кнопку

Теперь нужно присоединить их к кости. Это осуществляется с помощью инстру-мента

. Нажатие на эту кнопку присоединяет выделенные вершины к выделенной кости. Нажимаем эту кнопку: И видим странную картину:

, и целостность лап восстанавливается. Теперь, если просмотреть анимации, видно, что гарпия как-то нелепо дергает лапами в такт движениям хвоста. Это смотрится довольно глупо. Причем эти движения появляются не только в анимации Walk-1, но и вообще на всех ани-мациях!
Вывод: с присоединением костей нужно работать очень осторожно: измене-ния распространяются на ВСЕ КК и ВСЕ анимации модели.
Разумеется, вершины можно и отсоединять от кости. Для этого вершины, подле-жащие отсоединению, нужно выделить, после чего нажать кнопку

. Отсоединить можно только те вершины, на которые влияет несколько костей. Если на вершину влияет только одна кость, то вначале нужно присоединить ее к другой кости, а уж затем отсоединять от данной.

Читайте также: