Браши, вертексы и сетка


Если браши на Вашей карте после компиляции вели себя странно: исчезали полностью или местами, а может быть, даже и меняли форму, значит, Вы старались сделать нечто прекрасное, нечто непохожее на кирпич. Но допустили ошибку. В статье описаны примеры и причины возникновения распространенных ошибок брашворка, также дано описание некоторых способов брашворка, позволяющих избежать этих ошибок, кроме того описаны баги, связанные с «нетривиальным» брашворком и способы их исправления. Нетривиальный – это конечно громко сказано, просто обычно он подразумевает движение вертексов. В конце концов, об этом и речь: «как двигать вертексы». Однако целью этой статьи не ставилось научить читателя конкретным приёмам брашворка. Способов брашворка много. Надеюсь, после прочтения, Вам станет немного яснее сам принцип и Вы сами сможете разработать свой способ.

1. Как сделать ошибку (сдвинуть вертекс с узла):

------------------
Пример первый:
- сделать обычный браш (прямоугольный параллелепипед)
- повернуть на произвольный угол в горизонтальной плоскости
- еще раз повернуть в вертикальной плоскости, опять же на произвольный угол

Нажать для просмотра
рис 1

-------------------
Пример второй:
- сделать «необычный» браш (у которого есть стороны-пятиугольники)
- повернуть его один раз, но так, чтоб пятиугольная сторона наклонилась

Нажать для просмотра

рис 2

Тут важно, чтоб плоскость наклонилась не на 90 градусов, тогда будет ошибка - невидимый или полувидимый пятиугольник.

Как модификация, подойдет и такой способ всё испортить:
- сделать такой же пятиугольный браш (можно и "больше-угольный") и никуда его не поворачивать
- а просто обрезать этак наискосок инструментом "clip tool"
--------------------

Пример третий:
- сделать три браша буквой "П"
- и сдвинуть (потянуть за одну палку вниз весь агрегат) или повернуть эту букву на веселый, непрямой угол.
(Можно обойтись и двумя брашами составленными буквой "г" или "т".)

Нажать для просмотра
рис 3

Тут возникнут щели в местах стыковки брашей. (Назовем этот способ накосячить: "Сarve-метод". Хотя при помощи Сarve можно добиться багов намного интереснее и даже особо не напрягаясь.)
--------------------------------------------

В общем, подобные действия влекут сдвиг вертексов с узлов сетки. Согласитесь, очень просто допустить ошибку, используя обычные инструменты редактора.

2. Причина

Причина всех ошибок – сетка. Подробнее об этом:
А) Во время компиляции, а может быть и раньше (еще в формате map), вершины (вертексы) всех фигур будут перемещены в узлы сетки автоматически, без вашего участия и, на первый взгляд, довольно произвольным образом. В результате Ваша сложная, красивая фигура «покорёжится». Зато исправится сдвиг вертексов с узлов, который вы допустили.
Б) Далее компилятор не обсчитает, а значит и не отрисует искривленные грани либо целиком, либо частично (грани – это плоские многоугольники, ограничивающие браш) и ваша красивая, сложная, но уже покорёженная фигура станет еще и дырявой. В искривленную грань превращается плоская грань потому что (опять же), вертексы перемещаются в узлы сетки.
Рассмотрим внимательно, как это искривление происходит. Для этого нам понадобится четыре вертекса, которые как ни странно по совместительству являются вершинами нашей грани. Итак, четыре точки в трехмерном «сеточном пространстве», встречайте! Самый простой и наглядный первый пример (см. выше пример первый): построим кубик с длинной ребра в два юнита и сделаем все так, как в первом примере. Дальше пристально вглядимся в какую-нибудь грань (которая по идее у нас квадрат) и попробуем представить себе, что с ней сделает компьютер.

Нажать для просмотра
рис 4

