Структурные объекты

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

```

## Определение структурной модели

Модель может представлять собой набор отдельных частей, соединенных воедино с помощью так называемого каркаса, а объект представляемый такой моделью – называется структурным. Такими моделями обычно являются модели зданий и сооружений, которые предполагается разрушать «по частям», т.е. при попадании снаряда в определенную часть дома рушится не все здание, а те части, которым были нанесены достаточные повреждения. Чем мельче разрушаемые части конструкции, тем хаотичнее будет выглядеть картина разрушения. Однако чрезмерное дробление модели приводит к неоправданным затратам как труда моделера, так и компьютерной памяти, выделяемой для модели. В каждом конкретном случае нужно найти необходимый минимум разбиения модели на части, чтобы при этом картина разрушений выглядела более-менее реалистично. Чаще всего линии разрезки модели достаточно хаотичны, но могут возникнуть ситуации, когда потребуется сделать, например, строго определенный пролом в стене, обусловленный какими-то игровыми потребностями. Разбиение модели на произвольные части помимо прочего вызывает некоторые неудобства, скажем, в текстурировании таких частей по отдельности. Все эти аспекты необходимо учитывать при создании структурных моделей и к началу работы над моделью иметь, по крайней мере, четкое представление об общей структуре и предполагаемых линиях разреза. Желательно подготовить некое подобие проекта здания, где моделер для себя отмечает важные моменты, которые нельзя упускать (геометрические детали, материалы и прочее). Кроме простого разделения модели на части каркасные структуры используются для создания нескольких вариантов внешнего вида объекта. Например, на стене дома могут быть какие-то окна, а может их не быть. Для этого создается две версии одной и той же части – с окнами и без них. Границы для стыковки с другими частями дома при этом должны совпадать. Важно учесть, что подобные варианты частей структуры должны иметь раскладку на той же текстуре, что и базовый вариант (крайне не желательно делать исключения из этого правила!), иначе увеличение количества текстур может привести к падению производительности игры в целом.

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

**Важно**: рекомендуется первоначально полностью выполнить «целую» версию модели (включая полную раскладку всех текстур), а затем разбивать ее на части. Это сэкономит массу времени и усилий при последующих доработках модели. Стадию неразрезанной модели желательно сохранить в отдельный файл, с которым впоследствии можно выполнять такие операции, как обновление лайтмапы.

## Организация структурной модели

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

1. Каркас представляет собой модель без полигональных видов, имеет в своем составе только корневую кость basis, к которой прилинкованы каркасные кости (далее КК), предназначенные исключительно для последующей линковки к ним рисуемых частей конструкции. КК именуются произвольно, но с таким расчетом, чтобы было понятно, за какую часть отвечает данная КК (например, назвать ее corner03 для углового куска здания, wall05 – для отдельной стены). Желательно давать максимально сокращенные, но контекстно-понятные имена (не corner03, а cor03 или c03), поскольку имя КК отображается в редакторе и может не поместиться в текстовом поле панели управления.
2. Каркас представлен самой иерархией модели и к указанным в .def костям впоследствии прикрепляются необходимые части модели.
3. Несколько моделей могут быть прикреплены к другой модели в редакторе игры специальным образом (см. далее).

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

К кости basis линкуются КК без каких-либо прописанных свойств. В кости basis прописываются только следующие строки:

```
Type=game_entity
Model=место сохранения модели
Structure

```

В результате экспорта в целевой папке создаются 2 файла: .def и .mdl. Файл .def будет содержать примерно следующее:

```
{game_entity
	{Extension "Structure.mdl"}
}

```

Для того, чтобы структура функционировала, нужно вписать блок {extender "structure"} и указать, какие части модели крепятся к указанным КК. В примере КК названы «1», «2», «3», «4»:

```
{game_entity
	{Extension "Structure.mdl"}
	{placer}
	{extender "structure"
		{place "1" "catholic_church_corner1"}
		{place "2" "catholic_church_corner2"}
		{place "3" "catholic_church_corner3"}
		{place "4" "catholic_church_corner4"}
	}
}

