Архивы: по дате | по разделам | по авторам

Фанатские развлечения: трёхмерное картостроительство - 2

АрхивВ фокусе
автор : Роман Георгиев   25.10.2004

Часть вторая. Естественный порыв любых поклонников трёхмерных шутеров с открытой архитектурой (иначе говоря, возможностью создания собственных уровней) - попытаться нарисовать собственную карту.

- Продолжение. Первую часть статьи читайте здесь.

Итак, как уже сказано, при совершении операции Make Hollow, нас подстерегает первая "засада".

Дело в том, что это теперь не один brush-блок, а шесть (если мы всё-таки оставили изначальную фигуру параллелепипедом) или больше - по количеству граней. Иными словами, был один brush, а стало весьма много. Соответственно, если возникнет необходимость перетащить данную фигуру в другое место на карте, выделять каждую грань - замучаешься. От этого, впрочем, есть неплохое лекарство.

Не снимая выделения с получившейся полой фигуры, находим на экране окошко Console и жмём N. Попадаем в раздел Entity с длинным списком возможных команд. Находим там func_group и два раза кликаем на него мышью. Внутри выделенной фигуры в окне XY возникает надпись func_group, которая обозначает, что все выделенные brush-блоки теперь сгруппированы и при следующем выделении будут рассматриваться программой как единое целое.

Производить данную функцию просто необходимо, когда в стенах начинается "прорубка" окон и дверных проёмов.

А делается это следующим образом. Для начала, нужно создать brush-блок, по форме повторяющий предполагаемый дверной или оконный проём, но более толстый, чем стена (назовём его "режущим").

Рисовать можно только в плоскости XY, а окна и двери обычно прорубаются перпендикулярно таковой плоскости. Стало быть, после того, как вы получили нужной формы brush (или комбинацию таковых, если окно - не просто прямоугольник), его надо развернуть в нужном направлении. Для этого служат операции Selection->Flip X, Flip Y, Flip Z (для зеркального отображения по соответствующим осям), Selection->Rotate X, Rotate Y, Rotate Z (для поворота по соответствующим осям под углом 90o), и Selection -> Arbitrary rotation для поворота на произвольный угол по произвольной оси.

Когда режущий brush занял положенное положение в пространстве относительно поверхности, размещаем его в том месте, где окно или дверь должны быть, и, удостоверившись, что ничего лишнего не задето, а не лишнего не упущено, производим операцию Selection->CSG Substract. В результате стена оказывается "пробита", хотя на самом деле, она просто раздроблена на несколько разной формы отдельных Brush-блоков, которые смыкаются таким образом, чтобы в интересуемом месте образовался проём, по форме повторяющий "режущий" блок.

Если надо прорезать несколько окон или дверей, то сначала надо сделать нужное количество копий режущего brush'а (дубликат выделенной фигуры делается нажатием клавиши пробела), расставить их по своим местам, выделить все и только после этого "прорезать" (CSG Substract).

И вот здесь нас ждёт засада номер два.

Дело в том, что игра должна происходить исключительно в закрытом, больше сказать, герметичном пространстве, чтобы нигде и никогда не "светилась" та серая пустота, которая окружает ваши карты. Если ваша карта ограничивается одним помещением с окошками, то откомпилировать её не удастся не только потому, что мы пока ещё нигде не разместили стартовую позицию игрока и ничего не увидим по причине отсутствия источников освещения, но и потому, что карта не герметична (Leaked).