Четыре точки уже в пространстве, уже не на одной плоскости. Получилась треугольная пирамида. А у пирамиды четыре грани-плоскости. И компьютер задается вопросом: «Собственно, где плоскость то? Хотя бы, какие из четырех две грани выбрать? » В зависимости от того, что решит компьютер, у нас получится или сразу «error», или «ничего страшного», или кривулина из двух треугольников вместо плоскости. Вот это чудо и называется искривленной гранью. Чем больше кубик, тем эффект незаметнее глазом (но не компьютером), а чем больше точек на грани (пятиугольник, шестиугольник), тем «интереснее» получится метаморфоза.
В) Здесь же имеет смысл предупредить об искривлении грани и по другой причине. Не стоит расслабляться, если все ваши вертексы предусмотрительно находятся в узлах. Вы, скорее всего, пробовали при знакомстве с «вертекс тулом» сдвинуть всего один вертекс у кубика (или даже исказить кубик до неузнаваемости). И наблюдали, конечно же, как некоторые поверхности-грани пропадали уже в самом редакторе, и при нажатии «alt+p» высвечивалось сообщение об ошибке. Так вот оказывается, что при манипуляциях с вертексами некоторые вертексы могут покинуть плоскость грани совсем на чуть-чуть, сместиться в соседний узел (всего на один юнит), но этого будет достаточно для искривления грани и даже «alt+p» не предупредит об ошибке, пока вы сами не увидите в игре на карте пропавший (прозрачный) кусок текстуры или пока не провалитесь за карту на ровном месте. А может, ничего и не заметите.

3. Методика (с лирическими отступлениями)

Краеугольный камень брашворка первый (треугольная пирамида):

Треугольная пирамида обладает замечательным свойством: все ее грани – треугольники. А треугольную грань нельзя искривить. Не может один из трёх вертексов «покинуть плоскость». Как ни двигайте три точки в пространстве, как ни старайтесь, всё равно плоскость через них проведётся. Компилятору-то как раз этого и надо, как раз от этого он и страдает в других, «не треугольных» случаях. Он хочет провести плоскость, но иногда, увы, не может. В общем, всё-всё-всё можно сделать из пирамид.
--------------------------------------
Недостатки:
- сложно работать с хитросплетением вертексов и ребер, очень легко запутаться.
- можно вывернуть ненароком пирамиду наизнанку. Это очень легко сделать, достаточно одну ее вершину переместить по другую сторону основания, получится ошибка.
- все полигоны-грани у вас будут треугольными, это будет сказываться на показателе wpoly в худшую сторону.
- количество «planes» может очень быстро достигнуть ограничения компилятора CSG (max 32768 planes).

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

Нажать для просмотра
рис 5

Поехали дальше.
Не все грани искривляются. Не искривляются треугольники и это мы уже проехали. Не искривляется любой многоугольник, лежащий в плоскостях «x/y» или «x/z» или «y/z» (или в спецплоскости, рис 18).
Есть и четырёхугольники, которые не искривляются. Вот давайте и разберемся с такими замечательными четырехугольниками. Все согласны, что через две точки можно провести прямую? Евклид прямо сейчас перевернулся, наверное, от такого вопроса.
Короче: Возьмем две параллельные прямые, отметим на одной две точки, на второй отметим две точки, соединим их и получим или два треугольника или один четырехугольник.

Нажать для просмотра
рис 6

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

Линии, которые компьютер считает параллельными:
Сначала двумерный случай.

Нажать для просмотра
Рис 7

Несмотря на то, что на рисунке изображены сплошные жирные желтые линии, важно лишь в каких точках эти линии пересекаются с узлами сетки. Расстояние между ближайшими такими точками – минимальное на этих прямых. Если попробуете сделать меньше, то компьютер сразу сместит вашу точку-вертекс в ближайший узел (точка же не в узле) и изменит угол наклона, а вместе с этим убьет и параллельность прямых. Мало того - все другие расстояния на такой прямой кратны этому минимальному расстоянию. Если же все оставить как есть, то компьютер примет эти линии за параллельные. В трехмерном случае принципиально ничего не меняется. Если в двумерном случае на рисунке написано «пример 8:1», что означает: «отложено по х - 8 клеток, по y - 1 клетка», то в трехмерном случае напишем «пример 8:1:3», что будет значить:
«отложено по х - 8 клеток, по y - 1 клетка, по z – 3 клетки». Строим обычный браш с размерами 8W,1L, 3H и проводим главную диагональ (соединяем красные вертексы на рисунке 7_1). Эта диагональ и будет минимальной длинной.

