Создание объектов различных типов

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

```

## Дом

У каждой части здания должны быть:

1. **Volume** – определяют волюм объекта, воздействие на объект, а также видимость.
2. **Fix** – определяют связи между объектами.

Так же есть кости линковки для юнитов **attach**, которые ставятся в возможных местах линковки (оконные проемы, проломы в стенах и т.д.).

Все кости каркаса линкуются к **basis** кости, это определяет положение частей дома в пространстве относительно цэнтра. Каждая кость каркаса (дальше по тексту КК) имеет такое же имя как и отдельная часть дома и должно быть уникально. В названии части дома должно содержаться краткое описание к какой части дома он относится. Например: 177\_f1с1

* «117» - название модели;
* «f1» - этаж по счету «floor»;
* «с1» - угол дома по счету «corner» (наименование по часовой стрелке);

* Если «w1» - стена дома по счету «wall».

В **Properties** кости **basis** прописывается тип модели, путь куда она экспортируется и определение что это **Structure** (см. **Структурные объекты**). В **Properties КК** ничего прописывать не нужно. В **Properties** отдельной части дома прописывается тип модели, путь куда она экспортируется и определение что это полигональная модель имеющая вид **Poly**.

Модель отдельной части дома линкуется к соответствующей КК. Пивот КК и самой модели должны совпадать по положению и направлению в пространстве.

В каждой части дома могут быть окна, которые линкуются к этой части. Окно имеет свой **Volume**, при попадании в который оно разбивается. При этом окно приобретает разбитый вид. Окно имеет 2 вида: целое и разбитое. Они должны занимать одинаковое положение в пространстве (допускается небольшое смещение моделей относительно друг друга для удобства выделения). В **Properties** модели окна прописывается определение, что это полигональная модель имеющая вид **Poly**.

Пивоты **xx** и целой модели окна должны совпадать и повернуты «на улицу» т.к. по направлению пивота определяется направление проигрывания спецэффектов.

В **Properties Volume** окна прописывается определение что это **Volume**, его свойства, а также прописывается **Tags=fire** или **smoke**, которые нужны для определения, какой спецэффект будет проигрываться при горении дома (огонь или дым).

У модели дома есть **Volume** определяющие объем дома, это **body\_vol** и **hole\_vol**:

* **body\_vol** – определяют основной объем дома.
* **hole\_vol** – прорезают отверстия в основном объеме **body\_vol**.

Наименование **Volume** производится с нумерацией от 1 до N. Имена **Volume** не должны повторяться внутри одной структурной единицы дома. В **Properties Volume body** прописывается определение что это**Volume** и его свойства. **Holed** означает что в этом **Volume** вырезаются отверстия. В этих **Volume** должна быть строка **Tags=body**. При взаимодействии с этими волюмами происходит разрушение дома. А так же прописывается **Tags=fire** или smoke, это нужно для определения какой спецэффект будет проигрываться при горении дома, огонь или дым.

В **Properties Volume hole** прописывается определение что это **Volume** и его свойства. **Hole** означает что этот Volume вырезает собой отверстие в основном объеме дома. в этих **Volume** должна быть строка **clear**.

Для линковки юнитов в доме, существуют специальные кости **attach**. Кость **attach** линкуется к кускам дома и пивот **attach** должен быть повернут Х-ом в сторону куда должен смотреть юнит. Кость **attach** связана своими параметрами с **Volume hole** или другим **Volume** на который будет наводиться курсор при линковке юнита.

Параметр Touch=1 задает свойство волюму для наведения на него курсора. Параметр Tags=attach,1 связывает этот волюм с соответствующим посадочным местом attach, где «1» имя места.

Для связи одного куска дома с другими, существуют специальные кости **fix**, которые определяют возможность разрушения, в зависимости от других частей дома. Эти кости линкуются к самому объекту, но должны быть внутри Volume объектов от которых они зависят (см. **Структурные объекты**).

## Дерево

Дерево представляет собой группу, пивот которой находится у её основания (Z = 0). В группу входят ствол, ветви и полигоны, имитирующие крону.

В процессе моделлирования полигоны основания ствола удалять не нужно, так как дерево в игре падает при контактах. Полигоны основания веток следует удалить. Высоту дерева нужно соотнести с настоящими деревьями. Высоту будующей кроны выбрать по назначению дерева, если оно должно служить укрытием для юнита, то нижние ветки расположить почти у самого основания. Кодом предполагается, что у дерева будет только один ствол с волюмом "**bole**" (**bole\_vol**), поэтому многоствольные деревья с далеко наклоняемыми или отстоящими друг от друга стволами делать не рекомендуется.

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

На ствол и ветки назначается основная текстура без включения альфа канала. Выбираем для материала **Standart** – **EclipseMtl** (после назначения **EclipseMtl** стоит зайти в опции дочернего материала **EclipseMtl** и включить там заново отображение текстуры). Для кроны назначается та же текстура, но расположенная в другом материале с включением альфа канала (альфа 1 бит).

При раскладке текстуры на стволе и ветках нужно учесть, что на зимних тексмодах внизу ствола рисуется снег, поэтому необходимо следить за поворотом полигонов на раскладке в одну сторону. Ветки следует раскладывать сужающимся концом в ту сторону, где будет заснеженный участок, так как заснеженные кончики веток выглядят более естественно. Если ветки будут располагаться не полого, а подниматься вверх, то для корректного освещения в игре необходимо использовать модификатор **Edit normals**. Для этого выделяем всю готовую крону и назначаем модификатор, нормали развернуть таким образом, чтобы они были как можно более равномерно повёрнуты от воображаемого центра наружу.

Для дерева создаются волюмы: **bole\_vol** для ствола (со свойством Volume) и **crown\_vol** для кроны (со свойством Volume). **bole\_vol** должен представлять собой вертикальный цилиндр, а **crown\_vol** – куб который охватывает гущу кроны. Если дерево предполагается укрытием для юнитов, **crown\_vol** можно продлить до основания ствола. Волюмы прилинковываются к группе. Нужно участь, что зона препятствия дерева генерируется автоматически по волюму ствола, поэтому чем вертикальнее будет bole\_vol, тем ближе зона к основанию. В свойствах группы (дерева) прописываем Poly (если анимации нет) или **CommonMesh** (если есть вертексная анимация), Type=game\_entity, Model=entity\flora\.... (путь экспорта модели, название модели).

Для деревьев в игре создаётся анимация **stir**, с помощью которой имитируется колыхание веток при наезде техникой и при падении.

### ***Создание анимации растительности***

Общий принцип анимации:

1. При контакте обьектов с деревом, крона дерева совершает колебательные движения вверх-вниз. Крона приходит в движение преимущественно снизу, причём все ветки реагируют в различное время.
2. Ствол совершает небольшое по амплитуте хлыстообразное движение. Так как направление удара в ствол неопределимо, то движение ствола всенаправленно-вращательное.

Общий принцип реализации:

1. Все анимируемые ветви поделить на 2-3 группы (для удобства им можно назначить уникальные цвета сетки - **wirecolor**), движение которых будет проходить противоположно или поэтапно. Т.е. одна группа вверх, вторая, с этого же кадра, вниз. Ветка колеблется с уменьшением амплитуды во времени. Если моделирование кроны выполненно правильно, то **pivot** ветки находится в месте её крепления к стволу. Анимация выполняется при включенном **Auto Key**. Для внесения элемента «хаоса» в анимацию, начало движения каждого элемента можно варьировать сдвигом ключей по шкале, изменением углов поворота.
2. Анимация ствола с кроной может выполнятся при готовой анимации колебания веток и закрытой группе дерева. Создаются общие ключи анимации для группы, где с уменьшением амплитуды происходит колебательное движение по осям XY, а направление наклона смещается со временем по оси Z.

Варианты практического выполнения:

* Каждая ветка может быть анимирована вручную.
* Всё дерево может быть реализовано единым обьектом (**Editable Poly**, **Editable Mesh**), к которому применён модификатор **Skin**. Управляющими костями могут быть **dummy** или др. обьекты. При этом выполнима анимация колебания веток и общая анимация ствола сразу. В свойствах группы при экспорте указывается параметр **NoSkin**.
* Дерево может быть анимируемо с помощью **Reactor**. Всем обьектам задаются свойства **Soft Body** или **Rigid Body** с соответсвующими настройками и вертексным закреплением веток.
* Группе может быть назначен и анимирован модификатор **FFD box**.

## Воронка

Воронки создаются по следующему плану:

1. Создаётся цельная модель, которая разделяется на два участка: внутренний кратер и внешний край.
2. Создаётся форма обрезки земли – **Shape** – **Line**. Которой даётся название **Cut**.
3. Выделяются обе мешевые модели и назначается модификатор **Edit Normals**. В режиме редактирования нормалей выделяются попарно нормали точек обоих моделей, которые находятся в одних координатах. Нормали приводятся в одинаковую позицию. Эти манипуляции позволяют избежать визуального излома на границе двух моделей и разницы в их освещении.
4. Обоим частям модели назначается одна и та же текстура, но разные материалы. Внутренняя часть имеет полностью непрозрачный материал.

## **Техника**

### **Настройка IK**

Если в модели используется инверсная кинематика, то в свойствах объектов, участвующих в кинематике, необходимо указать тип кинематического взаимодействия путем установки флажков привязки в закладке IK панели **Hierarchy** в 3DSMAX. Поддерживаются два вида привязки: призматическая (перемещение вдоль оси Z) и вращательная (вращение вокруг оси Z). Ось Z – это ось пивота объекта. Привязка призматическая задается установкой флагов **Bind** **Position** и соответствующего параметра **Axis Z**. Привязка вращательная задается установкой флагов **Bind** **Orientation** и соответствующего параметра **Axis Z**. Нельзя одновременно использовать оба типа привязки. Следует так же сбросить флажки привязки по **Axis X** и **Axis Y**. ИК цепочка в движке считается от эффектора и вверх по родительским костям, до тех пор пока не попадется **root** или кость с **terminator**'ом. Все остальные параметры не используются и не рекомендуются к изменению. По умолчанию используется IK-привязка без ограничения. Чтобы установить пределы IK необходимо в свойствах объекта написать следующее:

1. Для призматической привязки (метры):

```
**IKMin** = минимальное смещение относительно базового положения
**IKMax** = максимальное смещение относительно базового положения
**IKSpeed2** = максимальная скорость перемещения, метров в секунду