Способов борьбы с этой напастью имеются два. Один дурной, другой умный. Дурной сводится к тому, чтобы разместить игровую "территорию" в необъятных размеров комнату, покрытую "небесной" текстурой (задать её можно в окне консоли Entities->Worldspawn, где надо задать в строке Key значение Sky, а в строке Value - название небесной текстуры; в центре окна консоли имеется маленький справочный раздел, в котором перечислены возможные значения). Это чревато крупными неприятностями, если вы забудете сгруппировать "небесную комнату", поскольку при случайном выделении и сдвигании небесной стены или потолка герметичность летит к чёрту. Кроме того, будут проблемы с выделением других brush'ей. Похоже, лишь богу и разработчикам HereticEd известно, чем программа руководствуется, выделяя не то, что её просят, а самый крупный brush-блок, находящийся под или над тем, что вы пытаетесь выделить в окне XY. Вообще, куда сподручнее что-то выделять в окне камеры, где визуализируется отрисовываемая вами карта (параметры визуализации задаются в общем меню Textures).

Второй способ борьбы с Leaks - это тщательно заделывать все дверные и оконные проёмы brush-блоками, покрытыми небесной текстурой. Другое дело, что если из окошка должен быть виден какой-нибудь выступ или угол соседнего здания, например, а оно "заделано небом", получится изрядный конфуз. Опять-таки, рекомендуется рисовать себе хотя бы примерный план будущей постройки.

И ещё одна деталь: для всяких обломков и скал нехарактерна правильность геометрических фигур, их имитирующих. Да и помещения не обязаны иметь исключительно правильную форму. Для искажения пропорций служат команды Manipulate Vertices (манипулирование углами - активизируется клавишей V) и Manipulate Edges (манипулирование краями - активизируется клавишей E). Это позволит несколько исказить пропорции ваших brush'ей, но программа может занервничать и сообщить вам, что "поверхность слишком сложна".

1. Brush-блоки служат для отображения крупных объектов. Мелочь вроде хозяйственной утвари с её помощью изображать бессмысленно, тем более, что и не получится как правило. Сначала стоит изучить список мини-объектов Entities - там найдётся немало полезного: факелы, фонари, даже метла нашлась. Естественно, есть и кое-какая мебель типа стульев, стола и трона. А вот с кроватями напряг. Больше сказать, имеется текстура постельных принадлежностей и даже подушки, однако, поскольку скруглённых поверхностей движок не знает, приготовьтесь к тому, что подушка,отображённая с помощью brush-блока, будет иметь очень острые края и мраморно-гладкие грани.

2. С использованием текстур есть две тонкости, которые, если не обращать на них внимание, могут сильно испортить всё удовольствие.

Первая - это соотношение площади текстурируемой поверхности, и номинального размера повторяющегося фрагмента текстуры. Тут необходимо искать компромисс: обширная поверхность, вся состоящая из крошечных кирпичиков или мелких плит, смотрится несолидно (аж в глазах рябит). А если слишком растянуть текстуру, она будет выглядеть чрезвычайно размыто. Особенно плохо это смотрится на горизонтальных поверхностях: чётко детализиованные объекты на размытом фоне могут выглядеть повисшими в воздухе.

Вторая мелочь - это ориентация текстур. Она должна соответствовать положению текстурированных объектов в пространстве, особенно по осям x,y.

3. Стены куда более выигрышно смотрятся при наличии плинтусов или фундаментов с соответствующим текстурным покрытием. Не стоит этим пренебрегать, равно как и злоупотрелять: количество brush'ей напрямую влияет на то, сколько времени и ресурсов отхватит под себя bsp-компиляция карты.

4. Для лестниц и галерей обычно и нелишне наличие перил. Особенно в парадных залах.

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

6. И совершенно тёмный, и сверкающий, как новогодняя ёлка (или среднестатистическая карта Quake III), уровень выглядит нелепо. "Карманы" темноты - вещь, безусловно, полезная, но следует быть уверенным в их целесообразности.

Текстуры

Вообще говоря, работу с Brush'ами и текстурами имеет смысл производить параллельно. Тем более, что если к карте уже подгружен тот или иной набор текстур, программа сама ухватится за отдельно взятое изображение, и будет облекать в него все новые стены, пока вы не замените его чем-то другим (не очень-то приятно смотреть на высокую стену, покрытую чётко повторяющейся текстурой подушки, например).

