Служебные объекты в модели

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

```

## **Волюмы**

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

К волюмам предъявляется следующий набор обязательных требований:

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

Для волюмов желательно использовать в имени постфикс **«*\_vol*»**, который автоматически отбрасывается при экспорте. Например, волюм с именем ***«Body\_vol»*** будет экспортирован как ***«Body»***. Постфикс должен стоять в самом конце (*после имени с номером*), например ***«UpperTube7\_vol»***.

Для того чтобы идентифицировать волюм, необходимо в свойствах соответствующего объекта указать строку ***«Volume»***. Помимо этого в свойствах объекта могут указываться также следующие параметры волюмов:

* **Visible** **[= 1 | 0]** – используется для проверки видимости и построения карты высот. По умолчанию **= 1**
* **Bullet [= 1 | 0]** – реагируют на столкновение с пулей. По умолчанию **= 1**
* **Overlap [= 1 | 0]** – присылает системные события пересечения с другими объектами в interaction (*например кусты шевелятся при пересечении с солдатом*)
* **Obstacle [= 1 | 0]** – автоматически генерирует препятствие (*зону типа **obstacle***). По умолчанию **= 1**
* **Contact [= 1 | 0]** – реагирует на столкновение с другими волюмами. По умолчанию **= 1**
* **Contact\_ground [= 1 | 0]** – рассчитывается физический контакт с поверхностью земли. По умолчанию **= 1**
* **Blast [= 1 | 0]** – реагирует на взрывную волну. По умолчанию **= 1**
* **Select [= 1 | 0]** – используется при выделении сущности. По умолчанию **= 1**
* **Hole [= 1 | 0]** – вырезает дыру в другом волюме данной модели.
* **Holed [= 1 | 0]** – из данного волюма можно вырезать дырку другим волюмом со свойством ***hole***.
* **Touch [= 1 | 0]** – курсор мыши меняет вид над данным волюмом (*на окнах, например*)
* **Float [= 1 | 0]** – волюм может плавать на воде.
* **Window [= 1 | 0]** – волюм разбиваемого окна.
* **Clear** – сброс свойств-по-умолчанию (*для того, чтобы указать необходимый набор параметров вручную*)

* **Tags [= body | attach,# ]** – **body** – прописывается для волюма, который может получать повреждения и отвечает за разрушение модели, ***attach,#*** – к данному волюму при указании на него мышью, будет прилинкован юнит в игре (*например, объем отверстия окна, куда становится снайпер*), номер (***#***) соответствует номеру служебной кости ***attach#***.
* **Thickness = ##** – «толщина» волюма (*условно в миллиметрах стали*). Задается для расчета пробиваемости снарядами и влияет на прочность (ч*ем выше значение, тем дольше модель будет сопротивляться повреждениям*). Кроме этого, некоторые свойства волюмов определяются из их имени. Например:

1. ***fire#\_vol*** – волюм «горения» – при поджоге объекта в игре, в этом волюме будет генерироваться заранее подготовленный эффект огня (*на данный момент **fx\smoke\smoke\_fire\_window***)
2. **smoke#\_vol** – волюм «дыма»: аналогично предыдущему, но генерируется эффект дыма (*на данный момент **fx\smoke\smoke\_black\_window***)
3. **floor#\_vol** – волюм для определения пола верхних этажей. Применяется при имитации отскока гранат от такого пола (*спец. случай*)

**Замечание**: для окон можно не создавать отдельный объем горения и дыма, а прописать это в свойствах объема самого окна (***window#\_vol***), указав параметр ***Tags=fire*** или ***Tags=smoke***.

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

## **Зоны (препятствия)**

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

Зоны не являются костями. Типы зон (*определяются по имени*):

* ***interior#*** – зона внутренней части здания. Применяется при скрывании крыши, если союзный юнит проникает внутрь.
* ***obstacle#*** – зона препятствия движению юнитов по поверхности земли (*без соответствующего волюма*).

**Зоны должны удовлетворять нескольким условиям:**

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

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

## **Ландшафт и вода.**

В некоторых случаях в игре необходимы модели, по которым юниты могут перемещаться так же, как по земле. Это: мосты, различные площадки, элементы ландшафта сложной формы, которые невозможно или очень сложно создать средствами редактора. Для таких моделей в свойствах того объекта, который отвечает за формирование поверхности перемещения, указывается параметр ***Land***. Такой объект именуется патчем ландшафта. Тип территории для данного патча прописывается после экспорта в ***.def*** вручную (*см. **Экспорт и базовая игровая настройка модели***). Кроме параметра ***Land*** можно указать ***Ground*** – флаг, указывающий, что данный патч относится к слою ground, он принимает на себя тени, но не отбрасывает их в случае пониженной детализации теней (*это важно учитывать при создании моделей различных мостов, которые впоследствии должны бросать тень под собой*)

В игре карта высот по патчу строится по полигонам, с определенным шагом сетки. Исходя из этого, в патче не должно быть узких полигонов шириной меньше **0,5 м**, чтобы не возникало ошибок.

Для создания водной поверхности используются плоские (*статические или анимированные*) полигональные сетки, у которых в параметрах указывается слой, к которому они должны принадлежать: «***Layer=water***». Водная поверхность набирается в редакторе из патчей потому, что в большинстве случаев водоемы имеют сложную форму и занимают немного места на карте. Кроме того, каждый патч воды создается с прозрачными краями, что позволяет замаскировать патчевую структуру водоема, а также создать плавное изменение прозрачности воды у берега.

## **Другие элементы**

Кроме чисто полигональных видов, волюмов, зон и патчей ландшафта, в модели часто присутствуют некоторые служебные объекты, предназначенные для креплений к ним эффектов, указания мест для посадки людей в технику и т.п. Такие служебные объекты являются костями иерархии модели.

К часто употребляемым служебным костям относятся:

* ***attach#*** – место посадки человека в технику / здание / к орудию и т.п. Аттачей должно быть столько же, сколько предполагается линковочных мест в пределах данной модели (и*ли отдельно экспортируемой части каркасной модели, далее именуем просто «отдельная часть»*);
* ***window#*** – разбиваемое окно в здании/технике и т.п. Является одновременно полигональным видом. Окон может быть не более 24 (*номера 0..23*) в данной модели или ее отдельной части. К окну линкуется волюм с соответствующими свойствами, и на том же уровне иерархии, что и данное окно, может присутствовать кость ***window#\_x***, являющаяся разбитой версией данного окна. Как правило, на ней другой материал, либо такого объекта просто нет, и тогда окно исчезает при разбивании (*имеет смысл для окон из сплошного стекла без рамы*);
* ***piece#*** – полигональный вид для куска разрушенной версии модели. Кусков может быть не более 16 (*номера 0..15*) в пределах модели или ее части, и они должны быть прикреплены к корневой кости. Каждый **piece** должен иметь объем минимальной сложности (*если это обломок стены, то желательно делать его такой формы, чтобы достаточно было прикрепить к нему единственный box-волюм*);
* ***sub\_piece#*** – аналогично ***piece***, но при падении этих кусков на землю генерируется другой эффект столкновения и, вдобавок, кости ***sub\_piece*** могут быть прикреплены к костям ***piece***, в результате чего они будут падать сначала вместе с соответствующим ***piece***, а затем, при падении на землю, отделяться и падать самостоятельно. Количество ***sub\_piece*** – также не более 16 (*номера 0..15*) в пределах модели или ее части;
* ***basis*** – кость, используемая как корневая для каркасной модели, в составе которой есть только дочерние кости для прикрепления частей модели и нет костей с полигональными видами.

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

1. ***exterior*** – полигональная кость (часто группа объектов, group в 3dsmax), которая перестает отрисовываться в игре (скрывается), если юнит игрока пересек границу зоны **interior#** данной модели или ее части. Проще говоря, исчезающая крыша.
2. ***fix##*** – точка опоры или связь. Служит для принудительного разрушения текущей модели или ее части в случае, если была разрушена модель, в волюм которой была «вставлена» кость ***fix##*** текущей модели.
3. ***fx......*** – кость, отвечающая за линковку определенных спецэффектов, срабатывающих в случае разрушения текущей модели или ее части. К таким костям относятся (*количество дополнительных вариантов эффектов типа 1a, 1b,... может расширяться при необходимости*):
	* **fx\_smoke1, 1a,... 1c, 2, 2a,... 2c** – дым, сила эффекта возрастает по номеру (1,2);
	* **fx\_fire1, 1a,... 1c, 2, 2a,... 2c** – огонь, аналогично;
	* **fx\_flue** – дым из трубы на крышах домов (не для разрушения);
	* **fx\_dust1, 1a, 2, 2a** – пыль;
	* **fx\_wood1, 1a,...1c, 2, 2a** – щепки и доски;
	* **fx\_stone1, 1a,... 1m, 2, 2a** – обломки камней;
	* **fx\_haulm1, 1a,... 1c, 2, 2a** – обрывки соломы;
	* **fx\_exp1, 1a, 2, 2a** – взрыв;
	* **fx\_metall1, 1a** – куски металла;
	* **fx\_sand1, 1a, 2, 2a** – песок.

Остальные служебные объекты будут описаны в каждом конкретном случае, поскольку их применение ограничено спецификой определенных моделей.

## **Номера на объектах**

Существует возможность задавать индивидуальные номера на технике, домах и т.п. объектах (*в принципе можно использовать на чем угодно*). Нумерация работает следующим образом. По умолчанию модели присваивается трехзначный произвольный номер. Количество цифр фиксировано в коде. Номер можно отключить или изменить через панель свойств в редакторе.

Для функционирования такого номера нужно создать объект с именем «***enumerator***» и прилинковать его к базовой кости модели. На этом объекте должны быть ***Material ID 1,2,3*** – соответствуют старшинству цифр (*ID=3 должен быть на старшей цифре*) и объекту должен быть присвоен мультиматериал с дочерними материалами, названными ***num\_1, num\_2, num\_3*** соответственно **Material ID**. Эти материалы должны ссылаться на текстуры ***Common/model/enumerator/\*.dds*** (*текстуры будут подставляться автоматически согласно номеру*). Разумеется, на самом объекте должна быть раскладка текстуры такая, чтобы цифры выглядели должным образом. Если нужен двух- или однозначный номер, необходимо сделать только те **Material ID** и материалы, которые нужны. Кроме настроек геометрии/материалов модели нужно прописать в ***.def*** некоторые параметры.

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