> For the complete documentation index, see [llms.txt](https://docs.bestway.com.ua/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.bestway.com.ua/gem-rts-v1-ru/bazovaya-informaciya-o-resursakh-v-gem-rts/binarnye-resursy-v-gem-rts/format-animacii-.anm.md).

# Формат анимации (.anm)

## Общая информация про формат .anm

Формат `.anm` используется для хранения анимации скелетных моделей в движках семейства GEM.

GEM RTS поддерживает все версии формата анимации, начиная с GEM1.

Файл может содержать:

• информацию о версии формата;\
• параметры диапазона кадров;\
• карту анимируемых костей;\
• данные о видимости костей;\
• анимационные ключи;\
• мешевую анимацию;\
• комментарии.

**Структура файла**

```
EANM
version
FRMS
    frame_max + 1
CMNT
    size
    comment[size]
BMAP
    bone_count
    bones [bone_count]
        bone_name
цикл по кадрам
    FRMN | FRM2 | FRM3
```

## Описание содержимого файла

### Чанк `EANM`

Заголовок файла, который является верификатором содержимого. Подтверждает, что файл содержит анимацию.

<table><thead><tr><th width="112.28125">Название</th><th width="92.90625">Тип</th><th width="101.1796875">Размер</th><th>Описание</th></tr></thead><tbody><tr><td><code>FourCC</code></td><td>uint8[4]</td><td>4</td><td><code>EANM</code></td></tr><tr><td><code>version</code></td><td>int16[2]</td><td>4</td><td><p>Версия формата.<br>Первые 2 байта содержат <code>major</code>, вторые 2 байта содержат <code>minor</code> :</p><ul><li>0x00040000 версия 4.0 (GEM1, Soldiers Heroes of World War II)</li><li>0x00060000 версия 6.0 (GEM2, Men of War)</li><li>0x00060001 версия 6.1 (GEM2.5, Majesty2; GEM RTS, Men of War II) GEM RTS поддерживает все версии</li></ul></td></tr></tbody></table>

### Чанк `FRMS`

Определяет максимальный номер кадра в анимации.

**Структура данных**

```
FRMS
    frame_max + 1
```

<table><thead><tr><th width="142.34765625">Название</th><th width="90.96484375">Тип</th><th width="102.5703125">Размер</th><th>Описание</th></tr></thead><tbody><tr><td><code>FourCC</code></td><td>uint8[4]</td><td>4</td><td><code>FRMS</code></td></tr><tr><td><code>frame_max + 1</code></td><td>int32</td><td>4</td><td>Значение на 1 больше максимального номера кадра</td></tr></tbody></table>

### Чанк `CMNT`

Чанк комментария. Также является признаком формата, поддерживаемого в движке GEM3.

**Структура данных**

```
CMNT
    size
    comment[size]
```

<table><thead><tr><th width="119.0234375">Название</th><th width="113.36328125">Тип</th><th width="104.24609375">Размер</th><th>Описание</th></tr></thead><tbody><tr><td><code>FourCC</code></td><td>uint8[4]</td><td>4</td><td><code>CMNT</code></td></tr><tr><td><code>size</code></td><td>uint16</td><td>2</td><td>Размер комментария в байтах</td></tr><tr><td><code>comment</code></td><td>char[size]</td><td>1+</td><td>Текст комментария</td></tr></tbody></table>

### Чанк `BMAP`

Карта костей анимации. Поддерживает лоды через суффикс `_lod<номер_лода>` в имени кости.

**Структура данных**

```
BMAP
    bone_count
    bones[bone_count]
         bone_name
```

<table><thead><tr><th width="128.453125">Название</th><th width="170.84375">Тип</th><th width="98.19140625">Размер</th><th>Описание</th></tr></thead><tbody><tr><td><code>FourCC</code></td><td>uint8[4]</td><td>4</td><td><code>BMAP</code></td></tr><tr><td><code>bone_count</code></td><td>int32</td><td>4</td><td>Количество костей в карте.<br>Несмотря на тип <code>int32</code>, версия 6.1 поддерживает не более 255 костей</td></tr><tr><td><code>bones</code></td><td>struct[bone_count]</td><td></td><td>Массив костей</td></tr></tbody></table>

#### Описание массива костей

<table><thead><tr><th width="117.62109375">Название</th><th width="107.609375">Тип</th><th width="100.21875">Размер</th><th>Описание</th></tr></thead><tbody><tr><td><code>bone_name</code></td><td>string8/24<br>string32</td><td>1+</td><td>Название кости.<br>Если используется формат GEM3, применяется <code>string8/24</code>.<br>Для более старых форматов используется <code>string32</code>.</td></tr></tbody></table>

### Циклы кадров

После карты костей идет последовательность данных кадров анимации.

```
цикл по кадрам
    FRMN | FRM2 | FRM3
```

Дальнейшая структура данных кадра определяется идентификатором чанка формата кадра.

<table><thead><tr><th width="164.6796875">Идентификатор формата кадра</th><th width="107.796875">Название формата кадра</th><th>Комментарий</th></tr></thead><tbody><tr><td><code>FRMN</code></td><td>V1</td><td>Поддерживается начиная с GEM1</td></tr><tr><td><code>FRM2</code></td><td>V2</td><td>Поддерживается начиная с GEM2</td></tr><tr><td><code>FRM3</code></td><td>V3</td><td>Поддерживается начиная с GEM2.5 / GEM RTS</td></tr></tbody></table>

\*) GEM RTS поддерживает все версии формата.

