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

Материал из BestWay wiki
Перейти к: навигация, поиск

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


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

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

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