XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Желтая пресса: обучающие статьи
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Результаты опроса: Продолжать ли мне работу над статьей?
Да, она должна быть дописана до конца. 84 96.55%
Нет, и этого хватит. 3 3.45%
Голосовавшие: 87. Вы еще не голосовали в этом опросе

 
WebSter
Товарищ Mechanicus
offline
Опыт: 86,111
Активность:
ВНЕЗАПНО мой подарок себе на день рождения

Введение

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

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

В этой статье я буду говорить об анимации и её аспектах, и для этого нам понадобятся только две программы:

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

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

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

Они обозначают номера копий-моделей в папке «Tech-priest» из архива с примерами, приложенного к статье. Нумерация идёт в формате «v#-##», где «#.##» - является номером в диапазоне чисел, указанных в скобках.

Этап I: оснастка скелета

Теория

Первое, с чего начинается каждая анимированная модель - это скелет. Здесь могут оказаться полезны хоть какие-нибудь познания в анатомии, например, чтобы определить, где должна находиться кость, отвечающая за движения нижней челюсти.
Скелет может состоять из множества костей, но для основных анимаций гуманоида в WarCraft III понадобится как минимум 16. На изображении 1.1 эти кости показаны синими, красными и жёлтыми кружками. Красное - правое, синие - левое, жёлтым обозначен осевой скелет. Как правило, между названиями левых и правых костей отличие лишь в префиксе буквы "L" или "R", или слова "Right" или "Left". Серые объекты - дополнительные кости, используемые в частных случаях, и хелперы (помощники).
Примечание: Helper (помощник) - это кость, к которой не присоединены вершины.
Линиями показаны зависимости костей, для ног они расположены в порядке от пальцев стопы (Bone_Toes) до кости, отвечающей за бедро (Bone_LegUp); для рук в порядке от хелпера Weapon до плечевого пояса (Bone_ArmUp). Родительские кости ног крепятся к тазу (Bone_Pelvis), а кости плечей и кость головы (Bone_Head) к груди (Bone_Chest). Эти осевые кости никак друг от друга не зависят, но как правило крепятся к хелперу Root (Bone_Root), который используется для передвижения всей модели, например, при прыжке, или вращения, как при перевороте. За оружие обычно отвечает кость Bone_Weapon, но могут встречаться и другие названия (например, в модели лесного тролля за топоры отвечают кости Axe1 и Axe2).
Вообще, никто не ограничивает вас в названии ваших костей, но правильные названия помогают в понимании и облегчают процесс анимирования модели.
Важно: располагать кости следует так, чтобы они попадали в место сгиба, при повороте той части тела, за которую отвечают, именно поэтому, например, Bone_Head должна находиться около середины или ближе к основанию шеи.

1.1 (вид спереди)

На картинке 1.2 вы можете видеть положение основных костей во время одной из анимаций.

1.2.

Что касается скелета портрета, то тут основополагающими костями будут Bone_Chest, Bone_Head и кости, отвечающие за нижнюю челюсть и мышцы верхней (так как сама кость верхней челюсти неподвижна). Но для правдоподобности движений и выражения эмоций следует использовать ряд других костей. Например, отвечающих за брови, щёки, веки, уголки рта, и т. д.
Изображение 1.3 показывает правильное расположение костей портрета моего орка-снайпера, обратите внимание на положение кости, отвечающей за нижнюю челюсть.

1.3

Что касается оснастки скелета для животных, предметов и прочего, то тут всё аналогично, нужно лишь чётко себе представлять, что к чему должно крепиться и как должно двигаться.
Вот пример скелета (62 кости) хищного растения:

1.4

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

Итак, пришло время попрактиковаться. Я, для примера, вытащил модель техножреца (tech-priest) из «Warhammer 40.000 Dawn of War: Soulstorm» и буду сейчас делать скелет, а потом и анимации именно для него.
Примечание: есть определённые весьма сложные способы конвертации из Warhammer 40.000 с одной или несколькими анимациями, но я пока не углублялся в эти премудрости, да и это больше относится к конвертации, нежели к анимированию.
Совет: если во время каких-либо операций Mdlvis выдаёт ошибки типа «Access Violation», перезапустите программу. На всякий случай также можно предварительно пересохранить модель в другой файл.
Я уже импортировал в Mdlvis модель техножреца и назначил все необходимые текстуры и материалы:

1.5

Переходим в Редактор анимаций (F3) на вкладку Скелет. Скорее всего, в модели-болванке, на основе которой вы делали свою модель, уже есть одна или несколько костей, советую оставить только одну, если их несколько, и переименовать в Bone_Root.
Создать кость можно простой командой через главное меню:
Создать\Кость (Ctrl+B)
Обратите внимание, кость имеет название bone_new0, все последующие новые кости будут иметь такие же имена, за исключением номера, который будет последовательно увеличиваться. Новая кость также не имеет прикреплённых вершин, и поэтому пока является хелпером.

1.6

Пусть наша первая новая кость будет отвечать за голову персонажа.
Отключим видимость ненужных поверхностей и передвинем кость к середине шеи. Теперь нам надо выделить вершины, которыми будет управлять данная кость.
Иногда нахождение некоторых вершин требует изрядной сноровки, и приходится использовать различные виды, «бегать глазами по рёбрам» от одной вершины до другой, а иногда даже выбирать вершины наугад, а затем исключать ненужные.
Выделив вершины, удостоверьтесь, что нужная кость тоже выделена, и нажмите кнопку Пересвязать вершины (п. 1 на 1.7), именно пересвязать, так как пока все кости были автоматически привязаны к исходной кости, в нашем случае это Bone_Root.
Заметьте, тип объекта изменился на кость , а количество связанных вершин теперь выражается натуральным числом, отличным от нуля (п. 2 на 1.7).
И немного об индикации вершин: чёрными становятся вершины, непосредственно привязанные к выделенной кости (а когда кость не выделена, её имя отображается в "Списке костей, влияющих на выбранные вершины" на правой панели Mdlvis), а серыми – вершины, зависимые от выбранной кости посредственно, т. е. через другие дочерние кости-посредники.

1.7

Примечание: если вершины оказываются бесхозными, т. е. не присоединены ни к одной кости, иногда Mdlvis автоматически создаёт кость bone_null и привязывает к этой кости бесхозные вершины.
Переименуем нашу кость в соответствующее ей название: Bone_Head.
Теперь создадим кость, отвечающую за торс. Согласитесь, немного неудобно постоянно после создания кости двигать её из нулевых координат, к счастью, есть возможность избавиться от этого неудобства. Для этого, мы сначала выделим нужные вершины, а потом уже создадим кость. Она появится в середине скопления точек, но может и отклониться в сторону области, где вершин ощутимо больше.
Создание кости после выделения вершин (п. 1) и место образования новой кости (п. 2):

1.8

Теперь пересвяжем выделенные вершины с костью, передвинем её в место сгиба (область пресса) и переименуем в Bone_Chest.
Примечание: названия Bone_Head и Bone_Chest очень важны, так как некоторые триггеры используют кости с таким названием. Для зданий также важна кость Bone_Turret, которая отвечает за крутящуюся турель, как, например, в модели орудийной башни.
Если бы мы сейчас перешли к анимированию, то обнаружили бы, что при перемещении/повороте/масштабировании кости отвечающей за торс, все вершины, зависящие от Bone_Head даже не шелохнутся, хотя должны, ведь анатомически голова присоединена к туловищу шеей и зависит от его перемещения.
Исправляется это созданием зависимости одной кости от другой. Для того, чтобы сделать кость Bone_Head зависимой от Bone_Chest, иначе говоря, сделать кость Bone_Head дочерней Bone_Chest, выделим Bone_Head и используем инструмент "Связывание объектов" (п. 1 на 1.9). Выберите кость, к которой вы прикрепляете будущую дочернюю кость (п. 2 на 1.9) и нажмите кнопку "Завершить связывание" (п. 3 на 1.9).
Теперь кость Bone_Head (дочерняя) привязана к Bone_Chest (родительская), т. е. будет в первую очередь повторять все движения родительской кости, например, при повороте туловища на 90 градусов, голова будет глобально повёрнута на столько же градусов, но относительно туловища своё положение не изменит.
Определить привязанность кости достаточно просто, жёлтыми кубами отображаются дочерние кости (п. 4 на 1.9), а чёрными – родительские (п. 5 на 1.9).

1.9

Теперь для вас не составит труда оснастить остальной скелет вашей модели, но помните несколько важных правил:
  1. Следите, чтобы одни и те же вершины не были одновременно присоединены к нескольким независимым друг от друга или не имеющим общего родителя костям. Иначе могут быть известные многим баги с растяжением и масштабированием при вращении или перемещении.
  2. Не оставляйте вершины "бесхозными" – всегда присоединяйте их к какой-либо кости. Буквально за неделю до завершения этой статьи я встретился таким багом, что в модели одного пользователя нашего форума не было видимых костей, но создалась уже упомянутая bone_null, которая каким-то образом стала невидимой для w3me, а Mdlvis вообще вылетал при входе в редактор скелета. Решить проблему помогла оптимизация в Mdlvis, создание новой кости в w3me и удаление сбоящей bone_null через блокнот.
  3. После создания кости в выделенных вершинах не обращайте внимания на красный куб в точке начала координат – это обманка, как бы признак того, что созданная кость была перемещена оттуда.
  4. При клонировании объекта (Создать\Клонировать объект (Ctrl+V)), клон создаётся в координатах идентичных координатам клонируемого объекта и выделяется автоматически.
И один совет: пока не создавайте точки крепления (аттачи), они могут мешать во время создания анимаций, а детальнее мы разберём их в конце статьи.
Вы также можете проверять правильность прикрепления вершин и скелетных связей на тестовых (лучше однокадровых) анимациях, если вы уже знакомы с редакторами "Анимки" и "Движение" (1.10).

1.10

Ещё следует отметить такое свойство объектов, как "Синфазность". Поставив флажок с таким названием, вы делаете объект синфазным, т. е. постоянно повёрнутым "лицом" к игровой камере. Этим самым "лицом" определяется поверхность, обращённая в положительную сторону координат по оси X:
» Окно "Иерархия"
Я думаю, немного информации об этой опции не помешает.
По команде "Вид\Иерархия (H)" можно вызвать окно "Иерархия" (1.0.1).
В нём отображаются все кости и другие объекты скелета (п. 1 на 1.0.1). Чтобы видеть собственно их иерархию, нужно поставить галочку в соответствующем поле, после этого слева от иконок объектов появляются иконки папок (п. 2 на 1.0.1), открытая папка показывает родительскую кость с нижележащими дочерними, а закрытая, соответственно, кость без выпадающих дочерних (п. 3 на 1.0.1). Открывать/закрывать папки можно нажатием, как ни странно, кнопки "ОК" внизу окна или двойным кликом левой кнопкой мыши по объекту.

1.0.1

