Анимация моделей

```
***Основная статья***

```

## **Общие требования**

Допускается создание анимации любыми средствами 3DSMAX, поскольку анимация экспортируется покадрово (не по ключам), путем сравнения состояния объекта в последовательных кадрах. Некоторые ограничения накладываются на мешевую анимацию. Для мешевой анимации отслеживается изменение состояния вершин (позиция, цвет, нормаль, текстурные координаты), причем вершины идентифицируются и объединяются (при обнаружении двух с абсолютно одинаковым содержимым) по нулевому кадру на шкале анимации. При этом следует понимать, что автоматически объединенные в 0-м кадре вершины в дальнейшем в анимации рассматриваются как одна вершина, что может привести к некорректной анимации в игре, если в анимации эти вершины изменяются неодинаково. Такие вершины необходимо принудительно разделить по позиции, цвету, материалу, текстурным координатам или группе сглаживания (последнего может быть недостаточно, если смежные треугольники копланарны).

## Анимация

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

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

В кости, к которой привязана анимация задается один или несколько (по одному на каждую анимацию) параметров **Animation**, **AnimationResume** или **AnimationAuto** в формате:

```
Animation=<имя анимации>,<именованное выделение>,<начальный кадр>-<конечный кадр>[,<имя файла анимации>][,<скорость проигрывания в игре в % от 50 кадров/сек>]

```

**AnimationAuto** вместо **Animation** означает, что данная анимация будет автоматически запущена циклически при появлении модели в игре. Использование пробелов не допускается, если пробел не является частью имени (не рекомендуется). **AnimationResume** вместо **Animation** означает, что данная анимация требует поддержки возобновления после приостановки, иначе анимация может быть либо проиграна до конца, либо перезапущена сначала. Задание именованного выделения с объектами, участвующими в анимации, является необходимым условием возможности одновременной работы нескольких анимаций на одной модели. При этом, никакие две одновременно запущенные анимации не могут использовать одну и ту же кость, поскольку результат получится непредсказуемый. Следует иметь это ввиду при создании выделений для анимаций. Так же не стоит включать в выделение лишние кости, не участвующие в анимации во избежание возможных конфликтов в процессе игры с инверсной кинематикой. Имя файла, в который записывается анимация, совпадает по-умолчанию с именем анимации. Однако, часто необходимо экспортировать несколько анимаций с одинаковым именем, но относящимся к различным костям (например, анимации с именем «**break**» для покомпонентного разрушения). Для этого и введена возможность указания файла анимации.

Пример 1: анимация с именем start, анимируемые объекты берутся из именованного выделения chassis, анимация расположена в кадрах с 10 по 25 в шкале анимации, установить скорость проигрывания по-умолчанию 35% от скорости 50 кадров в секунду, записать анимацию в файл start.anm.

```
Animation=start,chassis,10-25,35

```

Пример 2: анимация с именем stop, анимируемые объекты берутся из именованного выделения chassis, анимация расположена в кадрах с 26 по 40 в шкале анимации, установить скорость проигрывания по-умолчанию 35% от скорости 50 кадров в секунду, записать анимацию в файл stop\_body.anm.

```
Animation=stop,chassis,26-40,stop_body,35

```

Анимация может быть двух видов: скелетная -- анимируются матрицы трансформации костей, и мэшевая -- анимируется сам полигональный вид. Допускается произвольное совмещение обоих типов анимаций. Так же допускается использование мэшевой анимации на скиновых мэшах. По-умолчанию подразумевается скелетная анимация, при этом возможные изменения в мэше игнорируются. Если для объекта необходимо учитывать анимацию вершин, то в параметрах этого объекта следует написать **CommonMesh**. Чаще всего такой вид анимации используется на группах, постольку все объекты группы объединяются в один мэш, и необходимо, например, сделать анимацию разрушения этой группы. Следует использовать мэшевую анимацию рационально, по возможности заменяя ее скелетной путем разбиения группы на несколько групп, поскольку такая анимация занимает гораздо больший объем памяти, дольше загружается и, что важнее всего, требует модификации буфера вершин в процессе игры. Допускается создание анимации любыми средствами 3DSMAX, поскольку анимация экспортируется покадрово (не по ключам), путем сравнения состояния объекта в последовательных кадрах. Некоторые ограничения накладываются на мэшевую анимацию. Для мэшевой анимации отслеживается изменение состояния вершин (позиция, цвет, нормаль, текстурные координаты), причем вершины идентифицируются и объединяются (при обнаружении двух с абсолютно одинаковым содержимым) по нулевому кадру на шкале анимации. При этом следует понимать, что автоматически объединенные в 0-м кадре вершины в дальнейшем в анимации рассматриваются как одна вершина, что может привести к некорректной анимации в игре, если в анимации эти вершины изменяются неодинаково. Такие вершины необходимо принудительно разделить по позиции, цвету, материалу, текстурным координатам или группе сглаживания (последнего может быть недостаточно, если смежные треугольники копланарны).

**Важно!** Никакие две анимации, использующие один и тот же объект, не должны пересекаться по кадрам.

## **Трансформация**

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

**Важно:** простая анимация внутри группы будет преобразована в мешевую анимацию группы в целом! Таким образом, этот вид анимации становится более дорогим для производительности игры. Это надо учитывать при подготовке иерархии модели.

## **Мешевая деформация**

