Двери и все что с ними связано.

Рано или поздно каждый человек который делает какой-либо транспорт сталкивается с вопросом как же ему сделать двери? Сегодня я расскажу как можно сделать простейшие двери, которые будут открываться\закрываться при посадке\высадке персонажа. Итак приступим:

  1. Первое что нужно сделать — это создать сами двери. Предположим что ваша модель уже имеет двери отдельной моделью (как у меня):

Чтобы игра в дальнейшем понимала что именно этот набор полигонов наша дверь — выделяем её и создаем селекшен с названием двери (у меня это DoorL_1DoorL_2DoorR_1DoorL_2, так как у меня 4 двери).

2. Идем в ЛОД Memory. Тут вам необходимо указать оси, вокруг которых будет вращаться ваша дверь при открывании (если у вас дверь-слайдер то тогда указывается ось перемещения). Создаем 2 точки (клавиша Insert) друг над другом, выделяем их и делаем селекшен с названием вашей оси ( у меня это DoorL_1_axisDoorL_2_axisDoorR_1_axisDoorL_2_axis), таким образом делаем оси для всех ваших дверей:

Примечание: у меня оси задних и передних дверей находятся в одном месте, так как по задумке — передние двери должны открываться назад, а задние — вперед.

3. С моделью все. Открываем model.cfg. Идем в скелет вашего авто ( у меня это MM_mercedes_g4_w31, если вы не знаете где у вас скелет — то в машинах он как правило наследуется от класса CAR: ).  В классе скелета находим строчку skeletonBones[] =… и в скобках, которые принадлежат этой строке дописываем ваши кости:

Обратите внимание, что в конце последней строчки ЗАПЯТАЯ НЕ СТАВИТЬСЯ.

skeletonBones[]=
{
«DoorL_1″,»»,
«DoorL_2″,»»,
«DoorR_1″,»»,
«DoorR_2″,»»
};

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

skeletonBones[]=
{
«DoorL_1″,»»,
«glass1″,»DoorL_1»,
«DoorL_2″,»»,
«glass2″,»DoorL_2»,
«DoorR_1″,»»,
«glass3″,»DoorR_1»,
«DoorR_2″,»»
«glass4″,»DoorR_2»
};

Важно!!! Если делаете двери со стеклом, то в O2 (OB) селекшен двери НЕ должен включать в себя НИ ЕДИНОГО полигона вашего стекла. Т.Е ваша дверь и стекло на ней сввязываются только привязкой в скелете и никак иначе!!!

Так же чтобы стёкла бились как положено в model.cfg ищем класс Car и в списке костей удаляем строки привязки стекла к damagehide. Пример таких строк:

«glass1″,»damageHide»,
«glass2″,»damageHide» и т.д

 

4.  Все в том же model.cfg идем ниже и ищем  class Animations: Animations. В конце этого класса вставляем следующее:

class DoorL_1 
{
type=»rotation»;              //тип анимации
angle0=0;                        //начальный угол  в вашей анимации
angle1 = (rad 60);           //конечный угол  в вашей анимации
axis=»DoorL_1_axis»;   //ось в лоде Memory вокруг которой вращаеться обьект при проигрывании анимации
memory=1;
minValue=0;
maxValue=1;
minPhase=0; 
maxPhase=1;
source=»DoorL_1″;        //контроллер анимации, параметры которого указываются в config.cpp (звук при проигрывании, время работы анимации и т.п.)
sourceAddress=0;
selection=»DoorL_1″;    //селекшен, который участвует в анимации ( тот что мы создавали в начале гайда).
};

То же самое проделываем для всех дверей.

Теперь можно пойди в бульдозер и проверить работоспособность ваших анимаций. (если кто не знал — переключение анимаций в бульдозере клавиша Enter):

5. Если все работает как надо — идем в config.cpp. Ищем в основном классе вашего автомобиля строчку  class AnimationSources : AnimationSources {}; если таковой нет — создаем. В данном классе вставляем:

class DoorL_1
{
source=»door»;
animPeriod=1.0;                                              // время за которое полностью проигрывается анимация
sound = «»;                                                      // звук, который проигрывается при анимации
soundPosition = «DoorL_1_axis»;                // позиция в лоде Memory , от которой исходит звук при проигрывании 
};

То же самое проделываем для всех дверей.

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

driverDoor=»DoorL_1″;   //для прокси водителя
cargoDoors[]=
{
«DoorR_1»,                  // для прокси пассажира с ID 1
«DoorR_2»,                  // для прокси пассажира с ID 2
«DoorL_2»,                  // для прокси пассажира с ID 3
«DoorR_2»,                  // для прокси пассажира с ID 4
«DoorL_2»                   // для прокси пассажира с ID 5 и т.д
};

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

6. Вы так-же можете привязать конкретные пассажирские места к индивидуальным точкам посадки. Для этого:

a) Создаем в ЛОДе Memory дополнительные точки посадки пассажиров (pos cargo 1, pos cargo 2 и т.д) и точки направления пассажиров при посадке (pos cargo 1 dir, pos cargo 2 dir и т.д).

b) В Config.cpp в основном классе вашего авто добавляем строчки (в кавычках указывается название точки):

memoryPointsGetInCargo[] //точки посадки пассажиров
{
«pos cargo»,                // для прокси пассажира с ID 1
«pos cargo 2»,                // для прокси пассажира с ID 2
«pos cargo 1»,                // для прокси пассажира с ID 3
«pos cargo 2»,                // для прокси пассажира с ID 4
«pos cargo 1»                // для прокси пассажира с ID 5 и т.д
};

memoryPointsGetInCargoDir[] = //точки направления пассажиров при посадке
{
«pos cargo dir»,                // для прокси пассажира с ID 1
«pos cargo 2 dir»,                // для прокси пассажира с ID 2
«pos cargo 1 dir»,                // для прокси пассажира с ID 3
«pos cargo 2 dir»,                // для прокси пассажира с ID 4
«pos cargo 1 dir»                // для прокси пассажира с ID 5 и т.д
};

Ну вроде все. Идем в игру и проверяем. В игре мы должны увидеть:

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

P.S Если найдете где-либо в статье ошибку или не точность — отписывайтесь в комментариях — буду исправлять))