Судя по всему, окно "Иерархия" еще не доработано Алексеем, неудобно и мало чем полезно для редактирования скелета, так как единственное, что в нём можно сейчас сделать – это переименовать объект, и то при наборе текста горячие клавиши остаются активны, т. е. при написании, например, буквы "т" ввод текста прекратится, и на модели отобразятся нормали. Но это моё субъективное мнение.
Полнофункциональным аналогом такой иерархии является Редактор узлов в War3 Model Editor.
Вот, какой скелет получился у меня:

1.11

В нём 42 кости и 1 помощник.
Связи между костями можно просмотреть, используя команду:
Вид\Объекты\Скелет (1.12)

1.12

На этом оснастку скелета можно считать законченной.

Этап II: костное анимирование

Теория

С чего начать этот важнейший этап в становлении модели? С кнопки "Создать" – скажут многие и будут правы, но это уже практическая часть анимирования, мы же начнём с продумывания и представления анимаций в своей голове и вне её, хотя многие опытные моделлеры, умеющие работать с анимациями делают это прямо во время основного процесса, не отвлекаясь от создания представляемого.
В первую очередь подумайте над концепцией анимаций, их характерности, необычности или наоборот, похожести на какие-либо другие. Может быть, ваш персонаж будет двигаться как ветер, а может лениво переставлять лапы? Знаете только вы. Попробуйте обрамить эти представления рамками анимаций WarCraft'а, а если вы еще и хорошо рисуете, можете нарисовать эскизы каких-нибудь моментов движения. Продумайте время каждой анимации, особенности движения костей, частиц, всего реализуемого, что только взбредёт в голову, и соедините в целостную картину.
Бывает, что представить анимацию в окне того самого Mdlvis'а довольно сложно, тогда, если вы делаете гуманоида, можно попробовать проверить представляемые анимации на самом себе, можно даже перед зеркалом, отметить положение собственных костей, а если под рукой есть секундомер, то и точно отсчитать время всей анимации и каждого движения в отдельности.
Но помните, что как у WarCraft'а, так и у Mdlvis'а есть определённые ограничения, и не уходите слишком далеко от суровой игровой реальности.
Получилось? Представили? Теперь немного о технической части.
Анимации можно разделить на 6 типов: костные анимации, анимации поверхностей, анимации материалов, анимации текстур, анимации света и частиц. Последние мы разбирать не будем, так как это отдельная большая тема, по которой на нашем сайте есть статьи.
  • Костные анимации основаны на движении костей, помощников, точек крепления и прочих объектов. Их движения обеспечиваются созданием ключевых кадров, или просто КК, в определённых временных промежутках анимации (на линейке кадров), а Mdlvis уже сам, в зависимости от выбранной интерполяции движения, строит перемещение, вращение и масштабирование костей.
    Костные анимации бывают локальными (обычными) и глобальными; первые работают на определённом временном промежутке, т. е. локально, а глобальные отличаются тем, что проигрываются постоянно, даже вне локальных, и выключить их ни коим образом нельзя. Кость, задействованная в глобальной анимации, невозможно переместить, повернуть или масштабировать в любой другой анимации.
  • Анимации поверхностей делают возможным мигание, изменение цвета, создание прозрачности или непрозрачности для определённой поверхности (Geoset).
  • Анимации материалов дают возможность управлять прозрачностью определённых слоёв или всего материала в целом, а также сменой ID текстур материала, как, например, у водного элементаля.
  • Анимации текстур позволяют перемещать, вращать и масштабировать текстуру не меняя при этом UV-развёртку модели или поверхности.
  • Анимации света позволяют анимировать цвет, интенсивность, видимость и другие характеристики источника света.
Последние три типа можно создавать и редактировать только в War3 Model Editor, анимации поверхностей можно создавать и в Mdlvis’е, но это довольно неудобно, а костные анимации наоборот, можно сравнительно без труда делать в Mdlvis'е, в то время как w3me располагает лишь текстовым средством для установки положения костей в пространстве.
Теперь перейдём к практике.

Практика

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

Костная анимация (15-30)

Пожелаем себе удачи в этой нелёгкой части и перейдём в Редактор анимаций (F3) на вкладку Анимки.
Изменения интерфейса состоят в замене координат и инструментов редактирования настройками анимации (п. 1 на 2.1) и в появлении линейки кадров (п. 2 на 2.1).
Рассмотрим характеристики анимации. В выпадающем меню "Текущая анимация" (п. 3 на 2.1) отображаются все имеющиеся костные анимации, как локальные, так и глобальные. Локальным анимациям в отличие от глобальных можно задавать имена, глобальные же именуются номером кадра, являющегося последним в анимации. Иначе говоря, название глобальной анимация – это её длина. Когда глобальная анимация выбрана, её название выделяется красным цветом.
Далее идут параметры анимации:
  • Однократность (п. 4 на 2.1) определяет, как проигрывается анимация после отдачи команды: один раз, или непрерывно до окончания действия. Наверняка те, кто работал с триггерами, сталкивались с тем, что после отдачи команды на триггерное воспроизведение анимаций, некоторые анимации воспроизводятся непрерывно, а некоторые только один раз. Это и есть следствие включения или отключения этой опции. В w3me она управляется флажком в левом нижнем углу окна характеристик анимации (последовательности) "Не циклическая", т. е. не повторяющаяся, однократная. Используется обычно в атаках (Attack), анимациях смерти (Death), рождения/постройки (Birth), трансформации (Morph), разложения/вознесения (Decay, Decay Flesh, Decay Bone, Dissipate), различных Spell'ах и в прочих анимациях, которые требуют однократного действия.
  • Применить редкость (п. 5 на 2.1), если поставить здесь галочку, то анимация приобретает редкость, т. е. то, как часто она может быть проиграна. Используется она, как правило, в различных Stand'ах (кроме простого (первого), т. е. Stand 2 и далее), атаках (аналогично Stand'ам, нумерация со 2-ой) и прочих анимациях, имеющих разные вариации. В среднем для редкости используются значения от 2 до 5. В w3me этот параметр обозначен как "Частота".
  • Указать скорость (п. 6 на 2.1)
  • Интервал кадров (п. 7 на 2.1) определяет длину анимации, т. е. кол-во кадров входящих в неё, и её положение на линейке кадров. Определяется начальным и конечным кадрами.
  • Кнопка Создать (п. 8 на 2.1) отвечает за создание локальных анимаций.
  • Кнопка Глобальная(п. 9 на 2.1) создаёт глобальную анимацию. В случае с глобальной анимацией единственной её характеристикой является конечный кадр, начальным определяется нулевой, так как важна только длина, положение глобальной анимации на линейке кадров роли не играет, ведь "глобалки" проигрываются постоянно. Также для глобальных отсутствуют все остальные характеристики локальных анимаций.
  • Кнопка Удалить (п. 10 на 2.1) удаляет любую костную анимацию.
Важно: удаление данной кнопкой лишь "косметическое", т. е. ключевые кадры остаются на своих местах, а удаляется лишь метка анимации.
Теперь рассмотрим линейку кадров:
  • Непосредственно линейка (п. 11 а 2.1), на ней отображаются КК в виде синих полосочек. Она меняет свою кадровую длину в зависимости от выбранной анимации, т. е. если выбрана анимация с интервалом кадров от 1000 до 4000, то самым левым кадром на линейке будет 1000-ный, а самым правым 4000-ный. Между ними находятся 9 условных промежуточных делений, разбивающих анимацию на 10 равных частей. По линейке кадров можно перемещаться мышкой и с помощью поля ввода кадров (п. 13 на 2.1).
  • Кнопка "Проиграть анимацию" (п. 12 на 2.1), как вы уже догадались по её иконке, проигрывает/останавливает проигрывание анимации.
    И вот тут нас встречает первый баг: если во время проигрывания анимации перейти в Редактор вершин (F1) или нажать кнопку "Открыть", то кнопка проигрывания анимации перестаёт работать, изменяя иконку на квадрат, при этом не важно, открыли ли вы другую модель, или нажали "Отмена".
    Баг исправляется перезапуском Mdlvis.
  • Поле ввода кадров (п. 13 на 2.1) служит также для перемещения по линейке кадров, только здесь можно с клавиатуры ввести номер кадра, или использовать маленькие кнопки "вверх-вниз" (подразумевается следующий-предыдущий кадр) справа от поля ввода.
  • МКИ (п. 14 на 2.1) – межкадровый интервал, эта функция определяет скорость проигрывания анимации. Если поставить галочку в это поле можно редактировать эту скорость в неких пунктах. 16 – реальная скорость, т. е. та, при которой анимация проигрывается с той же скоростью, что и без галочки на МКИ. Аналога этой функции в w3me нет.

2.1


Если вы помните, в этой статье описывается работа с двумя программами: Mdlvis и War3 Model Editor. Что ж, теперь разберём те же характеристики, но на примере второй программы.
Чтобы работать с характеристиками анимаций, в w3me существует два "менеджера": Менеджер последовательностей (п. 1 на 2.2), отвечающий за характеристики локальных анимаций, и Менеджер глобальных последовательностей (п. 2 на 2.2), отвечающий, соответственно, за характеристики глобальных анимаций. То есть, в отличие от Mdlvis’а, здесь работа с локальными и глобальными анимациями разделена.

2.2

Перейдём в Менеджер последовательностей. Здесь мы видим список имеющихся анимаций. Редактировать их характеристики можно, кликнув по имени нужной анимации два раза левой кнопкой мыши или кликнув один раз правой кнопкой и выбрав пункт "Редактировать".
Теперь вы увидите средних размеров окно, имеющее в себе ряд характеристик.
  • Название анимации (п. 1 на 2.3).
  • Интервал (п. 3 на 2.3) – аналог Интервала кадров Mdlvis’а.
  • Частота (п. 4 на 2.3) – аналог Редкости.
  • Скорость движения (п. 5 на 2.3)
  • Флажок (галочка) Не циклическая (п. 7 на 2.3) – аналог Однократности.
  • Пункты 2 (Минимальная и Максимальная границы) и 6 (Радиус границ) трогать не нужно, они определяют пространственные границы модели. Устанавливаются при расчете границ, пункт меню:
Редактировать\Рассчитать границы
Для того, чтобы работать с характеристиками глобальных анимаций, перейдём в Менеджер глобальных последовательностей.

2.3

В War3 Model Editor’е, в отличие от Mdlvis’а, названия глобальных анимаций генерируются случайным образом при каждом запуске, но при этом в названии всегда есть префикс "GlobalSequence" (п. 8 на 2.3).
Характеристика у "глобалок" только одна – Длительность (п. 9 на 2.3).
Просмотр анимаций в w3me происходит через Контроллер анимации:
Окна\Контроллер анимации
У такого контролера есть как ряд достоинств, так и ряд недостатков.
Поговорим о достоинствах, во-первых, этот контроллер позволяет проигрывать анимации в 3-х разных режимах: Default Loop (Стандартный повтор), Always Loop (Постоянный повтор) и Never Loop (Без повтора).
Стандартный повтор основывается на Однократности/Цикличности анимации, принцип действия остальных понятен из названия.
Недостатки же состоят в том, что никак нельзя регулировать скорость анимации (в Mdlvis’е для этого есть МКИ), и остановить аниму тоже не выйдет. Хотя я-таки нашёл хитрый способ: если нажать во время проигрывания анимации клавишу Alt, то произойдёт переход в главное меню, и проигрывание анимации остановится, правда покрутить модель вы не сможете: в таком режиме активны только клавиши стрелок, Enter и Esc. Ну и еще один недостаток в отсутствии линейки кадров и невозможности по ней перемещаться.

