Экспорт и базовая игровая настройка модели

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

```

## **Подготовка модели к экспорту**

Перед экспортом убедитесь, что сцена рендерится без ошибок! Как показывает практика, часто ошибки возникают из-за того, что остаются неназначенными UV-Map для полигонов, материал которых того требует, или отсутствуют некоторые текстуры. Тестовый рендер сразу выдаст сообщение о таких ошибках.

Основные правила подготовки модели к экспорту:

1. В одной сцене может находиться одновременно несколько моделей. Каждая модель идентифицируется по корневым костям в сцене. Источники освещения не рассматриваются как модели.
2. **Hidden geometry** (кости и отдельные полигоны) исключается из экспорта. Можно скрывать группы. Вместе со скрытой костью скрываются и все прилинкованные к ней, поэтому нельзя скрывать базовую кость, если целью не является исключение модели из экспорта.
3. Возможно исключение костей из освещения через **Exclusion List** в источниках света. Если полигональная кость не освещена ни одним источником, подразумевается ее динамическое освещение в игре.
4. В базовой кости необходимо задать параметр **Type**, определяющий тип сущности в игре (**Type=game\_entity** для пассивных объектов (пассивное взаимодействие с игровым миром, например, здание), **=actor** для активных объектов и т.п.); а так же один из параметров **Model=path** – путь к каталогу модели в ресурсах игры.
5. Если анимируется базовая кость, то ее пивот должен находиться в начале координат. Если на базовой кости нет анимации, то допускается произвольное ее смещение в сцене.
6. В модели не должно быть кости с именем «**root**», поскольку это зарезервированное имя для базовой кости скелета, автоматически создаваемой при загрузке модели в игре.

**Важно!** Следует очень аккуратно настраивать параметры экспортера, особенно именно пути для экспорта: «путь к ресурсам игры» и «исходный каталог с общими текстурами» - абсолютные пути, а «каталог с общими текстурами в игре» - относительный (всегда должен быть **texture/common/**). Обязательно!!! Сцена с моделью, готовой к экспорту, должна быть в таком состоянии (настройки выделений, материалов, все текстуры в наличии, нет лишних объектов и т.п.), чтобы можно было в случае необходимости просто открыть этот файл и сразу экспортировать. Сцену по окончании работы над ней нужно ВСЕГДА приводить в состояние готовности к немедленному экспорту. При необходимости, нужно разделить сцену на несколько сцен, чтобы ничего не приходилось перенастраивать. Никаких исключений из данного правила не допускается!

## **Экспорт**

### Общие сведения

При первом экспорте новой модели для нее создается файл описания (.def), который в дальнейшем не перезаписывается во избежание потери настроек. Все остальные файлы, создаваемые плагином, перезаписываются без предупреждения. Файлы текстур перезаписываются только в том случае, если при экспорте исходная текстура имеет более позднее время модификации. Для получения правильных пропорций модели в игре, необходимо установить в 3DMAX единицы измерения в метры (Customize->Units Setup: Display Unit Scale: Meters). Не меняйте System Unit Scale (Кнопка System Unit Setup) – это приведет к неправильному масштабу. System Unit Scale должен оставаться 1 Unit = 1 Inch. Перед экспортом модели необходимо убедиться, что все текстуры, участвующие в экспорте, доступны для чтения и назначены используемые текстурные каналы. Проще всего в этом убедиться, отрендерив сцену. При этом не должно выдаваться никаких предупреждений, касающихся текстур и материалов. Исключение составляют материалы и текстуры, используемые на скрытых при экспорте или вспомогательных костях, для которых не экспортируется мэш.

### Структура сцены для экспорта одной или нескольких моделей

Объекты, относящиеся к одной модели, должны быть слинкованы в дерево. Корневая кость, идентифицирующая модель, не должна иметь родительского линка. Локальная ориентация этой кости должна совпадать с ориентацией системы координат 3DSMAX, а ось X направлена в сторону «лицевой» части модели. В этой корневой кости обязательно должны быть прописаны в “Properties->User defined” (далее просто в параметрах) следующие строки:

```
Type=<тип игрового объекта>
Model=<каталог модели внутри ресурсов игры>

```

Пример: модель будет записана в папку «{Путь к ресурсам игры}/entity/Model»

```
Type=entity
Model=entity/Model