Нажать для просмотра
Рис 7_1

Потом построим еще один браш с кратными размерами (например 24W:3L:9H) и проведем такую же диагональ у него. Две такие диагонали (от двух брашей) компьютер принимает за параллельные и без раздумий проводит плоскость через четыре точки, лежащие на таких диагоналях. Есть и плоскости, которые компьютер считает параллельными, но об этом после (рис 10). Хорошо, что высчитывать эти все цифры не обязательно. Рехнуться можно, считая и строя такие браши. В общем, поехали дальше.
=================================================

Камень брашворка второй (многоугольная призма):

Призма – объемная фигура состоящая из двух граней – оснований (двух одинаковоугольников) и какого-то количества боковых граней. Боковые грани - всегда четырехугольники и их количество равно количеству углов оснований. У призмы, как и у любого многогранника, есть ребра (отрезки, ограничивающие плоские грани) и вершины (вертексы) Главное свойство призмы, которое используется при брашворке – все боковые ребра (рельсы) параллельны между собой, а значит, боковые грани не будут искривляться при движении вертексов. Первое что вас встречает в Хаммере – это четырехугольная призма или (что, то же самое) обычный браш «прямоугольный параллелепипед». Сколько углов у основания столькоугольная и призма.

Нажать для просмотра
рис 8

Вообще-то «в природе» без разницы, какой угол между плоскостями оснований, но мы не будем геройствовать в Хаммере и оставим эти плоскости параллельными, да еще и совпадающими с плоскостями сетки («x/y» или «x/z» или «y/z»). Работать с призмами легко и приятно, не то, что с пирамидами:
-строим из брашей основание в 2D виде (интересующий нас профиль)
-составляем из построенных призм прямую кишку (или змею, если угодно)
-шевелим группами вертексов, составляющих основание (не каждый по отдельности, а разом всё основание) , как нам надо.

Нажать для просмотра
рис 9

Таким способом удобно делать пещеры (внутренняя поверхность), трубы (наружная поверхность), стены (вертикально стоящие призмы), русла рек (горизонтально лежащие призмы), ну и много чего еще.

Недостатки:
-сечение в плоскости основания везде неизменно (первоначальная наша плоская фигура), поэтому крутые повороты труб или пещер выглядят неправдоподобно,
-к тому же таким способом не получится сделать поворот трубы на прямой угол и больше.

Достоинства:
-довольно просто манипулировать вертексами
-полигоны являются четырехугольниками, а не треугольниками – таким способом экономится будущий показатель wpoly.

Обратите внимание, что рабочие полигоны (по которым мы будем потом бегать или просто смотреть на них) – это боковые грани призмы, а стыкуются призмы основаниями (нерабочими).
=========================================================

Небольшая демонстрация движения вертексов, не искривляющего грани
Обычно для брашворка хватает движений в плоскостях сетки («x/y» или «x/z» или «y/z»), но всё-же никто не запрещает аккуратно сдвигать и в других плоскостях (которые компьютер считает параллельными):

Нажать для просмотра
рис 10

Как Вы понимаете, остановиться можно на любом шаге – ошибки не будет. Ни одна грань не искривляется. Обратите внимание, что получилось очень похоже на пример первый (рис 1).
=======================================

Камень брашворка третий (четырехугольная призма или "параллелепипед"):