```

2. Для вращательной привязки (градусы):

```
**IKMin** = минимальный угол поворота базового положения
**IKMax** = максимальный угол поворота базового положения
**IKSpeed2** = максимальная скорость поворота, градусы в секунду

```

**Важно:** Следует отметить, что ограничение (-45˚, 45˚) противоположно ограничению (45˚, 315˚), а ограничение (45˚, -45˚) считается ошибочным и рассматривается как (-45˚, 45˚). Для старых моделей можно не менять параметры. Там применялся параметр **IKSpeed** (вместо нового **IKSpeed2**), который измерялся в 1/20 метра и радианах для соответствующих привязок.

### **Параметры колесной техники**

В модели такой техники должны быть кости **pivot\_front** и **pivot\_back** (соответствуют передней и задней осям), по ним определяется колесная база машины. Базовая кость модели должна находиться на одной линии с упомянутыми pivot'ами в проекции сверху.

Кости, имена которых начинаются с «**wheel**», вращаются при движении машины. Кости, имена которых начинаются с «**steer**», вращаются при повороте руля. На костях «**wheel**» и «**steer**» должна быть включена вращательная IK без лимитов. В базовой кости модели должны быть указаны параметры:

1. **SteerMax** = максимальный угол поворота руля, градусы.
2. **WheelRadius** = радиус колеса, метров (используется при анимации вращения).

В .def модели нужны следующие строки в блоке **{Chassis .......}:**

```
{Locomotion ("locomotion")
    {MaxSpeed    30} ; максимальная скорость, км/ч
    {StartTime   10} ; время разгона до макс.скорости с 0, секунды
    {BrakeTime   0.6} ; время торможения с макс.скорости до 0, секунды
    {StopTime    1} ; время остановки после отключения двигателя с макс.скорости до 0, секунды
    {Gears       0.35 0.5 0.7 1.0} ; передаточные коэф-ты коробки передач
    {RearGears   0.33 0.5} ; передаточные коэф-ты коробки передач
    {MaxSlope    30} ; максимальный преодолеваемый угол подъема
    {TurnRadius  3} ; мин.радиус разворота для маневров, метров
    {SteerOn     80} ; скорость поворота колес, градусов в секунду
    {SteerOff    80} ; скорость возврата колес в исх.состояние, градусов в секунду
    {SplineRadius 2} ; ограничение радиуса поворота на сплайнах, метров
}

```