Разбивающееся стекло

В принципе, то, что я напишу здесь — есть и в Samples_F — официальных примерах моделей от БИСов, которые можно скачать бесплатно через Стим, но возможно, кому то эта статья пригодится…

Итак, для примера я создал только одну раму с тремя стеклами:

рама со стеклами

Текстуры, как и материалы стекла есть в А3 по пути «A3\structures_f\data\Windows»

Если используете свою текстуру, то она естественно должна иметь прозрачность.

сами стекла не должны быть из «двухсторонних полигонов» — т.е. что бы две плоскости с обоих сторон не имели общих точек

 

Кто не знает принцип «разбивания» стекла в Арме — объясняю: при легком повреждении на наше стекло (1) накладывается материал, который делает стекло визуально треснутым\разбитым (2)

Когда дамаг стекла достигает 100% — это стекло просто прячется, а вместо него анхайдится (от слова unhide) стекло с заведомо «разбитыми» текстурой и материалом (3). Все это происходит в миг, и сопровождается вылетами партиклов в виде кусочков стекла, что дает вроде как правдоподобный эффект. 

 

window_set_ca   destruct_half_window_set_ca   destruct_full_window_set_ca

Значит для этого мы должны дать имена каждому стеклу, чтобы они «дамажились» отдельно друг от друга:

glass_1_hide glass_2_hide glass_3_hide

glass_1_hide

Теперь копируем их же, и называем уже не glass_1_hide glass_2_hide glass_3_hide, а glass_1_unhide glass_2_unhide glass_3_unhide и уже на скопированные стекла накидываем другую, разбитую текстуру, и материал (3)

Эти стекла будут заменять целые, а промежуточный вариант (2) будет накладываться материалом через конфиг.

Будет внимательны, при копировании объекта копируются и его селекшены. Проще всего скопировать стекла в любой другой ЛОД, и в нем _hide изменить на _unhide, а затем скопировать обратно в нулевой ЛОД.


Следующий шаг — это создание дополнительных ЛОДов.

Geometry LOD

ЛОД геометрии (коллизии) нужен только для того, чтобы сквозь объект нельзя было пройти как игроку, так и ботам (за исключением DayZ SA, где используется отдельный navmesh, который включает в себя всю поверхность земли, и геометрически простые формы объектов)

В отдельной статье я писал про создание коллизии, но напомню и здесь —

  1. коллизийка должна состоять из геометрически простых фигур (боксов)
  2. вся коллизийка должна быть разбита на компоненты (Structure -> Topology -> Find Components)
  3. все компоненты должны иметь вес (выставляется в окне оксигена)
  4. коллизийка недолжна быть вровень со стенами, а должна немного выперать за них (иначе проглядывание «сквозь текстуры» обеспечено)

Кстати на ЛОД геометрии еще влияет взаимодействие с другими объектами, как например гранаты. Раз у меня есть форточка без стекла — соответственно ее я коллизийкой не закрывал:

window geometry

Боксам стекол даем такие же имена как в основном ЛОДе — glass_1_hide glass_2_hide glass_3_hide — это нужно для того, чтобы при разбитии стекла, гранаты могли беспрепятственно пролетать.

View Geometry LOD

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

window view geometry

Fire Geometry LOD

данный ЛОД взаимодействует только с пулями. В нашем случае данный ЛОД можно вообще не создавать — тогда его роль будет играть обычный Geometry, но это будет не совсем правильно, т.к. коллизийка должна быть чуть больше чем сама модель, и толщина бокса не желательна менее 30 сантиметров (иначе такой бокс будет глючить, и в определенный момент можно сквозь него пройти), а вот в ЛОДе Fire Geometry от толщины бокса влияет его «пробиваемость» — чем тоньше — тем проще его прострелить + зависит от наложенного на него материала.

window fire geometry

Точно также даем имена стеклам glass_1_hide glass_2_hide glass_3_hide и накидываем на боксы стекол материалы стекла, который находится по пути a3\data_f\penetration\glass_plate.rvmat

window glass material

LOD Hit Points

данный ЛОД напрямую связан с Fire Geometry — он нужен для регистрирования повреждений, будь то взрывы рядом, попадания пуль, столкновение с другим объектом.

нам нужны только точки в центре каждого стекла, которые называем glass_1 glass_2 glass_3

window hitpoints

LOD Memory

В этом ЛОДе нам нужно создать всего лишь три точки — по точке в центре стекла, и назвать их Glass_1_effects Glass_2_effects Glass_3_effects — от сюда будут вылетать партиклы разбитого стекла:

window memory

Забыл одну немаловажную вещь: модель лучше размещать «на сетке», а у меня она сквозь модель проходит, и в таком случае, в редакторе Армы моделька по умолчанию будет устанавливаться немного под землей. Для этого я воспользуюсь инструментом move с нажатой галочкой apply to all lods и подниму на метр вверх все ЛОДы.

window_move

На этом с моделью все, осталось только добавить model.cfg — конфиг, который будет отвечать за подмену стекол:

Это стандартный конфиг из Samples_F, но я удалил из него все, кроме анимации замены стекол

Помещаем конфиг рядом с моделью, запускаем бульдозер, и переключая анимки (enter, backspace), крутим колесиком для их выполнения. Если цельные стекла заменяются разбитыми — значит и в самой игре будет все работать. Осталось написать конфиги, и паковать:

Или же можете скачать исходник, который я делал для этого урока. Объект находится в «сооружениях»

window lesson


А теперь усложним немного задачу, и сделаем одну раму открывающейся.

Первым делом надо добавить новые селекшены во всех ЛОДах открывающейся рамы. назовем селекшн » window_1 «

window openselection

а так же добавить новые точки в ЛОД Memory — это точка взаимодействия » window_1_trigger «, и ось открывания рамы » window_1_axis «

window axis

Далее в model.cfg надо добавить в класс skeletonBones нашего скелетона новый селекшн » window_1 «, а чтобы стекло двигалось вместе с рамой, нужно связать их добавив в класс стекла селекшн рамы

А так же нам надо добавить анимацию поворота рамы в класс Animations:

На этом этапе анимация должна работать в бульдозере.

Теперь правим конфиг, для взаимодействия в игре:

добавляем класс window_soucre в  class AnimationSources:

Добавляем код взаимодействия » class UserActions » (под классом animationSources)

И добавляем в основной класс окна, куда нибудь под классами анимации строки

На этом все. Окна открываются, и разбиваются.