Иногда имеет смысл использовать четырехугольные призмы, рабочими полигонами которых являются основания. Однако применение их довольно ограничено, и вяжет по рукам наше желание всласть подвигать вертексы.
Имеется в виду следующий способ:
- строим основу (прямоугольные браши), например, в плоскости x/y
- в плоскостях x/z и y/z двигаем группы вертексов по своему усмотрению (вверх-вниз, вправо-влево).

Нажать для просмотра
рис 11

-----------------------------------------------------------------------------------
Двигать необходимо сразу все вертексы (рядами), лежащие в одной плоскости, иначе получатся искривленные грани. Конечно, можно смещать ряды вертексов и в плоскости «x/y», и даже работать со всей заготовкой («основой» на рисунке 11) на любом этапе так же, как и с одним параллелепипедом (см рис 10), однако это уже работа для «гурманов».
Вот хороший пример такой "гурманской" работы, которую провел FiEctro в своем туторе о создании скал "Скалы это просто"

Нажать для просмотра

Здесь он использовал в основном параллелепипеды, двигая вертексы во всех трех направлениях (вверх-вниз, впаво-влево, вперед-назад), но и кроме того применялись многоугольные призмы: "колбасу" из них он расположил вертикально и основания призм смещал в горизонтальной плоскости, получился выпуклый угол скалы (который видно на рисунке на заднем плане)

А мы продолжим.
=======================================

Камень брашворка четвертый (треугольная призма)

У треугольной призмы основаниями являются треугольники. Поэтому имеется возможность двигать вертексы по одному, а не группой. Рабочими полигонами обычно являются треугольные основания. Кроме того треугольную призму можно использовать и как многоугольную (рабочие полигоны – боковые грани). Ограничение одно – одинокий вертекс можно сдвигать только вдоль бокового ребра.

Пример (делаем купол):
Шаг 1. Разметка.

Нажать для просмотра
Рис 12_1

Мы выделили в плоскости «x/y» некоторое количество точек (40 штук) и собираемся соединить их линиями так, чтобы были одни треугольники. Разметка приблизительна, если мы немного не попадем в разметочную точку, то страшного ничего не будет.

Шаг 2. Создание основы

Нажать для просмотра
Рис 12_2

Шаг 3. Сдвигание вертексов и итог.

Нажать для просмотра
Рис 12_3_1

Нажать для просмотра
Рис 12_3_2

В этом примере не было использовано то особенное замечательное свойство про движение одинокого вертекса. Оно тут не понадобилось. Но при создании рельефа, гнутых труб и прочей экзотики это свойство просто незаменимо. Если заинтересуетесь, то обратите внимание еще раз на текст относящийся к рис 6. Там речь идет как раз о боковых гранях треугольной призмы.
=======================================

Полезно помнить, что имеет смысл «сводить в плоскость» нерабочую поверхность, ту, которая вылезла с другой стороны от рабочей. Например, просто отстричь ее (отрез надо делать в стандартной сеточной плоскости). Это уменьшит вес карты (мегабайты) и количество «planes», которых, как известно не может быть больше 32768 штук.

4. Поворот

Закрепим примером всё, что говорилось выше.
Сделали мы антенну, откомпилировали и увидели результат:

Нажать для просмотра
Рис 13

Причина такого нехорошего результата в повороте. Ваяли ведь мы четырехугольными брашами в плоскости "y/z", а там все хорошо - никакие грани не искривляются. Но поворот фигуры уничтожил параллельность боковых ребер наших четырехугольных призм (тех линий, которые вдоль оси X. Я понимаю, что тяжеловато сразу представить, но иначе сказать не умею [про параллельность см. рис 7 и рис 7_1]).
Предлагаю провести эксперимент:
- сделаем "что-нибудь этакое" четырехугольными призмами,
- точно такое-же пирамидами (рис 5),
- потом сделаем копии,
- повернем копии и сравним с оригиналами.

Для начала четырехугольные призмы (помните, мы еще из них прямую кишку делали [рис 9]):

Нажать для просмотра
рис 14_1