На этом часть ознакомления с интерфейсом работы с анимациями мы закончим и перейдём к созданию нашей первой "анимки" в Mdlvis’е.
Откроем нашу модель и перейдём в Редактор анимаций (F3).
Первой анимаций у нас будет традиционно Stand. Нажмите на кнопку Создать и переименуйте вашу анимацию. Теперь уберём все лишние галочки, так как для анимации Stand нам не понадобится ни однократность, ни редкость, ни скорость движения. Установим интервал кадров.
Важно: никогда не используйте нулевой кадр в костных анимациях! В этом кадре формируется скелет, и если делать анимацию с него, могут возникнуть серьёзные проблемы в Редакторе скелета, например, двоякость кости: выделяете её в одном месте, а она оказывается в совершенно ином. Однако глобальные анимации являются исключением.
Я взял интервал с 1000 по 4000 кадр.
Важно: 1 секунда = 1000 кадров.
Теперь перейдём на вкладку Движение. На экране снова отобразятся кости и прочие объекты, при этом внизу осталась линейка кадров, и изменились инструменты редактирования. Осталось только выделение, перемещение, вращение и масштабирование. Именно с помощью них мы и будем анимировать нашу модель.
Перейдём в начальный кадр и начнём устанавливать положение всех костей модели. Вот, что получилось на этом этапе у меня:

2.4

Первым делом при создании новой анимации следует установить начальный и конечный (если вы уже определились, что в нём будет) КК.
Используем команду "Копировать кадр" (Кадры\Копировать кадр (C)), перейдём в 4000-ный кадр (у вас, скорее всего, свой конечный) и вставим кадр (Кадры\Вставить (Ctrl+V)).
Совет: вы также можете копировать целые интервалы кадров...
» ...следующим образом
  1. Выберите анимацию, из который вы будете копировать необходимый вам интервал.
  2. Перейдите на вкладку "Движение".
  3. Зажав Shfit, выберите мышью нужный интервал на линейке кадров.
  4. Кликните правой кнопкой мыши прямо по нему и из контекстного меню выберите пункт "Копировать" (Ctrl+C).
  5. Перейдите на вкладку "Анимки", выберите ту анимацию, в которую вы хотите вставить выбранный ранее интервал кадров и затем снова перейдите на вкладку "Движение".
  6. Выберите кадр, который будет своеобразной точкой отсчета для вставляемого промежутка кадров.
  7. Нажмите правой кнопкой мыши по линейке кадров и выберите пункт "Вставить" (Ctrl+V).
Пользуясь выделением интервалов, вы можете выполнять и другие операции, например, удаление КК.
Очень сильно помогает во время анимирования возможность отображать КК только одного контроллера выделенной кости. Управлять этим можно с помощью галочки "Высветить КК" (2.5), но поставить эту галочку вы сможете только тогда, когда будет выделена нужная кость и активен один из «инструментов» (точнее – контроллеров: Перемещение, Вращение, Масштабирование), а также кость должна иметь как минимум 1 ключевой кадр, связанный с использованием соответствующего инструмента (контроллера). Иногда нужно выделить инструмент еще раз, чтобы галочка отобразилась.

2.5

Следите за начальным и конечным КК у всех костей, которые вы вводите в анимацию! Когда они задействуются в первый раз, велика вероятность, что якобы установившейся (т. е. выделившийся синим) начальный или конечный кадр какой-нибудь кости, после перехода в другой и произведения действия над костью, оказывается "пустышкой" и его нужно создавать снова.
Итак, закончив с начальным и конечным кадрами, перейдём в середину линейки кадров (у меня это кадр 2500) и изменим положение костей на нечто, соответствующее глубокому вдоху (хотя может и выдоху, как пожелаете).
Совет: вводите в анимацию как можно больше костей – это сделает анимацию более реалистичной и жизненной, но будьте внимательны: следите за ключевыми кадрами этих костей. Порой мелкое движение в середине анимации, когда кость получает контроллер впервые, остаётся незамеченным в начальном и/или конечном кадре, в связи с чем, нужного движения не происходит.
Важно: не следует вращать кость в одном КК более чем на 90 градусов! Иначе вращение будет рассчитываться неверно, и вместо вращения в одну сторону, ваша кость может начать крутиться в другую.
Вот такое положение костей получил я:

2.6

Теперь просмотрите анимацию. Багов скорее всего не будет, но даже если вы сделали всё правильно, могут быть резкие сдвиги костей сразу после (и/или до) определенных КК. Можно попытаться удалить ключевой кадр и создать/скопировать заново, либо произвести эту операцию со следующим за ним, но часто это не помогает, тогда достаточно скопировать КК, возле которого образовался сдвиг, в кадр, в котором этот сдвиг происходит.
Теперь проверим анимацию в w3me. Тут-то и вскрываются большинство багов. Так уж сложилось, что Mdlvis отображает далеко не все возможные баги, и w3me здесь как настоящий "спаситель", хотя и он, бывает, оказывается неправ.
  • Итак, просмотрев анимацию, вы можете заметить мгновенные переходы из одного КК в другой (как правило, начальный или конечный), в подавляющем большинстве случаев это происходит из-за отсутствия начального или конечного кадра (если это именно так, то в Mdlvis’е этих багов вы не увидите). Запомните "сбоящую" кость и еще раз внимательно проверьте её КК со стоящей галочкой "Высветить КК". Если одного из них не оказалось, просто скопируйте другой, то же самое можно делать если нет обоих, так как копирование неключевого (не подсвеченного синим) кадра не возбраняется.
  • Еще один распространенный баг часто проявляется после использования инструмента Перемещение - кость на короткий период сдвигается с места и возвращается обратно в области одного из КК (в Mdlvis’е этого бага быть не должно!). Иногда этот баг проявляется только при постоянном повторе. А происходит он из-за того, что по вине Mdlvis’а кадры перепутываются местами, это можно заметить и исправить только в w3me, для этого найдите сдвигающуюся кость, в Редакторе узлов кликните на кость ПКМ и выберите пункт Редактировать узел. В появившемся окне нажмите на кнопку "Перенос" и просмотрите кадры. Скорее всего, вы увидите похожую ситуацию:

2.7

Один из кадров (у меня это кадр 1000) почему-то оказался после другого (у меня 2500), хотя второй должен явно следовать после первого. Это и есть причина бага. Просто поставьте кадры на свои места:
1000: { 1.59721, 4.17233e-007, 0.277752 }
2500: { 2.39021, 4.91738e-007, -1.68143 }
4000: { 1.59721, 4.17233e-007, 0.277752 }
5000: { 1.59721, 4.17233e-007, 0.277752 }
5750: { 1.59721, 4.17233e-007, 0.277752 }
10000: { 1.59721, 4.17233e-007, 0.277752 }
10999: { 1.59721, 4.17233e-007, 0.277752 }
11000: { 1.59721, 4.17233e-007, 0.277752 } 
И нажмите ОК.
Внимание: при использовании War3 Model Editor 1.05 в окне редактирования узла никогда не нажимайте кнопку Поворот! Все значения будут сброшены, даже если вы нажмёте Отмена. Хотя с вращением багов почти не бывает, за исключением использования сплайновой интерполяции контроллера, но и они случаются; для работы с ними используйте w3me 1.07 по той же схеме, что и с перемещением. В этой версии баг со сбросом значений вращения отсутствует. Подробнее про этот баг.
Теперь сдвиг должен исчезнуть. Если нет, то либо этот баг присутствует в движении другой кости, либо ошибка заключается в другом (см. ситуации выше).
Если подобные баги не исправляются никаким образом (а такое бывает), проверьте модель в World Editor'е или непосредственно в игре – возможно, багов не будет, т. е. причиной его является несовершенность w3me, всё-таки он не WarCraft III.
Что ж, теперь создание вашей первой анимации можно считать законченным, поздравляю!

На этапе создания анимации Stand мы фактически использовали "технику уточнения", только в очень лёгком примере. Ведь мы сначала установили начальный и конечный кадр, а потом перешли в середину между ними и изменили положение костей, а я к тому же потом переходил в 1/4 и 3/4 линейки кадров, чтобы уточнять положение костей плаща. Это довольно распространённая техника, заключающаяся в уточнении положения костей, между определёнными КК, для более точных и верных движений, она также описывается в статье, автором которой является KO3bMA, вместе с описанием распространённых багов и способов их решения.
Но часто эта техника не подходит, если необходимо описать динамичную анимацию, которая придумывается "в движении", т. е. когда довольно сложно представить позицию костей в ключевых кадрах, или, к примеру, конечный кадр не совпадает с начальным (Death), и проще создавать кадр за кадром, чем уточнять их позиции (но помните о комбинировании техник, т. е. после создания КК таким образом, можно уточнять кадры между ними). Такую технику можно назвать "поступательной".
Эти две техники являются основополагающими, и, в принципе, только они и используются «в массах».
------
Воспользуемся "поступательной" техникой и создадим еще одну анимацию, Stand 2.
Здесь движения техножреца будут сложнее, чем в предыдущей анимации, они будут включать в себя поворот туловища вправо почти на 80⁰ с отставкой правой ноги и поднятием правой руки (без учёта мелких движений), секунду осмотра и возвращением в исходное положение.
Я рассчитал примерную длительность анимации для моей модели - 5 секунд, и задал интервал кадров от 5000 до 10000.
Сразу скажу, что приблизительные расчеты времени могут оказаться не совсем точными, и не стоит пытаться растянуть движения на всю длину линейки кадров, я, например, во время создания этой анимации не раз просчитывался со временем и двигал уже созданные кадры. В итоге получилось, что я просчитался с временем анимации на 2 секунды.
Создаём КК.

2.8 | 2.9

WebSter добавил:
Наверняка многим не понравится неестественная резкость движений, получающаяся возле КК, если там требуется плавность, можно попытаться её исправить, увеличивая число уточняющих КК, но можно пойти другим путём – изменить Тип контроллера, или, иначе говоря, Интерполяцию (Тип Интерполяции).

Тип контроллера (Тип Интерполяции)

