Структурные объекты
Структурные объекты
ачем нужны структурные объекты?
Модель может представлять собой набор отдельных частей, соединенных воедино с помощью так называемого каркаса, а объект представляемый такой моделью – называется структурным.
Такими моделями обычно являются модели зданий и сооружений, которые предполагается разрушать «по частям», т.е. при попадании снаряда в определенную часть дома рушится не все здание, а те части, которым были нанесены достаточные повреждения. Чем мельче разрушаемые части конструкции, тем хаотичнее будет выглядеть картина разрушения. Однако чрезмерное дробление модели приводит к неоправданным затратам как труда моделера, так и компьютерной памяти, выделяемой для модели. В каждом конкретном случае нужно найти необходимый минимум разбиения модели на части, чтобы при этом картина разрушений выглядела более-менее реалистично. Чаще всего линии разрезки модели достаточно хаотичны, но могут возникнуть ситуации, когда потребуется сделать, например, строго определенный пролом в стене, обусловленный какими-то игровыми потребностями. Разбиение модели на произвольные части помимо прочего вызывает некоторые неудобства, скажем, в текстурировании таких частей по отдельности. Все эти аспекты необходимо учитывать при создании структурных моделей и к началу работы над моделью иметь, по крайней мере, четкое представление об общей структуре и предполагаемых линиях разреза. Желательно подготовить некое подобие проекта здания, где моделер для себя отмечает важные моменты, которые нельзя упускать (геометрические детали, материалы и прочее). Кроме простого разделения модели на части каркасные структуры используются для создания нескольких вариантов внешнего вида объекта. Например, на данной стене дома могут быть какие-то окна, а может их не быть. Для этого создается две версии одной и той же части – с окнами и без них. Границы для стыковки с другими частями дома при этом должны совпадать. Важно учесть, что подобные варианты частей структуры должны иметь раскладку на той же текстуре, что и базовый вариант (крайне не желательно делать исключения из этого правила!), иначе увеличение количества текстур может привести к падению производительности игры в целом.
Помимо внешних геометрических форм (которые должны быть подготовлены обязательно) также нужно учитывать то, какая картина откроется перед игроком, если данный кусок дома будет разрушен при взрыве – внутри дома всегда есть дополнительные стены, полы, картины, лестницы, мебель, печи и т.п. внутренние элементы. Если на крышу выходят печные и каминные трубы, будет очень хорошо, если та же труба внутри будет продолжена до соответствующей печи. А печь можно в таком случае выполнить отдельным элементом каркаса, дав ей шанс остаться неразрушенной при уничтожении внешних стен. Чем реалистичнее будет поведение модели в допустимых в игре ситуациях, тем выше будет общее качество модели. При экспорте структуры одинаковые части внутри модели ищутся по всей структуре и складываются в ее папку common.
Важно: рекомендуется первоначально полностью выполнить «целую» версию модели (включая полную раскладку всех текстур), а затем разбивать ее на части. Это сэкономит массу времени и усилий при последующих доработках модели. Стадию неразрезанной модели желательно сохранить в отдельный файл, с которым впоследствии можно выполнять такие операции, как обновление лайтмапы.
Организация структурной модели на примере здания
В состав структурной модели входят каркас и подключаемые к каркасу части. Возможны три варианта организации:
- Каркас представляет собой модель без полигональных видов, имеет в своем составе только корневую кость basis, к которой прилинкованы каркасные кости (далее КК), предназначенные исключительно для последующей линковки к ним рисуемых частей конструкции. КК именуются произвольно, но с таким расчетом, чтобы было понятно, за какую часть отвечает данная КК (например, назвать ее corner03 для углового куска здания, wall05 – для отдельной стены). Желательно давать максимально сокращенные, но контекстно-понятные имена (не corner03, а cor03 или c03), поскольку имя КК отображается в редакторе и может не поместиться в текстовом поле панели управления.
- Каркас представлен самой иерархией модели и к указанным в .def костям впоследствии прикрепляются необходимые части модели.
- Несколько моделей могут быть прикреплены к другой модели в редакторе игры специальным образом (см. далее).
При построении структурной модели по принципу 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 – это метод оперативного вмешательства в готовые модели. Для произвольной линковки одной модели к другой выполняется следующая последовательность действий:
- в редакторе выбирается объект, который должен быть прикреплен
- затем, при нажатой кнопке shift, выбирается объект, К которому нужно присоединить (этот объект обязательно должен содержать в себе каркас)
- далее открывается консоль и вводится команда 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 – стрелять лежа
Комментарии
Отправить комментарий