Видно, что оригинал не попортился, а вот его повёрнутая копия сильно пострадала. Теперь пробуем повернуть точно такую-же фигуру, но составленную из пирамидок (составной кубик с рис 5). Кстати, чтобы посмотреть на искажения фигур не обязательно компилировать, достаточно сохранить карту в формате "*.map" и открыть этот мап-файл. Увидите почти то же самое, что и в игре. На следующем рисунке изображения уже с такого мап-файла (чего ерунду компилировать то?! :) ).

Нажать для просмотра
рис 14_2

Несмотря на то, что пирамидки тоже (как и призмы) корёжит поворотом, фигура сохраняет форму, не трескается. Искривления глазу не видны (на рисунке это тем более не видно), хотя они есть. Зато пирамиды дают в два раза больше полигонов (это нехорошо, для тех кто еще не в курсе). В общем вывод такой: поворачивайте очень-очень осторожно, а лучше не поворачивайте вовсе - делайте сразу по разметке (которую можно вертеть сколько угодно, всё равно потом удалять). А можно попробовать развернуть "что-нибудь этакое" из четырехугольных призм способом, который нарисован на рис.10

5. Баги (зеркальный коридор, непроходимая поверхность)

Допустим, Вы сделали все правильно, но если после компиляции вы не обнаружили никаких багов, то вам крупно повезло.
--------------------------------------------------------
Зеркальный коридор (hall of mirrors effect).

Нажать для просмотра
рис 15

Как мы видим, эффект такой же, как будто браш покрашен текстурой «NULL». То есть куда-то выпал кусок текстуры. Куда?!!! Как вернуть? Насчет «куда» есть догадка: «компьютер запутался в вычислениях и решил, что этого полигона не видно, а значит и рисовать его не надо.» Предзнаменователем зеркального коридора является предупреждение в лог-файле: «Warning: Leaf portals saw into leaf». Чем таких предупреждений больше, тем больше вероятность, что Вы обнаружите зеркальный коридор. Теперь про «как вернуть кусок текстуры на место»:

--------------------(я так не пробовал, но слышал советы)--------------
- компилировать без компилятора VIS (из каждой точки на карте прорисовываются вообще все полигоны, об оптимизации карты забудьте)
- перевести нехороший браш в «entity»: «funс_wall» или «func_illusionary»,
- как модификация предыдущего: «накрыть» непослушный браш иллюзорной энтитёй «func_illusionary» (создать «entity», такой же, как и браш, но чуть «покороче», чтоб «entity» не вылезал за карту) а сам браш закрасить НУЛЛом (чтоб wpoly не добавлял)

---------------------(я так пробовал и у меня получалось)---------------
- прописать компилятору VIS параметр «-full» (уменьшает количество «Warning»)
- «плясать с бубном над вертексами»: двигать не сильно заметно вертексы, меняя «геометрию» карты
- использовать хинт-браш, о котором чуть подробнее:

Нажать для просмотра
рис 16

Красным выделены браши, чьи куски полигонов (заметьте, не обязательно целые полигоны) пропадают в игре. Я построил один большой хинт-браш, окружающий эти нехорошие полигоны «забором». Обратите внимание, что дополнительных полигонных разрезов нет: хинт-текстура проходит строго по стыку брашей (где и без нас уже полигоны разделены), а скип-текстура (которая тоже оказывается, режет полигоны) просто отсутствует. Идея в том, чтобы создать дополнительный vis-объем («аквариум», лист – называйте, кому как нравится) или даже дополнительный портал (перегородку между аквариумами), чтобы компьютер обратил особое внимание при просчете видимых полигонов в этом месте.
И, как обычно, есть «но»: НО после создания такого хинт-браша у меня появился зеркальный коридор в другом месте. Тогда я создал второй хинт-браш в том другом месте. А потом в ходе работы первый хинт-браш удалил (для эксперимента), да еще и изменил немного рельеф (геометрию). В итоге текстуры не пропадали, зеркальных коридоров не обнаружилось. В общем вывод такой –баг устраняемый, но лучше с ним разбираться после окончания брашворка, а во время брашворка не обращать на него внимания.
------------------------------------------------------------------------------------