Контроллер анимации - набор КК, отвечающих за какое-то единственное анимируемое свойство, например, вращение или видимость. Я уже говорил о нём, когда рассказывал про отображение КК определённых объектов.
Тип контроллера (интерполяция) определяет вычисление промежуточных значений между КК. Его можно менять. Для WarCraft III доступны 4 типа контроллеров:
  • Ступенчатый (None) - вычисление не производится, анимируемый параметр объекта не изменится, пока не встретится новый КК. Когда это произойдёт, он поменяется сразу, рывком - в то значение, которое записано в этом КК;
  • Линейный (Linear) - анимируемый параметр между кадрами меняется «линией», т. е. плавно, но без замедления около КК. Этот тип контроллера довольно распространённый, и устанавливается Mdlvis’ом по умолчанию (за исключением контроллера видимости – там Mdlvis устанавливает ступенчатый тип и оперирует только с ним).
  • Безье (Bezier) - изменение параметра описывается кривой Безье. Этот тип занимает в 1,5-3 раза больше места, чем линейный и почему-то никак не настраивается в Mdlvis’е. Зато «сглаживает» анимацию вблизи КК, делая движения более естественными и натурально выглядящими. Важно знать, что в игре Безье-вращение не работает (движения не происходят). Используется этот тип контроллера крайне редко – только в некоторых стандартных моделях WarCraft'а, скорее всего потому, что в «полевых условиях» настроить его довольно сложно, но только на первый взгляд.
  • Сплайновый (Hermite) - изменение параметра описывается сплайном Эрмита. Это самый сложный и интересный тип интерполяции, позволяющий создавать наиболее естественно выглядящие и качественные анимации, при должном умении, разумеется. Такая интерполяция весит еще больше Безье используется во многих стандартных моделях WarCraft III. Когда выбран этот тип контроллера, почти во всех КК отображается еще одна панель – «Параметры кривой», в которой можно настраивать свойства сплайна контроллера объекта в каждом КК. Однако, по неизвестным мне причинам, иногда Mdlvis отказывается отображать эту панель в некоторых кадрах. Скорее всего, это связано с недоработанностью сплайновой интерполяции для данной программы, как и писал сам Алексей.
Но тем не менее, работать с ней можно, и далее я расскажу – как.
В некоторых моделях довольно сложно наглядно проследить разницу типов контроллеров, и поэтому, я создал модель простых часов с маятником. Ведь именно на маятнике с минимумом сложностей можно увидеть действие каждой интерполяции.
Заранее замечу, что во вложениях в отдельном архиве (Interpolations.rar) есть 4 модели этих часов с суффиксами, соответствующими интерполяции, которую я использовал для движения маятника, а также модели BezierEllipseOrb.mdx и HermiteEllipseOrb.mdx, в которых показаны примеры Сплайнового и Безье-перемещения, их я буду использовать далее для углублённого изучения данных типов контроллера. Проверять их нужно в редакторе карт или игре! Так как Mdlvis не отображает некоторые баги, w3me может неверно работать со Сплайновой интерполяцией (в контроллере вращения), и только WarCraft покажет истинное положение дел, например то, что тип вращательного контроллера Безье не работает в игре (редакторе). Хотя и в w3me, и в Mdlvis интерполяция Безье отображается совершенно верно (если нет багов в КК, разумеется).
Я думаю, действия ступенчатого и линейного типов не нуждаются в больших подробностях, так как их просто нет, всё описано выше (багов, связанных именно с характерностью интерполяции, в них не наблюдалось), а вот о Безье и сплайновой интерполяциях мы поговорим подробнее.

Безье (Bezier)

Кривая Безье очень часто используется в компьютерной графике, распространяясь от векторных редакторов до создания сплайнов (как статических, так и для анимирования) в приложениях трёхмерного моделирования. И WarCraft III творение Пьера Безье не обошло стороной.
Столкнувшись с ним в Mdlvis'е, не сразу и понимаешь, как оно действует на анимацию – никаких настроек не появляется, а анимация остаётся такой же, как с и линейной интерполяцией. Видимо, Алексей еще не успел внедрить в свою утилиту эти настройки, но я, углубившись в эту тему, нашёл способ настраивать этот тип контроллера вручную и с высокой точностью. Разговор пойдёт о контроллере перемещения, потому что, как я уже говорил, Безье-вращение в игре не работает.
Главная особенность Безье для анимации в WarCraft III - сглаживание углов на линии, по которой мы перемещаем объект, и «выпуклость», т. е. углы сглаживаются не вовнутрь, а наружу, меняя саму линию, а не только её участок рядом с углом
В w3me параметры Безье в каждом КК объекта описываются 3 значениями:
2200: { 0, -1.74099, 60.3338 } | Номер КК и положение объекта в пространстве ({ x, y, z })
  InTan: { 0, 29.741, 60.3338 } | Координаты вершины входящей направляющей ({ x, y, z })
  OutTan: { 0, -29.741, 60.3338 } | Координаты вершины выходящей направляющей ({ x, y, z })