### Формат кадра V1 (`FRMN`)

Поддерживается начиная с GEM1.

**Структура данных**

```
FRMN
    frame_no
    цикл
        BONE
        index
        цикл
            MATR
                matrix
            VISI
                visibility
            MESH
                size
                mesh_data[size]
```

#### Верификатор кадра V1

<table><thead><tr><th width="121.6953125">Название</th><th width="94.26953125">Тип</th><th width="101.57421875">Размер</th><th>Описание</th></tr></thead><tbody><tr><td><code>FourCC</code></td><td>uint8[4]</td><td>4</td><td><code>FRMN</code></td></tr><tr><td><code>frame_no</code></td><td>int32</td><td>4</td><td>Номер кадра</td></tr></tbody></table>

#### Чанк `BONE`

Содержит анимацию отдельной кости.

Для файлов с версией кадра V1 из-за особенностей формата чтение чанков BONE должно выполняться по следующему алгоритму:

1. Прочитать следующее значение FourCC без изменения позиции потока.
2. Если достигнут конец файла или конец текущего контейнера, завершить чтение.
3. Если значение FourCC равно FRMN, FRM2 или FRM3, завершить чтение.
4. Если значение FourCC равно BONE, прочитать следующий чанк BONE.
5. Если значение FourCC равно MATR, VISI или MESH, прочитать соответствующий чанк компонента.
6. Любое другое значение FourCC считается ошибкой.

{% hint style="warning" icon="file-circle-exclamation" %}
Чтение значения FourCC без изменения позиции потока (peek) не должно изменять текущее положение указателя чтения.
{% endhint %}

<table><thead><tr><th width="113.6328125">Название</th><th width="95.76171875">Тип</th><th width="102.8515625">Размер</th><th>Описание</th></tr></thead><tbody><tr><td><code>FourCC</code></td><td>uint8[4]</td><td>4</td><td><code>BONE</code></td></tr><tr><td><code>index</code></td><td>int32</td><td>4</td><td>Индекс кости из карты <code>BMAP</code></td></tr></tbody></table>

#### Чанк `MATR`

Матрица трансформации кости.

<table><thead><tr><th width="115.96875">Название</th><th width="116.91015625">Тип</th><th width="102.5234375">Размер</th><th>Описание</th></tr></thead><tbody><tr><td><code>FourCC</code></td><td>uint8[4]</td><td>4</td><td><code>MATR</code></td></tr><tr><td><code>matrix</code></td><td>float[3][4]</td><td>48</td><td><p>Матрица 3x4.</p><p>Содержит:</p><ul><li>позицию</li><li>ориентацию</li><li>масштаб</li></ul></td></tr></tbody></table>

#### Чанк `VISI`

Видимость кости.