В отличие от простой трансформации здесь анимируется сам полигональный вид, т.е. изменения отслеживаются на уровне вертексов модели.

Если для объекта необходимо учитывать анимацию вершин, то в параметрах этого объекта следует написать **CommonMesh**. Чаще всего такой вид анимации используется на группах, постольку все объекты группы объединяются в один меш, и необходимо, например, сделать анимацию разрушения этой группы. Следует использовать мешевую анимацию рационально, по возможности заменяя ее на простую путем разбиения группы на несколько групп, поскольку такая анимация занимает гораздо больший объем памяти, дольше загружается и, что важнее всего, требует модификации буфера вершин в процессе игры.

Параметры анимированной кости:

1. **CommonMesh** – эта кость рассматривается как анимированный меш.
2. **CommonMesh** = <кость> – меш этой кости добавляется к анимированному мешу указанной кости.

## **Скелетная деформация**

Третий тип анимации – это мешевая деформация при помощи управляющих объектов-костей (в данном случае подразумеваются именно кости скелета, а не иерархии модели). Поддерживается экспорт мешей с модификатором **Skin**. При этом контрольных костей должно быть не более 15. Из всех костей, действующих на вершину, выбираются две наиболее влияющие. Следует учитывать это при распределении весов.

## **Текстурная анимация**

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

```
{animation
    {uv "run"
        {shiftV 0 1 0.0008}
        {shiftU 0 1 0.0004 pingpong}
    }
}

```

Здесь для каждого сдвига (по U или по V) указывается:

1. **min** = от какого значения начинать сдвиг;
2. **max** = до какого значения (полная прокрутка – от 0 до 1);
3. **delta** = смещение за 1 квант времени (за 1/50 сек);
4. **pingpong** – указывается, если после окончания прокрутки нужно запустить анимацию в обратную сторону.

**Важно:** файл **mdl** при экспорте перезаписывается, поэтому параметры текстурной анимации нужно предварительно сохранить.

## **Анимирование placement**

### **Правила для анимаций, у который placement в первом кадре не смещён:**

1. **ЦЕНТР** объекта определяется по вертикальной проекции позиции кости placement. Направление **ВПЕРЕД** определяется по вертикальной проекции оси X кости placement. Очень желательно, чтобы данные полученные из placement совпадали с реальными.
2. В игре положение объекта можно посмотреть через консольную команду showAxes 1 Отображение костей можно включить командой showbonesnames "placement" "basis" "foresight" Отображение выключается по showbonesnames 0 Отображение направления осей в кости включается по нажатию "Alt+S" или по showbones 1.
3. В **НУЛЕВОМ** кадре анимации ориентация и позиция placement должны **ТОЧНО** совпадать с **basis** в **ВЕРТИКАЛЬНОЙ ПРОЕКЦИИ**. В **ПЕРВОМ** кадре анимации ориентацию и позицию placement нужно установить на нужное для анимации место. Например, совместить его с **body**. В противном случае:

* анимация будет в нулевом кадре перекидывать объект в другое место
* нельзя будет вызывать анимации циклически, т.к. объект начнёт дрейфовать по карте

В описании анимации нужно прописать блок {movement}, например:

```
{binary "rlook_gun" {movement}}

```

### **Правило для анимаций, у которых placement в первом кадре был уже смещён:**

1. Для того, чтобы не было разрывов, в описании анимации нужно прописать блок {pinback N}, например:

```
{pinback 1} ; работает по placement
{pinback 2}	; работает по body
{pinback} ; тоже, что и {pinback 1}

```

### **Правило для цепочек анимаций, в которых есть анимации и с movement и c pinback:**

1. Для анимаций кидания гранаты из-за угла и других, где есть похожая цепочка анимаций:

```
"исх. точка"
rlook_item (movement, вперед)
"точка бросания"
rlook_throw_begin (pinback, вперед)
rlook_throw_end (pinback, вперед)
"точка бросания"
rlook_item (movement, назад)
"исх. точка"

```

**Важно:** для того, чтобы **ИСХОДНАЯ ТОЧКА** после цепочки анимаций **НЕ ИЗМЕНЯЛАСЬ** нужно, чтобы в описании анимаций "rlook\_throw\_begin" и "rlook\_throw\_end" было ключевое слово **{pinback 2}**, и чтобы в первом кадре "rlook\_throw\_begin" и последнем кадре "rlook\_throw\_end" положения кости **body** совпадали.

## **Экспорт анимации**

1. Анимация не должна пересекаться по кадрам (т.е. допустимы диапазоны 0-30, 31-60, но НЕ допустимы 0-30, 30-60).
2. Файлы анимации записываются только при включенном флажке анимации в диалоге экспорта; параметры анимации берутся из диалога экспорта, или из параметров Animation в базовой кости (таких параметров может быть несколько).
3. Если в базовой кости встречается хоть одна строчка с параметром Animation, то в .mdl-файл в любом случае прописываются все анимации; если таких строчек нет, то прописывается анимация "default" только если включен флажок экспорта анимации.
4. Если экспорт анимации ведется по параметрам Animation, то для каждой анимации необходимо создать named selection (может быть один на несколько анимаций), имя выделения потом указывается в соответствующих строках Animation. В параметрах Animation пробелы в имени анимации, файла и выделения являются значимыми.
5. Файлы анимаций создаются/перезаписываются только при включенном флажке экспорта анимации.