```

Каждому объекту (node в терминах 3DSMAX) сопоставляется кость в иерархии скелета модели. Исключение составляют объекты типа **shape** и полигональные объекты, в параметрах которых написано ключевое слово **Volume**. Группа объектов (**group**) идентифицируется как одна кость. Плагин позволяет экспортировать несколько моделей из одного .max-файла. Отдельная модель идентифицируется корневыми объектами в сцене, в которых прописаны параметры **Type** и **Model**. Если корневая кость не участвует в анимации, то ее координаты в сцене не имеют значения. Важно: ориентация корневой кости должна соответствовать ориентации системы координат 3DSMAX. Если некоторая кость должна содержать полигональный вид (мэш), то в параметрах соответствующего объекта или группы необходимо прописать ключевое слово **Poly**. Рекомендуется использовать **Dummy** или **Point helper** для задания кости без полигонального вида. Если часть объектов в иерархии, относящейся к модели, является вспомогательной для моделирования, то перед экспортом такие объекты необходимо скрывать во избежание предупреждений или экспорта лишних костей. Все объекты, относящиеся к одной модели, должны иметь уникальные имена. Исключение составляют объекты внутри групп. Для волюмов допускается использовать суффикс “**\_vol**”, который автоматически отбрасывается при экспорте. Например, волюм с именем “**Body\_vol**” будет экспортирован как “**Body**”.

**Важно!**

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

### Полигональные виды

Для того, чтобы в игре получить кость, имеющую полигональный мэш, необходимо в параметрах соответствующего объекта или группы указать **Poly**. Это могут быть стандартные объекты или объекты типа **Editable mesh** или **Editable poly** (полученный любым доступным способом, главное, чтобы конечный мэш был представим в виде треугольников). Поддерживается экспорт мэшей с модификатором **Skin**. При этом контрольных костей должно быть не более **255**. Из всех костей, действующих на вершину, выбираются две наиболее влияющие. Следует учитывать это при распределении весов. Для задания материалов, используемых на полигональных видах, используется специальный тип материала **EclipseMtl**, предоставляемый в виде отдельного плагина.

### Материалы

Для задания текстур, **EclipseMtl** использует в качестве дочернего один из стандартных материалов (**Standard**, **Blend**, **RGB** **Multiply**). Тип материала **Standard** является основным, и используется для подавляющего большинства материалов. Диффузная (основная) текстура берется из настроек диффузной текстуры стандартного материала. Если материал использует бамп и/или спекулярную карту, то соответствующие текстуры берутся соответственно из настроек **bump** и **specular** **level** стандартного материала. В текущей версии не поддерживаются спекулярные материалы без маски.

Флаг **Premultiplied** **Alpha** игнорируется. Формат исходных файлов текстур может быть любой, поддерживаемый 3DSMAX, однако рекомендуется использовать напрямую поддерживаемые игрой форматы **BMP**, **TGA** и DDS (последний предпочтителен, поскольку позволяет управлять **MIP**-уровнями и компрессией). Процедурные текстуры не поддерживаются. Так же не поддерживается генерация текстурных координат “**Planar from World XYZ**”. Поддерживается экспорт анимированных текстур (**avi, gif**), при этом они преобразуются в последовательность кадров в формате **bmp**. Следует заметить, что анимированные текстуры могут занимать значительный объем видеопамяти и заметно дольше загружаются. Рекомендуется использовать текстуры размером сторон степени 2 (2, 4, 8, 16, 32, 64, 128, 256, 512, 1024). При этом текстура не обязательно должна быть квадратной. Возможно использование и текстур других размеров, но при этом если текстура не объединяется с другими при загрузке в игре, будет нерационально расходоваться видеопамять за счет доращивания текстуры до размеров степени 2.

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

**Важно!** Всегда используйте разрешение текстуры не больше, чем видимое разрешение в реальной игровой сцене. Ни в коем случае нельзя использовать **Cropping**/**Placement**, поскольку текстура всегда экспортируется полностью и в результате получится некорректное текстурирование.

### Инверсная кинематика

Если в модели используется инверсная кинематика, то в настройках костей, участвующих в кинематике, необходимо указать в параметрах тип кинематического взаимодействия и, при необходимости, граничные условия. По-умолчанию используется IK-привязка без ограничения. Тип кинематики указывается параметром IKType:

```
IKType={prizmatic|revolute|socket}
IKTerminate -- указывает, что эта кость последняя в цепочке кинематики