```

При построении структурной модели по принципу 2 в базовой кости модели помимо прочих параметров (Type, Model, Poly,.....) указывается Structure, как и в предыдущем случае. Внутри самой иерархии модели создаются КК, прилинкованные к базовой кости, без прописанных свойств. Дальнейшие действия – такие же, как для предыдущего случая (тоже в .def прописывается {extender “structure”.......}), за исключением того, что в отэкспортированной модели будет помимо структуры еще набор полигональных видов, материалов и т.п. Фактически посредством {extender “structure”.......} можно прикреплять к данной модели все что угодно (произвольную модель, эффект и т.п.), но нужно понимать, что подобные эксперименты должны быть логически обоснованными. В принципе, не следует пренебрегать таким удобством и использовать каркас, например для вставки в модель дома уже готовой мебели, какого-то хлама и т.п. – это полезно еще и с точки зрения экономии ресурсов (не нужно заново создавать то, что можно вторично использовать).

Принцип 3 – это метод оперативного вмешательства в готовые модели. Для произвольной линковки одной модели к другой выполняется следующая последовательность действий:

1. в редакторе выбирается объект, который должен быть прикреплен;
2. затем, при нажатой кнопке shift, выбирается объект, к которому нужно присоединить (этот объект обязательно должен содержать в себе каркас);
3. далее открывается консоль и вводится команда g\_linktostructure.

В случае соблюдения всех пунктов операции линкуемый объект окажется прикрепленным к целевому так, как будто он прописан в {extender “structure”.......} целевого объекта. Связь остается при сохранении карты. Для разрыва такой связи нужно просто выделить присоединенный объект (с кнопкой ctrl) и удалить его.

## Связи между частями структурной модели

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

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

Система довольно проста с точки зрения ее настройки моделером. Необходимо создать кость fix##, прилинковать ее к базовой кости данной части модели и поместить ее так, чтобы в полностью собранной структурной модели эта кость входила внутрь любого контактного волюма той части, на которую данная часть «опирается». Имеется в виду, что в свойствах volume опорной части должен быть включен параметр contact (он включен по умолчанию, если не указан параметр clear) – чаще всего это объем с параметром Tags=body, т.е. отвечающий за прочность модели.

После экспорта модели с костями fix## необходимо прописать в .def следующее:

```
{extender "structure_bone"
	{hold "01"}
}

```

где «01» – это номер кости fix01.

Костей fix## может быть несколько для того, чтобы данная часть модели опиралась на несколько опорных частей. Например, в данном коде есть 3 кости fix. При этом часть модели может быть разрушена при разрушении хотя бы одной опорной части, тогда запись в .def должна выглядеть примерно так:

```
...
{hold "01"}
{hold "02"}
{hold "03"}
...

```

Либо данная часть может «держаться» до тех пор, пока все опорные части не будут разрушены:

```
...
{hold "01" "02" "03"}
...

```

Либо данная часть «держится» на одной «значительной» опоре и на двух «незначительных» (которые могут быть разрушены по отдельности, но не сразу):

```
...
{hold "01"}
{hold "02" "03"}
...

```

Таким образом, может быть организована структура со связями, позволяющими принудительно разрушать некоторые элементы конструкции (не обязательно расположенные рядом!) при разрушении других элементов.

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

## Специфика зданий

Основная масса структурных объектов в проекте – это здания. Помимо общих требований к моделям вообще и структурным моделям в частности, для зданий существует еще ряд требований. Кроме того, что названия каждой части структуры должны быть абсолютно уникальными, в названии части должно содержаться краткое ее «описание» (к какой части дома она относится). Например: 177\_f1с1, где «117» – название модели, «f1» – номер этажа (floor), «с1» – угол дома (нумерация желательно по часовой стрелке), и т.п. Таким образом, название частей дома должно включать в себя часть названия дома в целом и наиболее сокращенный вариант маркировки данной части. В здании практически всегда присутствуют окна и т.п. проемы, которые могут быть использованы для посадки в них снайперов.

Если возникает необходимость сделать на модели "место" для человека, необходимо прописать следующие параметры:

```
{placer
	{place "1" {attach  squat_lie}{linkbone "attach1"}}
 	{place "2" {attach  snipe_cover}{linkbone "attach2"}}
 	..............................
 }
 {boarder
 	{node "attach1"}
 	{node "attach2"}
 	...............
 }

```

Количество place = количество attach! Блок {attach squat\_lie} задает позу, в которой будет находиться солдат, занявший место на соответствующем аттаче. Позы:

* squat\_lie – стрелять с колена;
* snipe\_cover – стрелять стоя (обычно для окон);
* open\_lie – стрелять лежа.