Весь brush-блок по умолчанию облекается в одну текстуру. Впрочем, на каждую грань можно насадить своё изображение: в HereticEd сие делается элементарно - ctrl+shift+left click по нужной поверхности, а далее выбираем нужную картинку. Проблема в том, что для пущей убедительности иногда хочется наложить на одну стену не одну, а две-три текстуры (фундамент, мох, кирпичи или извёстка). Для этого приходится отрисовывать два-три облицовочных brush'a и прилеплять их к стене... Мда, и количество многогранников растёт, ширится и крепнет, а они, между прочим, счёт любят...

И вот ещё одна засада: текстура не налепляется на brush, а скорее проецируется на него. соответственно, при перемещении brush'a, текстуру придётся заново подгонять - сдвигая по горизонтали, вертикали, и по ним же сжимая или растягивая эту самую текстуру. Учитывая, что с ящиками это особый гем... особая сложность, лучше сразу решить, где ваши ящики должны стоять.

Что удобно, так это возможность менять одну и ту же текстуру на другую, сколько бы brush'ей эта текстура не покрывала. Т.е. если у вас есть масса каменных стен, и вам нужно сменить текстуру камня, нет смысла выделять каждую стену и по очереди менять для них текстуры. Гораздо легче, выделив нужный brush с интересующей текстурой, произвести операцию Replace Texture.

Стоит особо отметить одну деталь: в Heretic II постоянно слышен стук шагов главного героя (в отличие от других игр на движках Quake/Quake II/Quake III, Corvus не является безногим "духом", совершенно бесшумно носящимся по уровням), а потому немаловажно задавать свой звук для каждой текстуры, в соответствии с её предполагаемым материалом, - и не забывать про это. На выбор предложены гравий, камень, металл и дерево. Будет довольно странно бежать по мраморной лестнице и слышать под ногами хруст гравия или звон металла. А между тем забыть про это - раз плюнуть.

Материал определяется в панели Surface Inspector (S).

Ну и последнее на сей раз: освещение

Основным источником освещения служит невидимый (т.е. невизуализируемый) сферический источник - 'Entity' под труднозапоминаемым и неожиданным названием 'Light'. Делается он элементарно: отрисовывается небольшой brush, после чего во вкладке 'Entities' (клавиша 'N') выбирается 'Light'. По умолчанию он - белого цвета, но это можно поправить, нажав клавишу 'K'. Тотчас перед вами появится стандартная палитра Windows, в которой можно выбрать любой цвет. Кроме того, можно задать стиль этого света из 12 возможных (по умолчанию указано 0 - стабильный, ровный, неизменный свет).

Помимо незримого Light имеется целый список всевозможных источников освещения, таких как лампы, факелы и так далее. В отношении факелов необходимо помнить, что они по умолчанию не анимированы (для этого есть соответствующий чекбокс), и если забыть это сделать, то получите только светящуюся подставку от факела (притом, что свет она очень даже будет излучать). Для настенных ламп необходимо задавать угол ориентации (angle), в противном случае, сама лампа может оказаться в стене, а наружу будет торчать только её крепёж.

И кроме того, имеется "псевдоисточник света" - env_fire, entity, генерирующий небольшой костёр. Почему-то программисты Heretic II не догадались, что огонь всегда даёт некоторое количество света: env_fire этим свойством не обладает, и стало быть, над ним надо отдельно создавать entity 'Light'.

И, опять-таки, не следует забывать, что много Entities игра не любит, как не любит она и широких открытых пространств, для которых трудно рассчитывать свет. Также желательно помнить, что компиляция карты займёт несколько часов.

Естественно, в данном обзоре все особенности не то что картостроения, но даже и отдельно взятого слабого редактора HereticEd охватить не удаётся. Возможно, когда-нибудь мы ещё вернёмся к этой теме.

© ООО "Компьютерра-Онлайн", 1997-2024
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.