```

Чтобы установить пределы IK необходимо в параметрах объекта написать следующее: Для призматической привязки (1 единица = 1/20 = 0,05 метра):

```
IKMin=<минимальное смещение относительно базового положения>
IKMax=<максимальное смещение относительно базового положения>
IKSpeed2=<максимальная скорость перемещения,  метров  в секундуб по-умолчанию 0.25 м/с>

```

Для вращательной привязки:

```
IKMin=<минимальный угол поворота базового положения в градусах>
IKMax=<максимальный угол поворота базового положения в градусах>
IKSpeed=<максимальная скорость поворота, градусы в секунду, по-умолчанию 30?/с>

```

Следует отметить, что ограничение (-45?, 45?) противоположно ограничению (45?, 315?), а ограничение (45?, -45?) считается ошибочной и рассматривается как (-45?, 45?). Для socket-привязки:

```
IKLimit=<угол> -- угол конуса в градусах, ограничивающего socket-кинематику

```

### Волюмы

Волюмы для взаимодействия задаются полигональными объектами, в которых вместо Poly указан параметр **Volume**. Для волюмов не создается отдельная кость, поэтому они должны быть прилинкованы к другому объекту (это может быть любой объект в иерархии модели), вместе с которым волюм должен изменять свою ориентацию и/или положение. Волюмы должны удовлетворять нескольким условиям:

1. Объект должен быть выпуклым.
2. Не допускается результирующее непропорциональное или зеркальное масштабирование. Под словом «результирующее» подразумевается, что недостаточно, чтобы только локальная трансформация волюма была корректной. Вся цепочка до корневой кости в этом случае не должна содержать отзеркаливаний или непропорционального масштабирования.
3. Не допускается объектная (Pivot only) трансформация.
4. Для стандартных объектов типа Sphere, Box, Cylinder не допускается никакая трансформация кроме как изменением соответствующих параметров.
5. Рекомендуется использовать простые геометрические объекты Sphere, Box, Cylinder везде, где это возможно для задания волюма. При этом объект не должен быть преобразован в Editable mesh или Editable poly. В противном случае волюм экспортируется как наиболее медленный (в смысле затрат на расчет взаимодействия в игре) полигональный объем.

Параллельно с волюмом плагин может автоматически создать зону препятствия для движения (obstacle). Для этого в параметрах объекта необходимо написать **Obstacle**. Зона рассчитывается путем проецирования соответствующего объема на плоскость земли. Если сгенерированная зона не устраивает, то ее необходимо создать вручную, удалив при этом из параметров волюмов слово Obstacle.

**Важно!** Всегда проверяйте волюмы, полученные в результате экспорта, в редакторе включением режима отображения объемов Alt+V.

### Зоны

Зоны для взаимодействия задаются плоскими объектами типа Shape. При этом объекты обязательно линкуются к корневой кости, поскольку в игре не поддерживается трансформация зон кроме как трансформацией всей модели. Для экспорта зоны в параметрах соответствующего объекта указывается ключевое слово **Obstacle** (зона непроходимости) или **Area** (прочие зоны). Для того, чтобы зона перемещалась и поворачивалась с моделью в игре, в параметрах объекта необходимо указать **Rotate**. Если необходимо учитывать только перемещение, то в параметрах вместо **Rotate** указывается **Move**. Если указать **Static**, то зона никак не будет реагировать на изменение положения и ориентации модели. Как правило, тип трансформации зоны указывается **Rotate**. Зоны должны удовлетворять нескольким условиям:

1. Зона должна быть выпуклой.
2. Не допускается объектная (Pivot only) трансформация.
3. Для стандартных объектов типа Circle или Rectangle не допускается трансформация кроме как изменением соответствующих параметров.
4. Рекомендуется использовать простые геометрические объекты Circle или Rectangle везде, где это возможно для задания зоны. В противном случае зона экспортируется как наиболее медленная (в смысле затрат на расчет взаимодействия в игре) полигональная зона.

**Важно!** Всегда проверяйте зоны, полученные в результате экспорта (в том числе и автоматически сгенерированные), в редакторе включением режима отображения зон Alt+A.

## **Файлы, создаваемые в процессе экспорта**

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

.def – описание игровой сущности (definitions), текстовый;

.mdl – описание модели (model), текстовый;

.ply – информация о геометрии модели (polygons), бинарный;

.mtl – описание материалов модели (material), текстовый;

.vol – информация об объемах (volumes), бинарный;

.anm – информация об анимации модели (animation), бинарный;

.ext – дополнительные расширения (extensions), текстовый;

.dds, .bmp, .tga – файлы текстур, бинарные.

Если материалы модели в 3dsmax ссылались на текстуры в указанных выше форматах, то эти файлы будут скопированы в каталог экспорта без изменений. Если же исходный формат отличается от перечисленных, экспортер создаст файлы в формате bmp (24bit или 32bit, если присутствует альфа-канал).

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

**Важно!** Часто при поправках модели требуется учесть изменения только текстур, материалов или же только самой геометрии модели. В таком случае после переэкспорта следует выкладывать с помощью Sync в общую сетевую базу ресурсов только те файлы, которые нуждаются в замене. Всем остальным файлам нужно забрать «старую версию». Однако если меняется структура модели, добавляются или удаляются объемы или меняются их параметры, удаляются/добавляются части иерархии модели и т.п. радикальные изменения, необходимо создать резервную копию файла описания (.def), а сам файл описания забрать на редактирование (Check Out) и удалить его на своем локальном диске, чтобы при последующем экспорте этот файл был создан заново. После этой операции в новый файл описания из резервной копии переносятся ранее прописанные вручную параметры.

## **Дополнительные параметры в файле описания**

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

1. {placer .......} – к данной модели могут линковаться юниты (имеются места для снайперов в окнах и т.п.);
2. {extender "structure".......} – использование каркасной модели;
3. (include "/properties/.......") – подключение файла с заданным набором свойств игровой сущности, каталог с этими файлами: \resource\properties\;
4. {props .......} – описание набора дополнительных свойств модели (тип физического материала объекта, наличие окон и т.п.);
5. {obstacleid .......} – класс препятствий, создаваемых данной моделью;
6. {boarder .......}– объект может принимать в себя «пассажиров» (либо экипаж техники, либо снайперы в окнах домов и т.п.);
7. {mass .......} – масса объекта в кг;
8. {NoCastShadows}, {NoReceiveShadows} – флаги для выключения отбрасываемых и принимаемых теней соответственно (действуют на всю модель!);
9. {extender "land\_patch" .......} – в данной модели присутствует патч ландшафта. Данный блок экспортируется пустым и в него необходимо вписать тип территории, представляемой данным патчем. Внутри блока может присутствовать строка {TerrainType .......}. По умолчанию тип **ground**, полный перечень типов территории в \resource\set\interaction\_terrain\terrains.set. Кроме типа территории может быть указана строка **{nonormals 1}**, предписывающая движку игры не выполнять построение непроходимых участков по краю патча. Это может быть необходимым в случае если предполагается, например, что юнит должен вплотную подходить к краю полотна моста. Но в этом случае нужно создать объемы-препятствия по контуру такой модели, иначе юниты будут перемещаться по объекту неестественно (будут «прыгать» по вертикальной стенке). Также данный блок может использоваться как средство для «выравнивания» модели по ландшафту и вырезания полигонов из него (случай с окопами и воронками). Если в модели есть полигональная зона с именем «**cut**», то по ней из ландшафта будут вырезаны полигоны. Внутри блока {Extender "land\_patch" .......} может быть прописано:
	* {AlignEnabled 1} – разрешено ли выравнивание mesh по земле; кости, в свойствах которых прописан «Align», будут выставлены по уровню земли (если одновременно включены свойства align и land, то сначала сработает align, затем land); обрабатываются все вертексы полигональной сетки (по умолчанию 1);
	* {AlignStacked 0} – какой слой земли использовать для выравнивания – первоначальный(0) или уже «перекопанный»(1); 0 – для окопов, 1 – для воронок (по умолчанию 1);
	* {AlignVolumes 1} – объемы смещаются так, чтобы расстояние от центра объема до земли не изменилось (по умолчанию 0);
	* {RandomRotate 0} – случайный разворот при выставлении на землю в редакторе; 0 – для окопов, 1 – для воронок (по умолчанию 0).
10. {extender "enumerator"} – включение автоматически генерируемых номеров в модели;
11. Color[=0xRRGGBB] – параметр, указываемый в свойства кости, задает окрашивание кости в нужный цвет.

Также в .def модели могут быть указаны другие параметры (зависящие от конкретного типа объекта) либо дополняться/изменяться свойства имеющихся объемов и т.п. объектов.