Непроходимые плоскости (clipnodes).
Еще один баг – непроходимая и невидимая поверхность: бежишь по карте в игре и тут «бац!» - остановился (дорога перекрыта), или начинаешь вдруг на ровном месте забираться по невидимому холму под потолок и падаешь оттуда, или «в чистом поле» застрянешь так, что с места не сойти. Но это уже когда очень уж плохо. Чаще встречается просто невидимая ступенька, или цепляние за угол. Очень неприятно играть на карте с такими багами. А полностью их победить не всегда получается. Но заканчиваю плакать.

Приемы борьбы:
- прописать компилятору CSG параметр "-cliptype precise"(параметр не работает на старой версии компилятора и вообще не всегда удается им исправить все баги, можно даже сделать наоборот хуже)
- изменить геометрию карты (старая добрая «пляска с бубном над вертексами»)
- превратить подозреваемый в создании бага браш в «funс_wall»
- окружить баговую область «CLIP» или «NULL» брашем (чтоб вообще туда не попадать)
- использовать сложный (составной) браш, о котором подробнее:
Было замечено, что баг чаще проявляется на внешних углах в местах стыковки брашей, на внутренних углах он появляется реже. Это могут быть браши пола или стен.

Нажать для просмотра
рис 17

Идея состоит в удалении вертикальной (на рисунке) границы стыковки брашей, составляющих внешний угол. Имеется в виду обыкновенная замена двух или более «простых» брашей одним «сложным» (составным). Часто эта замена решает проблему.

Пример:
Шаг 1. Выбор цели. В нашем случае: «объединить» 4 браша пола.

Нажать для просмотра
Рис. 17_1

Шаг 2. Создание «контура» для сложного браша

Нажать для просмотра
Рис. 17_2

Шаг 3. Создание верхних ребер

Нажать для просмотра
Рис. 17_3

Тут отметим, что создание ребер лучше всего проводить на горизонтальной поверхности. Хаммер очень «чувствителен» к подобным извращениям и часто вылетает. Если же работать на наклонной плоскости, то вылетать будет еще чаще.
Итак, мы создали ребра:

Нажать для просмотра
Рис 17_4

Шаг 4 Сдвигание вертексов по высоте

Нажать для просмотра
Рис 17_5

Шаг 5 Верхние полигоны должны быть треугольными.

Нажать для просмотра
Рис 17_6

-------------------------------------------------------------------------------------------------
Такой «сложный» браш не всегда возможно изготовить. Вы же помните правило: «браш должен быть выпуклым (иметь только внешние углы) и любые две соседние грани не должны лежать в одной плоскости». Но если Вам удалось заменить несколько брашей одним, то в том месте бага не будет.

Еще пример использования сложного браша (створка ворот):
Захотелось нам, к примеру, сделать ворота, как на ацтеке. И нам даже не важно, что такие ворота не в состоянии ни открыться, ни закрыться – нам захотелось сделать. Сделать каждую створку можно одним сложным брашем (просто выпендриться или действительно надо, чтоб полигоны сэкономить - не важно). Пожалуйста:

Нажать для просмотра
рис 18

Но есть нюанс: две грани браша – шестиугольник и семиугольник лежат в плоскости под углом к сеточным плоскостям и угол этот не может быть произвольным.
=============


=============

На прощание несколько напоминаний:

- почаще сохраняйте работу
- почаще проверяйте на ошибки (alt+p)
- почаще компилируйте
- после удачной промежуточной компиляции и тестирования в игре сохраняйте «подальше от детей» резервную копию в rmf
================
Обсудить статью, задать вопрос
----------------
на главную
================
25.01.2008
Роман
rotoz@gorodok.net
--------
Выражаю благодарность:

- Conquist@dor
- Flash
- FiEctro
- Skaarj
- qpAHToMAS
==================
cs-mapper