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

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

ачем нужны структурные объекты?


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


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


В состав структурной модели входят каркас и подключаемые к каркасу части. Возможны три варианта организации:
  1. Каркас представляет собой модель без полигональных видов, имеет в своем составе только корневую кость basis, к которой прилинкованы каркасные кости (далее КК), предназначенные исключительно для последующей линковки к ним рисуемых частей конструкции. КК именуются произвольно, но с таким расчетом, чтобы было понятно, за какую часть отвечает данная КК (например, назвать ее corner03 для углового куска здания, wall05 – для отдельной стены). Желательно давать максимально сокращенные, но контекстно-понятные имена (не corner03, а cor03 или c03), поскольку имя КК отображается в редакторе и может не поместиться в текстовом поле панели управления.
  2. Каркас представлен самой иерархией модели и к указанным в .def костям впоследствии прикрепляются необходимые части модели.
  3. Несколько моделей могут быть прикреплены к другой модели в редакторе игры специальным образом (см. далее).
При построении структурной модели по принципу 1 создается иерархия, упомянутая в Другие элементы, подпункт 5.
NB: кость basis должна быть ориентирована в сцене так же, как и пивот «целой» версии модели, все КК должны располагаться относительно basis так же, как пивоты готовых частей структуры. В простейшем случае basis находится там же, где пивот неразрезанной модели, а КК – на местах расположения пивотов частей. Но для визуального удобства кость basis вместе со своей иерархией может быть смещена в сторону от основной модели.
К кости basis линкуются КК без каких-либо прописанных свойств. В кости basis прописываются только следующие строки:
Type=game_entity
Model=.......
Structure
Путь к папке с экспортированной моделью здания (Model=) указывается в подпапку entity/construction/... Экспорт других классов моделей производится в соответствующие папки.
В результате экспорта в целевой папке создаются 2 файла: .def и .mdl. Файл .def будет содержать примерно следующее:
{game_entity
 {Extension "church_basis.mdl"}
}
Для того, чтобы структура функционировала, нужно вписать блок {extender "structure"} и указать, какие части модели крепятся к указанным КК. В примере КК названы «1», «2», «3», «4»:
{game_entity
 {Extension "church_basis.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## (см. ниже).


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


Исторически сложилось так, что здания в игре разрушались либо целиком, либо по кускам, захватывающим все возможные этажи от земли до крыши. Это не давало возможности разрушить отдельно какой-нибудь верхний этаж так, чтобы при этом не возникало ситуаций, когда разрушенный нижний этаж под соответствующим куском дома оставит верхний кусок висеть в воздухе. Для того, чтобы решить эту проблему и позволить создавать произвольно разрушаемые модели зданий, была создана система связей между частями структурного объекта.
Задача системы связей – зафиксировать факт разрушения той части объекта, на которую «опирается» текущая его часть и принудительно применить процедуру разрушения текущей части. Чаще всего связи используются для частей модели, составляющих верхние этажи зданий или другие «подвешенные» элементы, основание под которыми может быть разрушено в игре.
Система довольно проста с точки зрения ее настройки моделером. Необходимо создать кость 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» – угол дома (нумерация желательно по часовой стрелке), и т.п. Таким образом, название частей дома должно включать в себя часть названия дома в целом и наиболее сокращенный вариант маркировки данной части. В здании практически всегда присутствуют окна и т.п. проемы, которые могут быть использованы для посадки в них снайперов. В таком случае объемы стен должны быть прорезаны в соответствующих местах объемами окон со свойствами, указанными ниже:
Ошибка создания миниатюры: Не удаётся сохранить эскиз по месту назначения
где Touch=1 и Tags=attach,1 указывает на то, что при указании курсором на данный объем, курсор изменит свой вид на символ «посадки» и после клика мыши юнит встанет на место, обозначенное костью attach1, которая обычно расположена сразу за окном на полу (расстояние от окна примерно 0,4 м – устанавливается экспериментально). В случае, если юнит должен встать в разломе стены или подобном проеме (не вырезающем дыру в стене), нужно в проем поставить дополнительный объем со свойствами, перечисленными на рис.2, кроме Hole. Желательно, чтобы нумерация аттачей совпадала с нумерацией окон и отверстий (hole1 ~ attach1).
Для того, чтобы линковка солдат могла работать, необходимо в .def модели прописать следующее (после props):
{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 – стрелять лежа

Комментарии

Популярные сообщения из этого блога

Список команд триггеров

Начало работы в редакторе миссий

Cписок анимаций