<table><thead><tr><th width="121.921875">Название</th><th width="86.49609375">Тип</th><th width="99.64453125">Размер</th><th>Описание</th></tr></thead><tbody><tr><td><code>FourCC</code></td><td>uint8[4]</td><td>4</td><td><code>VISI</code></td></tr><tr><td><code>visibility</code></td><td>int32</td><td>4</td><td><p>Флаг видимости.</p><p>Значения:</p><ul><li><code>0</code> — невидимая</li><li><code>1</code> — видимая</li></ul></td></tr></tbody></table>

#### Чанк `MESH`

Мешевая анимация.

<table><thead><tr><th width="114.16796875">Название</th><th width="107.23828125">Тип</th><th width="98.55859375">Размер</th><th>Описание</th></tr></thead><tbody><tr><td><code>FourCC</code></td><td>uint8[4]</td><td>4</td><td><code>MESH</code></td></tr><tr><td><code>size</code></td><td>int32</td><td>4</td><td>Размер данных мешевой анимации</td></tr><tr><td><code>mesh_data</code></td><td>byte[size]</td><td></td><td>Данные мешевой анимации</td></tr></tbody></table>

### Формат кадра V2 (`FRM2`)

Поддерживается начиная с GEM2.

**Структура данных**

```
FRM2
    frame_no
    key_count

    keys[key_count]
        bone_map_index
        key_flags

        [если key_flags & 0x0001]
            position

        [если key_flags & 0x0002]
            orientation

        [если key_flags & 0x0040]
            scale

        [если key_flags & 0x0020]
            mesh
                size
                data[size]
```

#### Описание формата кадра V2

<table><thead><tr><th width="112.50390625">Название</th><th width="158.65234375">Тип</th><th width="100.78125">Размер</th><th>Описание</th></tr></thead><tbody><tr><td><code>FourCC</code></td><td>uint8[4]</td><td>4</td><td><code>FRM2</code></td></tr><tr><td><code>frame_no</code></td><td>uint16</td><td>2</td><td>Номер кадра</td></tr><tr><td><code>key_count</code></td><td>uint8</td><td>1</td><td>Количество анимированных ключей в кадре</td></tr><tr><td><code>keys</code></td><td>struct[key_count]</td><td></td><td>Структура описания ключей</td></tr></tbody></table>

#### Структура ключа struct\[key\_count]

<table><thead><tr><th width="147.13671875">Название</th><th width="77.578125">Тип</th><th width="107.1015625">Размер</th><th>Описание</th></tr></thead><tbody><tr><td><code>bone_map_index</code></td><td>uint8</td><td>1</td><td>Индекс кости из карты <code>BMAP</code></td></tr><tr><td><code>key_flags</code></td><td>uint16</td><td>2</td><td>Битовая маска анимируемых параметров</td></tr></tbody></table>

#### Битовая маска `key_flags`

<table><thead><tr><th width="122.76953125">Значение</th><th>Описание</th></tr></thead><tbody><tr><td><code>0x0001</code></td><td>Позиция</td></tr><tr><td><code>0x0002</code></td><td>Ориентация</td></tr><tr><td><code>0x0004</code></td><td>Признак отзеркаленной матрицы</td></tr><tr><td><code>0x0008</code></td><td>Включение видимости</td></tr><tr><td><code>0x0010</code></td><td>Выключение видимости</td></tr><tr><td><code>0x0020</code></td><td>Мешевая анимация</td></tr><tr><td><code>0x0040</code></td><td>Масштаб</td></tr></tbody></table>

#### Условные данные анимационного ключа

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

<table><thead><tr><th width="128.55859375">Название</th><th width="106.7265625">Тип</th><th width="102.07421875">Размер</th><th>Описание</th></tr></thead><tbody><tr><td><code>position</code></td><td>float3</td><td>12</td><td>Позиция</td></tr><tr><td><code>orientation</code></td><td>float3</td><td>12</td><td>Нормализованная форма кватерниона</td></tr><tr><td><code>scale</code></td><td>float3</td><td>12</td><td>Масштаб по осям XYZ</td></tr><tr><td><code>mesh</code></td><td>struct</td><td></td><td>Mешевая анимация</td></tr><tr><td><code>mesh.size</code></td><td>int32</td><td>4</td><td>Размер данных</td></tr><tr><td><code>mesh.data</code></td><td>byte[size]</td><td>1*[size]</td><td>Бинарные данные мешевой анимации</td></tr></tbody></table>

