Если говорить точнее, то тут я рассмотрю только Doom Radiant и GTK Radiant, благо работа с патчами в них практически идентична.
Итак, для эксперимента нам нужен хотя бы один живой патч.
Для
создания патча нарисуйте квадратный браш и в меню Patch выбирайте
Simple Patch Mesh. В GTK это меню называется Curve. Натыкаемся на
окошко:
Такое вот окошко.
Пока
что выбирайте там 3х3. Единственное, что вам сейчас нужно заметить, так
это то, что в окошке указывается количество точек на будущем патче.
Пока что вам это, скорее всего, ни о чём не говорит, но дальше всё
прояснится.
В результате у вас получится квадратик размерами с браш. Нажимайте "v" и наблюдайте такую картину:
Патч в GTK
Патч в редакторе дум3
Теперь
подробнее о том, что на экране. Во первых точки на патче можно
перетаскивать. Во вторых патч будет всегда касаться зелёной точки (это
опорные точки) и "притягиваться" к розовым точкам. Отсюда полезный
вывод - если вы планируете прикрепить свою кривую к каким - либо
элементам уровня - нужно изначально озаботиться достаточным количеством
зелёных точек на вашей кривой. Обычно кривые крепят к уровню или другим
кривым краями. Для начала прикинем, сколько будет зелёных точек по краю
патча, если создать его размерами mхn. Формула простая: на одном краю
патча будет (m+1)/2 зелёных точек. Почему так? К каждой зелёной точке
прилагается одна фиолетовая, но к последнему набору - не прилагается.
Добавляем недостающую розовую точку и делим всё количество точек
пополам. Розовых точек будет, соответственно (m-1)/2. Не теряйте эту
формулу из виду. Ну и теперь общее количество доступных точек: m+n-2.
Как посчитано - догадывайтесь сами.
Собственно, самый сок:
Всего зелёных точек: m+n-2
Зелёных точек на первой паре двух противоположных сторон: (m+1)/2
На второй паре: (n+1)/2
Теперь
попробуем прикинуть, какие размеры патча необходимы, чтобы красиво
заткнуть им какую-либо дыру в стене. Для стыковки с одной прямой линией
нужно две зелёных точки. Просто поставьте эти точки на линию, и
расположите на ней же розовую точку, находящуюся (по сетке патча) между
ними.
Пример - притягиваем патч к брашу:
Думаю, суть операции понятна. А вот теперь попробуйте заткнуть такой контур:
Для
начала прикинем, сколько в этом контуре углов. Ведь именно по углам
ставятся контрольные точки. Углов, соответственно, шесть. Значит и
точек должно быть как минимум шесть. Их может быть и больше - лишние
можно будет просто поставить не в угол контура, а прямо на него. 6 =
3+5-2. Создавайте новый патч и выбирайте в окошке создания патча 3 и 5.
Или 5 и 3 - не важно.
Вот так у меня получилось этот контур заполнить патчем 2х3
Скорее
всего у вас уже давно возник вопрос, а зачем это вообще надо. Не проще
ли заткнуть такой контур прямоугольным патчем или вообще брашем.
Конечно проще, но на самом деле умение строить патч с заданным внешним
контуром требуется совсем для другого. Во первых, красиво подогнанные к
геометрии патчи порадуют последующие поколения мапперов и заодно не
будут замусоривать карту. Хотя в случае сложных контуров это вполне
допустимо игнорировать, но если для красоты и гармонии требуется
подвинуть всего одну точку, то почему бы её не подвинуть. А вот "во
вторых" уже интереснее - ведь если вы можете сделать патчи с нужными
вам краями, то вы можете делать патчи с подходящими друг к другу
краями. А это значит, что вы можете очень аккуратно стыковать любое
количество патчей между собой. Вот например, из интересного -
нарисовать патчем букву.
Вот обещанная буква Т
Не
хотите попробовать сделать такую буковку? Только если решитесь
попробовать - выбирайте более-менее удобное количество точек на
сторонах патча. Для буквы Т оказалось удобным соотношение 3х7. Точки,
не принадлежащие контуру, нужно располагать внутри пача так, чтобы
исчезали красные линии в нём.
Искривление пространства.
А
теперь - самое главное в патчах. Думаю, что вы уже знаете о том, что
если двигать точки патча (особенно розовые) - он будет искривляться. Но
вот по какому принципу он это делает?
Кривая и её "Расшифровка"
На
верхней картинке нарисована кривая, полученная перемещением розовой
точки. Вроде бы нет никакой особой логики в её расположении, но на
самом деле это не так. Посмотрите на чертёж в правом нижнем углу и вы
заметите эти закономерности. А именно:
Кривая начинается точно в зелёной точке и кончается в другой зелёной точке.
Прямые,
проведённые от зелёных точек к розовой являются касательными к этой
кривой собственно в зелёных точках. Касательная фактически указывает
направление движения по этой кривой в точке, к которой она построена.
То есть розовая точка меняет направление входа и выхода кривой из
зелёных точек.
Но кроме этого есть ещё одна незаметная
касательная к этой кривой. А именно - посмотрите на жёлтые прямые.
Жёлтая прямая между зелёными точками параллельна касательной к кривой в
районе розового крестика. То есть если провести через розовый крестик
прямую, параллельную прямой, соединяющей зелёные точки, то это и будет
третья касательная.
Сам розовый крестик можно найти так: Взять
половину отрезка между зелёными точками и поставить там точку. В эту
точку как раз входит вторая жёлтая прямая (та, что с крестиком), а
крестик всегда как раз по центру своей прямой. И через тот крестик
всегда проходит кривая.
Ну ладно, курс снайпера прошли. В математику этих кривых сильно
вдаваться не буду, думаю вам это не очень и надо. Но есть одна
проблема. А именно - попробуйте создать цилиндр из вашего патча. Для
этого нужен патч 3х9. Его сторону (которая 7) нужно расположить
квадратом. Примерно так:
Собственно, это предполагается получить.
Для
получения этой штуковины две крайние зелёные точки нужно совместить. Ну
вот, вы только что совместили два разных края патча. Кстати, если таким
образом сейчас собрать нижние зелёные точки в одну - получится заглушка
для трубы или кусок бака/цистерны. А если после этого собрать все точки
патча на одну плоскость по вертикали - получится плоское окончание для
той же трубы. При таких операциях будьте осторожны, особенно если
пробуете что-то в первый раз - патчи не всегда восстанавливаются
операцией undo (в doom радианте, в GTK всё нормально). Лучше сделать
его копию и положить рядышком. Кстати, такие же точно трубы можно
получать, выбирая в меню Patch/Curve вместо "Simple patch mesh" подменю
"Cylinder" и один из вариантов в этом меню. Варианты влияют только
на количество зелёных точек у цилиндра в длину.
Ну ладно,
цилиндр сделали. Но вот незадача - он не круглый... Если не верите -
сделайте его копию и поверните на 45 градусов, потом совместите с
исходным цилиндром - получите довольно большое расхождение. Откуда же
оно взялось, ведь всё правильно. А дело вот в чём: посмотрите на
картинку с цилиндром. Для удобства будем считать шаг сетки - 2 юнита.
Тогда радиус круга - тоже два юнита. Диагональ сетки, а по
совместительству - отрезок между зелёными точками - sqr(8). Его
половина - sqr(2). А до розового крестика от центра - половина
диагонали сетки и ещё четверть. Это 3/sqr(2). Примерно 2.121 юнита. А это, между прочим, больше радиуса на 6%. Если, например, у вас радиус цилиндра - 64 юнита, то ошибка радиуса - около четырёх юнитов. Даже не самая маленькая сетка. Для исправления досадной неточности нужно двигать розовую точку к центру. На сколько юнитов? А сейчас посчитаем. Двигать розовую точку будем так, чтобы не изменить геометрию круга. К сожалению касательные к зелёным точкам станут неправильными, но это менее заметно, чем ошибка в радиусе. Хотя если ваша труба не будет вращаться, то можно оставить как есть. (Для толстых труб поправку всё же рекомендую. Они после неё лучше подходят к текстуре заглушек). Для начала выясним длину четверти диагонали - это (R*sqr(2))/4 или же R/sqr(8). За счёт уменьшения этого расстояния нам нужно скомпенсировать различия радиусов. А само различие равно R/(3/4*R*sqr(2)) в пропорции. R самоликвидируется. Остаётся 0.94 - разница, те самые 6 процентов отсутствуют. Значит розовый крестик нужно задвинуть к центру на R*0.06 юнитов. А для этого саму розовую точку нужно приблизить к центру на R*0.12 юнитов. Прикинем в единицах сетки. Минимальная сетка - 0.125. Её диагональ - 0.176. Значит каждые 1.46 юнита радиуса нужно сдвигать розовую точку к центру на одну клетку самой малой сетки. Это примерно на каждые 11 клеток радиуса малой сетки нужно сдвигать розовую точку на одну клетку той же сетки к центру цилиндра. Кстати, соотношение 1/11 не зависит от выбранной сетки.
Разница...
Зелёные, квадратные
Вернёмся к опорным зелёным точкам. Итак, с минимальным их количеством всё понятно, но как же найти более-менее оптимальное, чтобы потом не возиться с лишними точками? А сделать это не так сложно. как кажется. Количество точек очень хорошо определяется характером рельефа. То есть предположим, что вам нужен дворик с ямой и холмом. У ямы должны быть крутые стенки, а холм - как получится. запланируем точки
Вот такой пример - на нём потенциальные кандидаты в зелёные точки. На асмом деле правила разбивки очень просты:
нарисуйте рельеф
поставьте в начале и конце зелёную точку.
теперь нужно посмотреть на характер рельефа после этой точки
если он имеет длинный ровный участок, то в конце участка желательна точка
если он изгибается - ставится точка в том месте, где рельеф начинает перегибаться в другую сторону.
дальше переходите к поставленной точке и повторяйте всё с пункта 3 пока рельеф не кончится.
Теперь о том, что считается перегибом. Во первых
патчи не могут давать углы разворота больше 180 градусов. То есть если
у вас на рельефе намечается разворот более чем на 180 градусов, то там
нужно несколько точек. Во вторых перегиб точно возникает там, где
меняется направление изгиба рельефа. То есть раньше закручивался
направо, а теперь начинает раскручиваться. и кроме этого желательно
человечно отнестись к сглаживанию углов, но об этом дальше. И заранее
вас предупреждаю - Не пытайтесь рассчитывать количество точек для
рельефа в уме. Для начала попробуйте поизгибать патчи разными
способами, чтобы понять, что они вообще позволяют делать. Кроме того - в играх есть ограничение на количество узлов в патче. Рано или поздно это заставит вас собирать нужное из несколких кусков патча, и вот в этом месте первая часть статьи и будет полезна.
Острые углы
А теперь о том, как сделать, или наоборот, не сделать на патче острые углы. Такой угол в принципе может появиться только на зелёной точке и только при определённых условиях. А именно - поскольку патч фактически разбит на независимые куски зелёными точками, между этими независимыми кусками может возникать порадочной величины угол. Итак, если вам нужна гладкая поверхность, то нужно, чтобы касательные обоих кусков, входящих в зелёную точку с разных сторон, были одинаковыми. В общем смотрите картинку:
На картинке чёрными стрелками обозначены касательные. У первых двух
кривых они расположены на одной прямой, а у третьей - нет. И в
результате на третьей кривой возник своеобразный "уголок". На практике
же для полной ликвидации таких уголков достаточно держать зелёные точки
и соседние к ним розовые на одной прямой. Но из этого следует один не очень радостный факт - Фактически на гладкой поверхности мы можем спокойно манипулировать лишь двумя точками из трёх. Третья точка надёжно фиксируется. Вот для примера ещё картинка:
На картинке синими кругами обведены точки, которые можно свободно перемещать, а оранжевые стрелки показывают способ нахождения позиции для фиксированной розовой точки. А ещё из этой картинки следует очень простая вешь - на гладкой поверхности без углов фактически каждая вторая розовая точка нам неподконтрольна. И это нужно учитывать, выбирая количество точек на будущем патче.
Разбиение патча на сегменты.
Такой возможности в GTK Radiant я, к сожалению не обнаружил. Поэтому этот параграф только для счастливых обладателей думовского радианта. В любом случае для использования в игре кривая делится на треугольные кусочки. Этот процесс называется тесселяцией, но в играх вроде Quake3 этот процесс был неуправляемым. Игра сама делила кривую так, как считала нужным. В дум добавили возможность указывать плотность разбиения, так что в нём патч можно использовать даже в качестве 3dmax объекта mesh, достаточно установить разбиение по высоте и ширине в 0. Кстати, патчи прекрасно экспортируются в макс именно в качестве mesh. Также это нужно для стыковки нескольких патчей. Раньше была проблема с тем, чтобы состыковать несколько патчей (особенно разных размеров) - на одном из них обычно край был более детализированым, чем на другом. Теперь для разных патчей достаточно просто установить одинаковый уровень детализации. Кроме того, можно искусственно занижать количество треугольников в патче для оптимизации. Например, в думе мелкие трубы и перила имеют минимальную тесселяцию, фактически они четырёхугольные. Но благодаря их небольшим размерам и сглаживанию нормалей (игра всё равно считает этот патч за цилиндр и правильно рассчитывает освещение) всё выглядит прилично. Сам инструмент прост в использовании: выбирайте нужный патч и нажимайте "S"
Включение галочки Subdivide patch переводит управление тесселяцией в ручной режим, а её отключение возвращает всё в исходное состояние. После этого можно ползунками установить количество разделяющих линий по вертикали и горизонтали. В поле справа указано количество таких линий между двумя соседними зелёными точками. Два патча с одинаковым количеством линий разбиения прекрасно стыкуются краями. Достаточно просто установить зелёные и розовые точки обоих стыкуемых краёв в одинаковое положение.