Те, кто работал со сплайнами в 3DS Max, вполне могут провести параллель с кривыми Безье, которые широко используются в нём. Направляющие (2 и 3 на 2.0.1) – это те самые две жёлтые линии с зелёными вершинами на концах. Именно они определяют характер кривой, проводимой между входящей направляющей одной вершины и выходящей направляющей другой.
Рассмотрим их подробнее. Я в 3D Studio Max создал 2 сплайна – ромб, характеризующий движение объекта по своему периметру четырьмя различными КК при линейной интерполяции и тот же ромб, вершинам которого я поставил тип Bezier Corner (входящая и выходящая направляющие независимы друг от друга, как в WarCraft'е), и, настроив их, превратил его в овал. Заметьте, вершин так и осталось 4, т. е. и в игре, движение по периметру такого овала будет тоже характеризоваться четырьмя КК.
Пункт 1 на 2.0.1 – это наша верхняя вершина. При виде спереди справа от неё будет InTan (п. 3 на 2.0.1), т. е. входящая направляющая (не забывайте, что мы рассматриваем её для WarCraft'а, и такое название вовсе не гарантировано в других областях использования кривой Безье), а слева OutTan (п. 2 на 2.0.1) - выходящая направляющая. Двигаясь против часовой стрелки, мы придём во входящую направляющую следующей вершины, т. е. везде "In" стыкуется с "Out" (по часовой стрелке) или "Out" с "In" (против часовой стрелки).

2.0.1

Как же оно действует на анимацию? Очень просто. Представим этот сплайн в виде траектории движения, где вершины – контрольные кадры перемещения (благо в 3DS Max можно без проблем использовать сплайн как траекторию). И перейдём в "Graph Editors/Track view – Curve Editor…", там найдём те параметры, которые мы анимировали, и увидим кривые (у меня это кривые перемещения по оси X и по оси Z (для WarCraft'а роль оси X будет исполнять Y)).
Вот, что мы увидим с обычным ромбом (линейная интерполяция):

2.0.2

А вот, что с овалом, полученным из ромба благодаря Безье:

2.0.3

Разумеется, углубляться в подробности этих графиков я не буду – всё-таки не о них статья, но я думаю, разница очевидна. Безье позволяет создать из ромба овал, из пары ромбов – восьмёрку и т. д., благодаря такой интерполяции можно делать как жёсткие, так и мягкие движения, сложные траектории, и всё это, обходясь минимумом КК.
Хорошо, с определением типа контроллера мы разобрались, и теперь, думаю, гораздо проще понять его работу и настройки для WarCraft III.
Я не стал придумывать какую-то особую модель и просто взял одну их стандартных игровых сфер с небольшим «хвостом» из частиц, чтобы лучше прослеживать траекторию. Повторив тот самый ромб уже в Mdlvis'е, вот, что мы увидим с линейной интерполяцией (для наглядности я добавил координаты точек и саму траекторию движения на скриншот):

2.0.4

Мы сразу видим углы, причём довольно резко выглядящие при анимации. Увидеть это можно в приложенной модели, установив типом контроллера линейный.
Теперь перейдём в Mdlvis, в Редактор анимаций на вкладку Движение, выберем кость, которую двигали и поставим тип контроллера перемещения – Безье. Пока никаких изменений заметно не будет (потому что направляющие имеют координаты, идентичные вершинам).
И вот сейчас мы подходим к самому важному и интересному.
Для настройки InTan и OutTan нам необходимо узнать координаты направляющих, и здесь, как ни странно, нам придёт на помощь Photoshop (или любой другой редактор, работающий с кривыми Безье, даже MS Word). Установив расположение анимируемой кости во всех КК, я прямо на скриншоте из Mdlvis'а провёл между ними линии, характеризующие траекторию движения (ромб), и, используя инструмент Перо (п. 1 на 2.0.5), провёл линию между двумя точками ромба (верхней и левой), таким образом создав ту самую кривую Безье, которая и должна получиться!
Примечание: в настройках инструмента Перо нужно выбирать характер "Пути" (п. 2 на 2.0.5) и тип "Перо" (п. 3 на 2.0.5), а не "Простое перо".
Изменять направляющие можно инструментом Преобразование точки (п. 4 на 2.0.5), как вместе (при нажатии ЛКМ на вершине и движения в разные стороны, не снимая нажатия), так и по отдельности (выделив сами направляющие).
После того, как вы сделали нужную вам кривую, просто на глаз прикиньте координаты направляющих (их точек), у меня это были координаты по осям Y и Z. Если вы затрудняетесь это сделать, можно попробовать создать временные вершины на этих местах прямо в Mdlvis'е и посмотреть их координаты (2.0.6)

2.0.5 | 2.0.6

В принципе, похожие операции можно было произвести в 3DS Max'е, но для этого пришлось бы переносить изображение из окна Mdlvis'а в Макс, потом строить сплайн и пр. На мой взгляд, с Photoshop'ом всё можно сделать быстрее и удобнее.
Я получил координаты { 0, -29, 60 } для OutTan верхней вершины и { 0, -35, 28 } для InTan левой.
Итак, узнав координаты направляющих, нам нужно внести их значения в КК анимируемой кости. Для этого откроем w3me, перейдём в Редактор узлов, затем найдём нашу кость и кликнем ПКМ, выбрав из контекстного меню пункт Редактировать узел. Теперь нажмём кнопку Перенос. Далее ищем требуемые КК (так как кривая строится между двумя точками) и в строках с InTan одного кадра и OutTan другого вводим координаты, которые мы определили ранее. Смело жмём ОК и любуемся (если всё сделано правильно) на получившуюся дугу. Заметьте, именно ту дугу, которую мы строили в 3DS MAx’е и Photoshop’е.

2.0.7

Основываясь на полученных знаниях, я уверен, вы без труда определите координаты оставшихся вершин, а в случае с ромбом их легко просто «угадать».
Важно: значения начального и конечного КК должны точно совпадать! Не являются исключением и значения координат направляющих.
Установив все координаты направляющих для всех КК, можно увидеть окончательный результат – тот самый овал, который мы задумывали изначально.

2.0.8

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

Сплайновая (Hermite)

Такой тип контроллера строится на основе сплайна Эрмита, который я, к сожалению, пока, кроме WarCraft'а, нигде не встречал, и то, как у него рассчитывается кривая, как она зависит от направляющих, мне в большей степени непонятно. И узнать принцип его построения без редактора кривой Mdlvis’а мне выяснить, увы, не удалось, однако, как раз этот редактор кривой и спасает положение. Единственная его проблема – неотображаемость в некоторых кадрах (в 90% случаев в конечном, бывает и/или в начальном).
И еще один главный плюс этой интерполяции для WarCraft’а – это то, что она работает для контроллера вращения. Теперь разберём её основные свойства и пути настройки в Mdlvis’е.
Интерполяция сплайном Эрмита очень похожа на Безье, но отличается менее выраженной выпуклостью, может быть даже сглаживанием углов, настройка в Mdlvis’е проходит в определённых границах, за них вы сможете выйти только вручную, с помощью w3me (1.07 для вращения), ну тут флаг вам в руки…
Итак, чтобы настроить кривую в области определённого КК определённой кости и контроллера, вам необходимо: выбрать кость (п. 1 на 2.0.9), выбрать нужный КК (п. 2 на 2.0.9), затем выбрать нужный контроллер (п. 3 на 2.0.9) и определить его тип (п. 4 на 2.0.9), установив выбор на пункте Сплайновый. Теперь у вас должна отобразиться вкладка Параметры кривой.
» Если этого не случилось…
…вы сможете «заставить» её отображаться следующим способом:
  1. Определите КК, в котором не отображаются Параметры кривой.
  2. Создайте новую локальную анимацию, интервал кадров которой захватывает сбоящий КК (например, если в анимации Stand в кадре 1000 не отображается эта вкладка, создайте анимацию New с интервалом, к примеру, от 700 до 1010). Если после нажатия на кнопку «Создать» вылетела ошибка, просто нажмите ОК, и не обращайте внимания, но можете и перезапустить вис.
  3. В новой анимации в любом кадре, кроме сбоящего, например 805, произведите движение/вращение/масштабирование для соответствующего контроллера.
  4. Теперь перейдите на сбоящий кадр, и вуаля – теперь Параметры кривой отображаются!
  5. Измените их, как вам нужно.
  6. Затем измените интервал дополнительной анимации так, чтобы сбоящий кадр больше в неё не входил, а дополнительный остался (например, так: от 700 до 999¬).
  7. Удалите дополнительный кадр.
  8. Удалите дополнительную анимацию.
Вообще отображение Параметров кривой зависит от наличия соседних КК: если они есть, то Параметры кривой отобразятся, если нет – Mdlvis не высветит их. Так что можете использовать любые альтернативы моему способу.
Интерфейс вкладки Параметры кривой (п. 5 на 2.0.9) состоит из четырёх частей: график кривой (п. 6 на 2.0.9) и три параметра, определяющие её вид - Натяжение (п. 7 на 2.0.9), Целостность (п. 8 на 2.0.9) и Наклон (п. 9 на 2.0.9).
  • График кривой представляет собой небольшой прямоугольник, в котором схематично представлен установленный сплайн. Он имеет вид выпуклости и условно разделён на две половины красной линией. Эту линию можно считать своеобразной интерпретацией ключевого кадра, для которого и устанавливается текущий сплайн. Левую часть можно считать в качестве OutTan (как показали тесты на модели с Безье при движении против часовой стрелки), а правую InTan.
  • Натяжение - один из параметров кривой, он действует как усилитель или, наоборот, снижает действие Целостности. Если же та равна нулю, то Натяжение определяет замедление вблизи КК, где -100 обозначает его отсутствие, а 100 - максимальный показатель (короткая резкая остановка в КК). Также при значении 100, все остальные параметры автоматически обнуляются. Они полностью зависят от натяжения.
  • Целостность - показатель очень похожий на "Bubble" или "Pinch", т. е. он определяет вогнутость или выпуклость обоих ветвей сплайна (на вершину не влияет). Усиливается отрицательными значениями Натяжения.
  • Наклон поворачивает ветви сплайна в одну или другую сторону, в зависимости от значения. Он как бы усиливает Целостность на одном участке и ослабляет на другом. Также усиливается отрицательными значениями Натяжения.

2.0.9

Экспериментальным путём я выяснил основные характеристики различных конфигураций Натяжения, Целостности и Наклона кривой. Я использовал только крайние и нулевые значения показателей.

Одиночные сочетания

  1. Натяжение - острее с предварительным замедлением (+100) или мягче с гладким проходом (-100).
  2. Целостность +100: небольшая выпуклость перед точкой (провал на точке); -100: аналог Линейной интерполяции.
  3. Наклон +100: мягкая выпуклость в сторону InTan.
  4. Наклон -100: мягкая выпуклость в сторону OutTan.

Сочетание Натяжение-Целостность

  1. Натяжение 100, целостность 100: обнуляется целостность >> п.1.
  2. Натяжение -100, целостность 100: резкий провал на точке => натяжение усиливает выпуклости по сторонам.
  3. Натяжение 100, целостность -100: обнуляется целостность >> п.1.
  4. Натяжение -100, целостность -100: длинные мягкие углубления по сторонам от точки с резким проходом (усиление целостности).
  5. Натяжение 0, целостность 0: гладкий проход без замедления.

Сочетание Натяжение-Наклон

  1. Натяжение 100, наклон 100: обнуляется наклон >> п.1.
  2. Натяжение 100, наклон -100: обнуляется наклон >> п.1.
  3. Натяжение -100, наклон 100: более крутая мягкая выпуклость в сторону InTan => усиление наклона.
  4. Натяжение -100, наклон -100: более крутая мягкая выпуклость в сторону OutTan => усиление наклона.

Сочетание Целостность-Наклон

  1. Целостность 100, наклон 100: выпуклость в сторону InTan с предварительным замедлением.
  2. Целостность 100, наклон -100: выпуклость в сторону OutTan с предварительным замедлением.
  3. Целостность -100, наклон 100: небольшое длинное углубление из OutTan, затем стандартный проход в InTan с предварительной резкой остановкой в точке и рывком.
  4. Целостность -100, наклон -100: небольшое длинное углубление в InTan, затем стандартный проход из OutTan с предварительной резкой остановкой в точке и рывком.

Сочетание Натяжение-Целостность-Наклон

  1. Натяжение 100, целостность 100 (-100), наклон 100 (-100): обнуляются целостность и наклон >> п.1.
  2. Натяжение -100, целостность -100, наклон -100: усиление п.17 в сторону InTan - очень резкий рывок после мягкой остановки в точке.
  3. Натяжение -100, целостность -100, наклон 100: усиление п.16 в сторону OutTan - очень резкий рывок перед мягкой остановкой в точке.
  4. Натяжение 0, целостность 0, наклон, 0: мягкое длинное замедление в точке.
Следует помнить, что сплайновая интерполяция весьма специфична, и в каждой конкретной ситуации значения кривой могут давать разные результаты.
В приложенной модели HermiteEllipseOrb.mdx вы можете увидеть и даже потренироваться с различными конфигурациями параметров сплайна для контроллера движения с уже знакомым нам овалом и сферой.
Но вернёмся к забытой нами модели маятниковых часов, ведь именно о них я говорил в начале раздела об интерполяции. На их примере мы сможем убедиться в работоспособности и качественности сплайнового типа для контроллера вращения.
Сделав анимацию маятника с помощью линейной интерполяции, я меняю её тип на сплайновый. И тут же встречаюсь с проблемами в начальном и конечном кадре, но в данном случае она исправима довольно простым путём. Так как в анимации происходит 3 движения маятника, одно из них приходится на центр анимации, и, настроив его (Натяжение: -100; Целостность: 0; Наклон: -50) я через w3me 1.07 копирую значения координат вращения, InTan и OutTan начальному и конечному кадру, при этом меняя их значения на противоположные, тем самым получая симметричную кривую, т. е. именно то, что мне и нужно (2.0.10).
Но вполне можно воспользоваться и тем методом, что я приводил выше.
0: { 0.130526, 0, 0, 0.991445 } | Копируем значения из кадра 500
  InTan: { 0.382683, 0, 0, 0.92388 } | и делаем значение X-координат
  OutTan: { 0.130526, 0, 0, 0.991445 } | противоположным.
500: { -0.130526, 0, 0, 0.991445 }
  InTan: { -0.382683, 0, 0, 0.92388 }
  OutTan: { -0.130526, 0, 0, 0.991445 }
1000: { 0.130526, 0, 0, 0.991445 } | Последний кадр должен быть равен начальному,
  InTan: { 0.382683, 0, 0, 0.92388 } | поэтому просто копируем его,
  OutTan: { 0.130526, 0, 0, 0.991445 } | изменив лишь номер КК (с 0 на 1000).

2.0.10

Теперь можно просмотреть анимацию сначала в w3me и Mdlvis’e, а затем в WarCraft 3 World Editor.
Но следует помнить, что со сплайновым типом контроллера тоже сопряжены баги, и часто исправить их бывает очень трудно.
  • Довольно распространённая ситуация, когда «на ровном месте», т. е. просто между двумя кадрами появляются странные движения, которых быть не должно. Иногда помогает пересоздание сбоящего кадра путём копирования другого и полностью вручную, иногда спасает ситуацию копирование КК и вставка на один кадр дальше, но бывает так, что и это не помогает.
    Частая ошибка в таких ситуациях: человек начинает добавлять один промежуточный кадр, потом еще один, потом еще, и в итоге вместо одного лишнего движения получаются десятки. Этого делать не надо, хотя в крайне редких случаях бывает, что и этот метод помогает.
    Одна из вероятных причин такого бага - сочетание сплайновой и линейной интерполяций. Иногда они плохо уживаются вместе, и чтобы избежать подобных вещей необходимо дочерней (иногда и родительской тоже) кости также устанавливать сплайновый тип контроллера.
  • При копировании КК со сплайновой интерполяцией после вставки значения кривой для вставляемого кадра меняются на "Натяжение: 0; Целостность: -100; Наклон: 0", а у соседних кадров просто сбиваются (кроме значений Натяжение: 0; Целостность: -100; Наклон: 0). Хотя бывает, что сбившиеся настройки дают очень даже неплохие движения. Аналогична ситуация с изменением значения контроллера (т. е. угла поворота, координат перемещения, процентов масштаба и т. д.).
  • Вообще, значение кривой "Натяжение: 0; Целостность: -100; Наклон: 0" никогда не даёт никаких багов (по крайней мере, я ни разу не встретил таковых), и его рационально использовать в забагованных местах или для промежуточных стадий в исправлении багов.
  • Не стоит доверять w3me при использовании сплайнового контроллера вращения - часто он отображает баги, которых нет, или просто не совсем корректно воспроизводит эти движения.
Использование сплайновой интерполяции, аналогично другим, доступно почти для всех контроллеров, позволяя сделать любую анимацию плавной и живой.

Здесь наше изучение интерполяций заканчивается, я надеюсь, что смог грамотно посвятить вас в это непростое дело и что вы будете хотя бы иногда пользоваться чем-то большим, нежели Linear.
Старый 17.08.2011, 01:47
WebSter
Товарищ Mechanicus
offline
Опыт: 86,111
Активность:

Глобальные анимации

Теория

Читая раздел об интерполяции, вы наверняка заметили, что в использовавшейся модели часов в анимации Stand нет ни одного КК. Странно, не правда ли? К тому же присутствуют еще 3 анимации с длительностью в одну, десять и сто секунд, в которых показаны какие-то отдельные движения. Это и есть глобальные анимации.
В самом начале теоретической части я рассказывал о разнице между локальными и глобальными анимациями. Как вы помните, так называемые "глобалки" проигрываются постоянно, и их никак нельзя выключить или остановить. Их может быть много, и при должной компоновке можно получить нужный результат куда проще и менее затратно, чем с локальными.
Как, например, и сделано в часах. Чтобы стрелки двигались более-менее реалистично, необходимо, чтобы часовая двигалась намного медленнее минутной. У меня - в 10 раз, а маятник вообще двигается всего одну секунду в то время, как часовая стрелка - сотню. Без глобалок пришлось бы устанавливать маятнику 200 КК, минутной стрелке как минимум 50. Настоящее мучение ради каких-то часов. А благодаря глобальным анимациям всё можно сделать с минимумом проблем. Один такт для маятника, один оборот для минутной стрелки и один - для часовой. После этого, всё скомпонуется в Stand'е любой длины и будет двигаться постоянно, независимо от остальных аним.
Но стоит помнить о некоторых особенностях глобальных анимаций:
  • Если вы задействуете кость в глобалке, то больше ни в каких анимациях использовать её напрямую не сможете.
  • Следите за тем, чтобы начальный и конечный кадры локальных анимаций не совпадали с КК глобальных – это чревато багами.
  • Используйте глобальные анимации разумно, так как выключить их вы никак не сможете. Их можно лишь скрыть, сделав поверхность, которая связана с костью, участвующей в глобальной анимации, невидимой.

Практика(52-53)

Мой техножрец тоже не обойдётся без глобальных анимаций. У него будет постоянно вращаться бур на механической руке, а в Death этот бур будет скрыт и заменён на неанимированный.
Создадим в Mdlvis’е глобальную анимацию, нажав на кнопку «Глобальная» в Редакторе анимаций. Устанавливая интервал кадров, как вы помните, можно указывать лишь последний кадр. Для вращения бура вполне хватит 0,4 секунды, поэтому я установил длину в 400 кадров (название анимации, соответственно, поменялось на "400").
Теперь создадим необходимые движения.
Важно: не пытайтесь копировать кадры из локальных анимаций в глобальную – они не вставятся (и не должны).

3.1

Следует помнить еще об одной важной вещи, относящейся как к локальным, так и к глобальным анимациям, если вы еще не знаете о ней:
Важно: не следует вращать кость в одном КК более чем на 90 градусов! Иначе вращение будет рассчитываться неверно, и вместо вращения в одну сторону, ваша кость может начать крутиться в другую.
Поэтому для вращения бура мне необходимо создать 5 КК: для 0, 90, 180, 270 и 360 градусов. Причём создавать их надо последовательно: копировать кадр, вставить его и добавить по нужной оси 90 градусов. Конечный кадр не нужно копировать с начального, так как итоговый поворот в 360 градусов интерпретируется верно, и багов не возникает.
Теперь можете полюбоваться результатом. Во всех локальных анимациях будет проигрываться то движение, которые вы создали в глобалке. При создании нескольких глобальных анимаций вполне возможно совпадение как длин, так и названий, но все они в равной степени будут компоноваться в локальных.
Важно: в War3 ModelEditor’е есть возможность связывать с глобалками все возможные анимации. Делается это в его типовом окне анимаций (3.2):

3.2

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

Анимации поверхностей

Теория

В моделлинге никак не обойтись без возможности скрывать и показывать что-либо в определённый момент времени, будь то поверхность, слой текстуры или частица. И, к счастью, всё это возможно как в Mdlvis’е, так и в w3me. Однако функционал последнего в этом отношении гораздо шире. Именно на его примере мы и разберем анимации поверхностей.
War3 ModelEditor, а в частности Редактор анимаций поверхности, позволяет изменять видимость и цвет, анимировать их, используя все возможные интерполяции. Изменение цвета действует как фильтр, где окрашивание становится сильнее при уменьшении яркости. Выбранный для фильтра белый цвет не влияет на итоговую картинку никак, так что, окрашивая таким образом поверхности, стоит помнить, что ярче или светлее их не сделать.
Но учитывайте, что совокупный эффект как настроек цвета, так и прозрачности зависит еще от материала и режима смешивания текстуры. Например, если текстура, используемая анимируемой поверхностью, имеет режим смешивания Additive, то установка черного цветового фильтра сделает данную поверхность полностью невидимой.

Практика(2.73)

Итак, открыв нашу модель в w3me, сначала выберем поверхность, видимость которой необходимо изменить. Это можно быстро сделать следующим образом: зажмите Ctrl и кликните ЛКМ по поверхности прямо во вьюпорте. Поверхность мигнет черным цветом (4.1) и выделится в Редакторе поверхностей (а используемый ею материал выделится в Редакторе материалов).

4.1

Запомните выделенный геосет и перейдите в:
Окна\Редактор анимаций поверхностей
В появившемся окне необходимо кликнуть ПКМ и выбрать из контекстного меню пункт Создать новый. Откроется следующее окно:

4.2

Разберем все по порядку:
  • ID (п. 1 на 4.2) – в данном выпадающем списке необходимо выбрать поверхность, к которой будет относиться эта анимация.
  • Альфа (п. 2 на 4.2) – регулирует прозрачность поверхности от нуля (полностью прозрачно) до единицы (полностью непрозрачно). Может быть как анимированной, так и нет. Известен баг w3me, когда неанимированная альфа сбивается и принимает значения вроде "0.68835", в таком случае рекомендуется ставить флажок "Анимирована" и прописывать: "0: 1" (без кавычек, естественно) – или любое другое нужное вам значение.
Работоспособность прозрачности напрямую зависит от выбранного режима смешивания у текстуры:
  • None – используются только значения 0 и 1.
  • Transparent – используются только значения 0 и 1.
  • Blend – используются все возможные значения от 0 до 1.
  • Additive – используются все возможные значения от 0 до 1.
  • AddAlpha – используются все возможные значения от 0 до 1.
  • Modulate – используются только значения 0 и 1.
  • Использовать цвет – (п. 3 на 4.2) название этого флажка говорит само за себя.
  • Бросает тень – (п. 3 на 4.2) а вот здесь – наоборот – название обманчиво. Никаких теней этот пункт почему-то не дает, а вот получить баги, поставив галочку здесь, мне удалось.
  • Цвет (п. 4 на 4.2) – в этом поле выбирается цветовой фильтр в системе RGB (красный, зеленый и синий), и на его анимациях я остановлюсь подробнее.
Поставив флажок "Анимирован" и щелкнув по кнопке "Цвет", вы увидите не слишком понятную для выбора цвета картину: так же, как в случае с другими контроллерами, перед вами будут строчки с текстом, в которые придется вписывать нужный цвет вручную. Причем насыщенность красного, синего или зеленого измеряется в пределах единицы… но и это еще не все! Цвета здесь расположены наоборот, т.е. не RGB, а BGR:
0: {B, G, R} | так при анимировании распложены цвета
Но тем не менее, вписать нужный цвет не так уж сложно: достаточно "сделать" его в каком-нибудь графическом редакторе и разделить каждое число из каналов на 255. Так стандартный оранжевый цвет из Paint’а (255 127 39) для w3meбудет следующим:
0: {0.153, 0.498, 1}
(значения округлены до тысячных)
Что касается интерполяций – здесь все работает нормально, хотя w3me часто некорректно отображает анимации цвета, сделанные с помощью Сплайнового типа контроллера. Впрочем, я не вижу особой надобности именно в нем, так как Безье прекрасно справляется со своей задачей, и можно, например, сделать переход всеми цветами радуги с помощью 3-х кадров:
1000: { 0, 0, 1 }
InTan: { 0, 0, 0 }
OutTan: {0.153, 0.498, 1}
2500: { 0, 1, 0 }
InTan: { 0, 1, 1 }
OutTan: { 1, 0.5, 0 }
4000: { 1, 0, 1 }
InTan: { 1, 0, 0 }
OutTan: { 0, 0, 0 }
На этом эксперименты с цветами можно закончить, и от анимаций поверхности мы перейдем к анимациям того, что эти поверхности покрывает, – к анимациям материалов.

Анимации материалов

Теория

Наверняка вы знаете, что в каждом материале может быть множество слоев с разными текстурами и типами смешивания, и можно регулировать прозрачность каждого слоя отдельно от прозрачности материала в целом, однако не каждый знает всех возможностей анимации этих слоев. Далее я расскажу и о них.
Как и в случае с анимациями поверхностей, здесь полноценно регулируется прозрачность, но совершенно новой возможностью является анимация ID текстуры, то есть можно динамически менять текстуры в материале. А уж с использованием такой особенности не соскучишься: различные элементали, имитация жидкостей и даже возможность вставить в вашу модель маленькое видео (по кадрам, естественно)! Именно последний вариант я выбрал для рассмотрения в этой статье.
Я заранее сделал простую модель деревянного телевизора, который и будет показывать все, что захочется, а вернее, все, на что будут текстуры.

5.1

Так что приступим к практике!

Практика (TV_version_1.mdx)

Порывшись в архивах WarCraft 3, я нашел ряд текстур, отвечающих за моргание "глаза Battle.net", и решил, что для примера они прекрасно подойдут. Путь к этим текстурам следующий:
UI\Glues\BattleNet\BattlenetWorking\
В этой папке находятся 29 текстур, которые необходимо использовать в нашей модели, так что каждую я занес в список текстур, отчего тот слегка пополнел.
Теперь перейдем в редактор материалов и установим в нужный материал первую из необходимых нам текстур, после чего необходимо установить флажок "Анимирована" и нажать на кнопку "ID текстуры". Откроется окно с одной строчкой, где в нулевой кадр прописано определенное число: в моем случае это цифра 4, хотя у вас может быть и любое другое (далее я расскажу, как же оно определяется). Ну что ж, нам-то надо начинать с нуля: пропишем в первый кадр анимации (у меня это кадр 2000) цифру 0 и далее через каждые, например, 50 кадров, будем последовательно прописывать числа вплоть до 28.

5.2

Может возникнуть вопрос, почему на изображении выше я расписал кадры до 33, но перед тем, как будет дан ответ, просмотрите анимацию, в которой вы делали смену текстур. Если у вас в модели уже были какие-то текстуры до того, как вы добавили текстуру глаза, то где-то в первых кадрах будут мелькать именно они. Все очень просто: программа с самого начала выставила цифру 4, т.к. именно это – ID первой из текстур глаза, а все предыдущие заняты другими текстурами.
Но тем не менее, бывает и так, что текстуры добавляются в разброс, и тогда их ID путаются. Чтобы узнать их номера и/или поменять их, необходимо конвертировать модель в формат *.mdl, открыть её блокнотом и найти блок, отвечающий за текстуры. В моем случае он таков:
Textures 33 {
	Bitmap {
		Image "Buildings\Human\TownHall\TownHallCastleKeep.blp", | ID этой текстуры – 0, т.к. нумерация всегда начинается с нуля.
	}
	Bitmap {
		Image "Textures\Goldmine.blp",| 1
	}
	Bitmap {
		Image "tv_texture.blp",| 2
	}
	Bitmap {
		Image "Textures\Doodads0.blp", | 3
	}
	Bitmap {
		Image "UI\Glues\BattleNet\BattlenetWorking\BattlenetWorking0000.blp", | 4 – как раз с четырех и надо было начинать, создавая смену ID в нашем материале.
	}
	Bitmap {
		Image "UI\Glues\BattleNet\BattlenetWorking\BattlenetWorking0001.blp",
	}
	Bitmap {
		Image "UI\Glues\BattleNet\BattlenetWorking\BattlenetWorking0002.blp",
	}

… | я намеренно стер еще кучу однотипных записей, дабы не загромождать статью.

		Image "UI\Glues\BattleNet\BattlenetWorking\BattlenetWorking0028.blp",
	}
}
Чтобы поменять ID текстур, нужно поменять их местами, но стоит помнить, что их следует изменить и в материалах, где эти ID используются, т.к. на них такая перестановка тоже отразится:
Materials 5 {
	Material {
		Layer {
			FilterMode None,
			staticTextureID 1, | Здесь и меняется ID статичной текстуры.
		}
	}
…
}
Теперь, после исправления недоработок этого этапа анимирования, если они все же были, конвертируем модель обратно в *.mdx и возвратимся в Редактор материалов.
К слову об интерполяциях – здесь они не имеют никакого значения, так что смело можно оставлять "None".
Примечание: наверняка вы заметили, что вне анимаций у поверхности, покрытой нашим анимируемым материалом, текстура меняется на самую первую по ID – ничего страшного, но от этого никуда не деться, корректно она отобразится только во время анимаций.
Итак, осталось лишь правильно переписать кадры – и впредь сразу начинать с верного ID – и полюбоваться получившейся анимацией. Глаз в телевизоре моргает и озирается!

5.3

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

Анимации текстур

Теория

Как же можно анимировать текстуры? Это – правильный вопрос. Ни Mdlvis, ни War3 ModelEditor не располагают возможностями для непосредственного графического воздействия на изображения, которые используются в качестве текстур. Но тем не менее Менеджер анимаций текстур в w3meесть. Так как же он работает?
На самом деле анимируется не сама текстура, а UVW-развертка, которая имеет свои вершины с собственными координатами. Вот они и двигаются, правда, только все вместе. Развертка может перемещаться, поворачиваться и масштабироваться в w3me, и это – ключ ко многим возможностям, одну из которых я продемонстрирую далее.

Практика (TV_version_2.mdx)

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

6.1

Текстура поделена на 64 ячейки размером 64х64 пикселя (в моем случае нижний правый угол 128х128 отведен под текстуру экрана, так что свободных ячеек 60) и в каждую может быть вставлен один из кадров, которые затем будут совмещены в ролик путем горизонтального и вертикального перемещения развертки на текстуре.
При работе с UVW-разверткой в Mdlvis’е вы, скорее всего, заметили, что при перемещении вершин значения Xи Yменяются в пределах от -1 до 1, если не выходить за ограничительный квадрат. Несложно догадаться, что перемещать развертку экрана, изначально находящуюся в верхнем левом углу, мы будем с шагом в 0.125.
Примечание: можно и выйти за ограничительный квадрат, но тогда следует поставить галочки в пунктах "Выравнивание ширины" и "Выравнивание высоты" в настройках текстуры (6.0.1), чтобы она, так сказать, повторялась и вне квадрата.
» Изображение к примечанию
Итак, в w3me перейдем в Менеджер анимаций текстур и, кликнув ПКМ, выберем пункт "Создать новый". В появившемся окне (6.2) есть выбор, что же именно анимировать; здесь стоит остановиться. Как я ни пытался, но заставить хоть как-то работать масштабирование или даже вращение у меня не вышло, и если шансы на корректную работу второго были низки из-за кватернионов, то неработоспособность масштабирования вызвала у меня глубокое недоумение. Ну тут уж ничего не сделать (хотя вы, конечно же, можете попытаться), и я пойду дальше, ибо мне необходимо именно перемещение, которое работает нормально и без нареканий.

6.2

После нажатия на кнопку "Перенос" в голову может прийти вопрос: если мы анимируем развертку на текстуре, которая, как известно, плоская, то почему для редактирования доступны аж три параметра? Непонятно. По-видимому, редактирование контроллеров в w3me , универсализировано, и он не делает различий между 3D и 2D, а экспериментальным путем было установлено, что третье число никак не влияет на анимацию текстуры. Так что можно смело браться за первых два, знакомых X и Y.

6.3

Замечу, что в качестве интерполяции выбрано "None", т.к. в моем случае необходимо мгновенное перемещение. Но здесь прекрасно работают и все остальные типы.
После создания нескольких первых кадров стоит вернуться в Редактор материалов, ведь пока наша анимация не прикреплена ни к чему. Найдем материал, который использует нашу текстуру, и зайдем в настройки слоя: здесь необходимо задать ID анимированной текстуры, чтобы анимация текстуры закрепилась за ней самой.

6.4

Продолжаем расписывать кадры.
Совет: помните, что все можно связать с глобальной анимацией, и это часто оказывается полезным при использовании анимаций текстур.
Создали все свои кадры? Отлично, теперь сохраним модель и перезапустим w3me. Смотрим анимацию, и что мы видим: её нет! Дело в том, что w3me сам почему-то удаляет анимацию текстур после закрытия модели (известный баг), но это исправимо.
Сперва необходимо пересохранить нашу модель в *.mdl. Теперь откроем её через блокнот и найдем блок, отвечающий за материалы; в нем – материал, который использует анимированную текстуру, на данный момент у меня он выглядит так:
	Material {
		Layer {
			FilterMode None,
			staticTextureID 2,
			TwoSided,
			Unshaded,
		}
	}
Чтобы заставить анимацию текстур работать, нужно выписать "TVertexAnimId#", где вместо символа # указывают порядковый номер анимации текстур (начиная с нуля). Вписать эту строчку необходимо после статичного ID текстуры. Таким образом, получаем:
	Material {
		Layer {
			FilterMode None,
			staticTextureID 2,
			TVertexAnimId 0,
			TwoSided,
			Unshaded,
		}
	}
Теперь сохраняем модель и конвертируем в *.mdx. После этого даже w3me сам по себе не сможет убрать данные об анимации текстуры из материала.
Я показал лишь один из множества возможных способов использования анимаций текстур: танковые гусеницы, бегущие строки, различные спецэффекты – все это вам еще предстоит реализовать.
Ну а теперь настал черед переходить к предпоследней главе этой статьи.

Анимации света

Теория

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

Практика (TV_version_2_with_light.mdx)

Логично, что включенный телевизор излучает свет, да и мой фильм располагает к использованию нескольких цветов, поэтому я создам не слишком мощный источник света и анимирую его цвет.
Итак, в w3me необходимо зайти в Редактор узлов и, кликнув ПКМ, выбрать из контекстного меню пункт "Создать источник света". Его можно привязать к какой-нибудь кости (тогда он будет двигаться вместе с ней), а можно оставить так, просто написав нужные координаты. Назовем наш источник "Omni01", например.
Дважды кликнем ЛКМ по источнику, и откроется окно с его настройками.

7.1

Теперь разберемся, что за что отвечает:
  • Цвет (п. 1 на 7.1) – этот параметр отвечает за основной цвет излучаемого источником света. Требует довольно деликатного подхода, о чем будет сказано далее.
  • Цвет окружения (п. 2 на 7.1) – это вторичный цвет, т.е. свет в WarCraft’е распространяется как бы двумя слоями от источника: первый слой в центре, второй – вокруг первого (легче понять будет, когда попробуете сделать источник с разными параметрами цвета и цвета окружения).
  • Интенсивность (п. 3 на 7.1) – отвечает за яркость света. Значения больше 70-и лично я никогда не использовал.
  • Интенсивность окружения (п. 4 на 7.1) – этот пункт отвечает за яркость второго слоя света.
  • Видимость (п. 5 на 7.1) – регулирует видимость источника света. Контроллер принимает значения 1 и 0.
  • Тип (п. 6 на 7.1) – позволяет выбирать тип источника света, но по-настоящему особого выбора не предоставляет, ибо для широкого использования походит только тип "Omnidirectional". Предназначение остальных двух – Directional и Ambient – очень узко: первый из них используется в стандартных моделях глобального освещения WarCraft 3; второй я вообще встречал лишь однажды и тоже в модели освещения, но уже нестандартной.
  • Затухание в начале (п. 7 на 7.1) и Затухание в конце (п. 8 на 7.1) – мои эксперименты не выявили никакого влияния этих пунктов на свет типа Omnidirectional, но, если исходить из стандартных моделей глобального освещения, они имеют некоторое влияние на тип Directional. Однако сами разработчики использовали всегда одно и то же сочетание: 80 для затухания в начале и 200 для затухания в конце.
Примечание: модели глобального освещения WarCraft 3 находятся в его mpq-архивах по адресу "Environment\DNC\". Там находятся несколько подпапок, в которых хранятся модели освещения для разных типов ландшафтов. Как видно, для освещения юнитов используется один источник света, а для освещения самого ландшафта – другой. Типы всех источников – Directional, т.е. они имеют направление – один единственный кадр в контроллере вращения также недвусмысленно намекает на это. Именно эти модели отвечают за смену дня и ночи, однако вся анимация умещается в одну минуту, следовательно, суточный цикл отчасти управляется самой игрой. Исследуйте эти модели в свое удовольствие – они того стоят ;)
Теперь вернемся к цвету. Я уже сказал, что данный параметр требует деликатного подхода, и вот почему: во-первых, он не всегда отображает именно тот цвет, который нужен, по крайней мере, если пытаться добиться голубых оттенков, – у меня в игре цвет всегда был зеленее, чем должен, – во-вторых, здесь есть один специфичный баг… и этот баг связан с еще одним, крайне неприятным багом источников света.
А дело вот в чем: как только вы установите флажок "Анимирован" на каком-либо параметре источника света и пропишите кадры, модель начнет регулярно выдавать такие ошибки при попытках открытия в w3me:

7.2

Причем группы, на которые ссылается программа, могут быть разными – это уже зависит от того, что вы анимировали: KLAC – анимирован цвет, KLAI – анимирована интенсивность, KLBC – анимирован цвет окружения и т.д. Исправляется это путем канонизации в Mdlvis’е, но тут всплывает другая проблема: после канонизации настройки цвета у источника света сбиваются! А именно уже знакомое нам BGR превращается в RGB и наоборот, т.е. после каждой канонизации крайние цветовые каналы меняются местами. Так что после внесения любых изменений в модель нужно будет дважды канонизировать и пересохранять её в Mdlvis’е. А можно просто заранее расписывать цвета из расчета на их перемежевку, но одну канонизацию делать все равно придется. Не слишком удобно, но ничего не поделать…
Примечание: если вдруг вылетит ошибка "Unknowntag""inlight", то помогает та же канонизация.
Что ж, после всех необходимых процедур я получил следующие настройки цвета:
0: { 1, 0.1, 0.1 }
2000: { 0.5, 0.5, 0.5 }
2900: { 0.5, 0.5, 0.5 }
3000: { 0.91, 0.335, 0 }
6900: { 0.91, 0.335, 0 }
6950: { 0.294, 0.3, 0.929 }
8000: { 0.294, 0.4, 0.929 }
10000: { 0.294, 0.11, 1 }
И вот долгожданный результат:

7.3

Очень важно: не создавайте больше 2-х источников света в одной модели! Три источника убивают в модели все источники частиц, событийные объекты и CollisionShapes, могут нарушить костные анимации и удалить анимации поверхностей. После этого никакие оптимизации и канонизации не помогут. Да и с двумя будьте особенно осторожны: редко, но такие баги могут произойти и с ними. Более того, уже во время написания этой статьи я впервые встретился с тем, что после дублирования или копирования трижды источника света и открытия модели без канонизации, War3 ModelEditor заставил работать процессор на 100%, заполнил всю оперативную память, и пришлось перезапускать компьютер, который подвис намертво. Если вдруг при открытии модели w3me перестает отвечать, немедленно запускайте диспетчер задач и следите за процессом – будьте готовы завершить его.
Мой техножрец также не обойдется без анимаций света, но к ним я приступлю в последнюю очередь.
На этом мы закончим главу об анимациях света и перейдем к завершающей стадии создания полноценной модели: к оснастке точек крепления.

Точки крепления

Теория

Итак, мы на финишной прямой! Единственное, что нам осталось сделать для завершения работы над анимированной моделью, – это точки крепления, или, иначе говоря, аттачи. Они необходимы, если к модели в игре будут крепиться какие-либо эффекты, посредством заклинаний, через триггеры или Jass.
Почти в каждой стандартной модели юнита в WarCraft 3 есть 9 основныхаттачей; они имеют определенные названия, обусловленные исполняемой ими функцией в игре. Я перечислю их все:
  • OverheadRef – крепление над головой юнита, ни к чему не привязано.
  • HeadRef – крепление головы, привязывается к кости головы.
  • ChestRef – отвечает за прикрепление эффектов к телу юнита, привязывается к кости груди.
  • HandLeftRef – левая рука, крепится к кости левой кисти.
  • HandRightRef – правая рука, крепится к кости правой кисти.
  • WeaponRef – аттач для оружия (определяет, например, вокруг чего будет в игре летать сфера молний), крепится к кости, отвечающей за оружие, или к кисти, если отдельной кости для оружия не предусмотрено.
  • FootLeftRef – левая ступня, аттач крепится к соответствующей кости и находится на нулевом уровне по оси Z.
  • FootRightRef – аналогично для правой ступни.
  • OriginRef – точка крепления для всяческих аур, находящаяся в нулевых координатах, не должна быть привязана ни к каким костям.
Заметьте: везде после названия аттача добавлено "Ref" – это необходимый постфикс, чтобы отличать аттачи от других объектов в Mdlvis’е и w3me; в игре же он никак не используется и его можно расценивать как некую формальность. На работоспособность эти Ref’ы никак не влияют, но я предпочитаю все равно ставить их.
А вот названия играют очень важную роль: есть четкий список тех имен для аттачей, которые будут работать в качестве точек для прикрепления эффектов непосредственно в игре.
» Вот полный список допустимых названий:
Основные названия Пояснения Дополнительные названия Пояснения
Overhead Аттач над головой Left Для креплений слева
Head Голова Right Для креплений справа
Chest Грудь Rear Для креплений сзади
Hand Рука Smart Просто работающее название
Foot Ступня Mount Используется для аттачей, относящихся к животными и т.п. в моделях наездников
Feet Общий аттач на обе ступни Alternate Указывает на альтернативные креплния, использующиеся после превращений
Origin Аттач в нулевых координатах Gold Работающее название
Weapon Оружие EatTree Работающее название
Sprite Крепление для эффекта огня, который появляется при повреждениях, если модель используется для здания или для юнита, классифицируемого в РО как механический First Далее идут аттачи, работающие только в связке с основным креплением Sprite
Second
Third
Fourth
Fifth
Sixth
Small
Medium
Large
RallyPoint Крепление для модели точки сбора
Основные названия могут использоваться только отдельно или вместе с дополнительными, а дополнительные вполне могут обойтись и без основных. То есть если вы назовете крепление "ChestHeadRef", то работать оно не будет, а если название будет даже таким: "GoldEattreeMountSmartRearRightLeftRef", – то все будет нормально.
Теперь приступим непосредственно к оснастке аттачей.

Практика (Tech-priest_v3-00a_with_attaches.mdx)

Создавать точки креплений удобно в Mdlvis’е, поэтому откроем в нем нашу модель и перейдем в Редактор скелета. Здесь с аттачами можно работать так же, как и с другими объектами. Создать крепления можно, используя команду:
Создать\Крепление (Ctrl+A)
После этого разместим новые аттачи там, где нужно, и переименуем их. Не забудьте привязать крепления к соответствующим костям! После этого они изменят цвет на более светлый.
У креплений есть также одна очень полезная особенность, а именно: возможность независимо от названия аттача прикрепить к нему любую модель в обход WorldEditor’а. Это можно сделать как в Mdlvis’е, так и в War3 ModelEditor’е.
Наверняка вы уже заметили поле "Путь" (8.1) при создании аттачей – именно туда необходимо вписать адрес прикрепляемой модели в MPQ-архиве WarCraft 3 или в какой-либо карте.
Примечание: несмотря на то, что прямо в названии поля написано "указывать как mdl", модели, вписанные с расширением *.mdx, работают нормально.

8.1

В w3me работа с аттачами выполняется в Редакторе узлов, создаются они так же, как и любые другие объекты: щелкните ПКМ и выберите самый первый пункт – "Создать аттач".
Теперь щелкнем дважды левой кнопкой мыши по только что созданному аттачу и обнаружим, что помимо поля Путь (п. 1 на 8.2) есть возможность редактировать Видимость (п. 2 на 8.2). Это еще один плюс, который позволяет показывать прикрепляемые модели только в нужное время. Интерполяция только None; увы, но видимость не альфа.
<> scrn40.jpghttp://img706.imageshack.us/img706/5972/scrn40.jpg

8.1

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

Событийные объекты

Здесь нет смысла делать статью на теорию и практику, ибо все предельно просто. Эти объекты необходимы, чтобы в определенные моменты времени в игре вызывались другие модели, не зависящие от основной, например, следы, брызги крови или кратеры, а также звуки.
Создаются они только в w3me, в редакторе узлов, командой "Создать событийный объект". Теперь рассмотрим окно редактирования "событийника":
  • События (п. 1 на 9.1) – это кадры, когда событийный объект будет срабатывать, т.е. создавать указанную модель или звук.
  • Тип (п. 2 на 9.1) – здесь уточняется, из какой области будет объект: следы – FPT; брызги крови – SPL; следы разрушений на земле – UBR; звуки – SND; дополнительные создаваемые объекты – SPN.
  • Данные (п. 3 на 9.1) – из верхнего списка можно выбрать необходимый объект (сортировка идет в алфавитном порядке по ID), а в нижнем вписать его ID, который можно найти, например, в текстовых файлах SoundData.txt, SpawnObjectData.txt, SplatData.txt и UberSplatData.txt из папки Data в каталоге w3me (увы, но со следами ног и колес придется действовать "методом тыка").
  • Идентификатор (п. 4 на 9.1) – насколько я понял, это просто один символ, помогающий отличить один событийный объект от другого, если присутствует несколько одинаковых, так как самостоятельно задавать имена им нельзя.
  • ID глобальной последовательности (п. 5 на 9.1) – уже знакомое нам поле, для указания глобальной анимации.

9.1

Координаты для событийного объекта указываться в окне редактирования узла.
Помните, что модель по возможности должна быть укомплектована событийниками, ведь они тоже важны для создания полноценного образа вашего юнита или здания.
В модели техножреца используются и они, но он еще не завершен до конца и пока под маркировкой "_v3-00b" в прикрепленном архиве лежит бета-версия модели; финальная версия is coming soon!

Заключение

Оглядываясь назад, даже не верится, что я, наконец, завершил эту огромную статью… И лично мне кажется, что даже если не весь алфавит от "А" до "Я", то бОльшую его часть мне охватить удалось =)
Статья писалась очень долго и неоднократно бросалась, а потом снова возрождалась и, наконец, предстала перед вашими глазами. Надеюсь, что мои старания были не напрасны, и вам понравилось и принесло пользу все описанное выше.

Благодарности

Без них никуда, и я с радостью скажу спасибо за оказанную помощь в написании статьи Сказочник’у, reALien’у и отдельное спасибо Wulfrein’у, который давал множество ценных советов, всячески помогал, а также лично приложил руку к статье.
Ну и конечно же, спасибо нашему порталу – eXtreme Game Modmaking, его создателям и посетителям; Алексею за его Mdlvis, Magos’у за War3 Model Editor и NETRAT’у за его перевод.

Спасибо за внимание!

WebSter добавил:

Архив с модельками будет позже)
Пишите, плиз, если найдете очепятки или какие-то ошибки
Старый 17.08.2011, 01:50
Инквизитор

offline
Опыт: 7,037
Активность:
писчи ищо
Старый 17.08.2011, 02:16
RSQR

offline
Опыт: 29,316
Активность:
блин, молодчинка. всё разжевал дальше некуда. вот только я до половины дочитал больше не осилил) завтра буду дочитывать.
откуда столько терпения? :D
Старый 17.08.2011, 02:21
WebSter
Товарищ Mechanicus
offline
Опыт: 86,111
Активность:
Инквизитор, куда тебе еще-то? =D
Rescuer, спасибо) сам удивляюсь =)
Старый 18.08.2011, 00:08
Uber
Все любят статусы
offline
Опыт: 39,243
Активность:
Плюсую за анимацию света ты словно знал, что мне это как раз понадобится :О
Старый 18.08.2011, 00:41
WebSter
Товарищ Mechanicus
offline
Опыт: 86,111
Активность:
Uber, это с самого начала было обязательным пунктом)
Старый 18.08.2011, 22:22
iZucken
ШТО
offline
Опыт: 17,960
Активность:
бтв ошибку групп выдает 105 ме, 107 просто плюет на все и загружает первый кадр
Старый 18.08.2011, 23:01
WebSter
Товарищ Mechanicus
offline
Опыт: 86,111
Активность:
как понять: "загружает первый кадр"?
Старый 18.08.2011, 23:55
WebSter
Товарищ Mechanicus
offline
Опыт: 86,111
Активность:
В общем, статья в базе, а эту тему я переношу в "Желтую прессу".
Свои замечания прошу писать в комментариях к статье или лично мне.
Старый 25.08.2011, 23:32

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 14:22.