### Формат кадра V3 (FRM3)

Используется в GEM2.5 и GEM RTS.

**Структура данных**

```
FRM3
    frame_no

    keys[key_count]
        bone_map_index
        key_flags

        [если key_flags & 0x0001]
            position

        [если key_flags & 0x0002]
            orientation

        [если key_flags & 0x0040]
            scale

        [если key_flags & 0x0020]
            mesh
                size
                mesh_data[size]
```

#### Описание формата кадра V3

<table><thead><tr><th width="121.984375">Название</th><th width="156.32421875">Тип</th><th width="100.62109375">Размер</th><th>Описание</th></tr></thead><tbody><tr><td><code>FourCC</code></td><td>uint8[4]</td><td>4</td><td><code>FRM3</code></td></tr><tr><td><code>frame_no</code></td><td><p>uint8</p><p>uint16</p><p>uint32</p></td><td><p>1</p><p>2</p><p>4</p></td><td><p>Размер поля зависит от <code>frame_max</code>.</p><p>Используется:</p><ul><li><code>uint8</code>, если <code>frame_max &#x3C;= 255</code></li><li><code>uint16</code>, если <code>frame_max &#x3C;= 65535</code></li><li><code>uint32</code>, если <code>frame_max >= 65536</code></li></ul></td></tr><tr><td><code>key_count</code></td><td>uint8</td><td>1</td><td>Количество анимированных ключей в кадре</td></tr><tr><td><code>keys</code></td><td>struct[key_count]</td><td></td><td>Структура описания ключей</td></tr></tbody></table>

#### Структура ключа struct\[key\_count]

<table><thead><tr><th width="149.703125">Название</th><th width="76.3046875">Тип</th><th width="102.47265625">Размер</th><th>Описание</th></tr></thead><tbody><tr><td><code>bone_map_index</code></td><td>uint8</td><td>1</td><td>Индекс кости из карты <code>BMAP</code></td></tr><tr><td><code>key_flags</code></td><td>uint16</td><td>2</td><td>Битовая маска анимируемых параметров</td></tr></tbody></table>

#### Битовая маска `key_flags`

<table><thead><tr><th width="119.1640625">Значение</th><th>Описание</th></tr></thead><tbody><tr><td><code>0x0001</code></td><td>Позиция</td></tr><tr><td><code>0x0002</code></td><td>Ориентация</td></tr><tr><td><code>0x0004</code></td><td>Признак отзеркаленной матрицы</td></tr><tr><td><code>0x0008</code></td><td>Включение видимости</td></tr><tr><td><code>0x0010</code></td><td>Выключение видимости</td></tr><tr><td><code>0x0020</code></td><td>Мешевая анимация</td></tr><tr><td><code>0x0040</code></td><td>Масштаб</td></tr></tbody></table>

#### Условные данные анимационного ключа

Ниже описанные поля присутствуют, если установлен соответствующий флаг в битовой маске.

<table><thead><tr><th width="128.88671875">Название</th><th width="105.37890625">Тип</th><th width="103.58203125">Размер</th><th>Описание</th></tr></thead><tbody><tr><td><code>position</code></td><td>float3</td><td>12</td><td>Позиция</td></tr><tr><td><code>orientation</code></td><td>float3</td><td>12</td><td>Нормализованная форма кватерниона</td></tr><tr><td><code>scale</code></td><td>float3</td><td>12</td><td>Масштаб по осям XYZ</td></tr><tr><td><code>mesh</code></td><td>struct</td><td></td><td>Mешевая анимация</td></tr><tr><td><code>mesh.size</code></td><td>int32</td><td>4</td><td>Размер данных</td></tr><tr><td><code>mesh.data</code></td><td>byte[size]</td><td>1*[size]</td><td>Бинарные данные мешевой анимации</td></tr></tbody></table>

[Вся информация о бинарных файлах](/gem-rts-v1-ru/bazovaya-informaciya-o-resursakh-v-gem-rts/binarnye-resursy-v-gem-rts.md)
