Хинты (Hint) — это плоскости, используемые для разрезания листьев. Делается это так: создается браш, где все стороны кроме одной окрашены текстурой tools/toolsskip (она делает так, чтобы они игнорировались компиляторами), а та сторона, которая будет разрезающей, окрашивается в tools\toolshint. Листья разрежутся именно там, где встретятся с этой текстурой (tools\toolshint).
Примечание: не надо превращать эти браши в энтити; также они автоматически будут объединяться в свои визгруппы (visgroups) и вы легко сможете их спрятать.
И еще: убедитесь, что хинт-стороны вплотную прилегают к стенам, иначе эффект от их расстановки (хинтов) может быть утрачен.
Также вы можете посмотреть на карту-пример расстановки хинтов, имеющуюся в ССДК:
sourcesdk_content\hl2\mapsrc\sdk_hints.vmf

Когда и зачем нужно разрезать листья.



Для начала изучите работу самих листьев. Если говорить кратко, то вот: Откомпилированная карта поделена на секции, называемые листьями (leaf или visleaf). Каждый лист — это часть карты, содержащая некоторое количество геометрии в себе, и если из текущего листа будет видна любая часть другого листа, то вся его геометрия тоже будет прорисована (просчитана) движком игры. Вы можете просмотреть эти самые листья, набрав в консоли «mat_leafvis 1». Красный каркас — это то, что прорисовывается в данный момент.
Иногда определенная формы нужна листьям для того, чтобы из них было видно меньше других листьев, в результате чего движку придется прорисовывать намного меньше объектов, что ускорит производительность игры.

Я попробую объяснить принцип правильного разрезания листьев, и покажу пару примеров использования хинтов.

Наш первый пример похож на пример первой карты для хл/кс:

Когда игрок появляется на любой из 2-х точек респауна, то он «видит» трубы (браши) справа от стены, точнее игрок-то их как раз увидеть не может, а вот движок, считая иначе, прорисовывает эти трубы. Вы спросите ну почему же так? А все потому, что vbsp.exe при компиляции разделил уровень на не самые эффективные листья:

Видите? Лист, в котором находится игрок, может видеть лист с трубами, поэтому они и прорисовываются. Что же делать? Как раз при помощи наших хинтов мы и можем управлять процессом разрезания карты на листья, нужных нам форм:

Белой линией на рисунке показана сторона браша, окрашеная в tools/toolshint-текстуру. Вы видите, как она разбивает карту на три листа? «И что же такого случилось?" — спросите вы, а случилось то, что теперь из листа с игроком нельзя провести прямую линию в лист с трубами, т.е. эти листья теперь не видят друг друга, а значит и трубы справа не будут прорисовываться, когда игрок стоит слева от стены!!! Если вы поняли это, значит, вы поняли основной принцип расстановки хинтов

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

Давайте рассмотрим еще один пример:

Выше изображен типичный угол. Цилиндры с обеих сторон представляют собой множество объектов, не желаемых для прорисовки в обоих углах одновременно (о как завернул%)). Вы подумаете, что vbsp.exe итак сделает так, чтобы объекты в одном углу не прорисовывались, когда игрок стоит в другом углу? Ан нет! Эта штуковина не имеет ИИ, поэтому листья нарежутся опять не так, как нам надо, а так, как показано на рисунке выше (вам не кажется, что vbsp.exe слишком предсказуем?), т.е. из первого листа можно увидеть второй (и провести прямую линию от одного листа к другому). Выходом из этой ситуации опять будет размещение хинта на этом углу так, чтобы из первого листа не виден был второй:

Видите? Теперь первый (коричневый) лист и второй (красный) не видят друг друга, т.е. если игрок будет находиться в одном из них, то объекты в другом не будут прорисовываться. Однако если игрок войдет в третий (зеленый) лист, то прорисовываться все три листа. Ну, здесь уже ничего при помощи хинтов не сделаешь, придется или поменять план карты (что, думаю, вам вряд ли захочется), или пользоваться другими методами вроде тех, что описаны в статье «Улучшение производительности и контроль видимости»

Вот вам еще несколько примеров использования хинтов:

Во всех случаях мы пытаемся скрыть игроков (зеленые точки) друг от друга. Три верхних работы сделаны правильно: левый пример показывает, что если угол между двумя хинтами больше или равен (если это один хинт из одной стороны браша) 180 градусам, то игроки не будут рендерить друг друга, т.к нельзя будет провести прямую линию из одного листа в другой. Нижний левый рисунок показывает, что случится, если провести прямую линию будет можно (т.е. угол между хинтами будет меньше 180 градусов): пользы от хинтов никакой не будет. Когда угол будет равен 180 градусам (как на среднем примере), то можно два хинта так, как это сделано наверху; конечно, вы можете разместить их ближе к игрокам, но тогда они окажутся малоэффективными, убедиться в этом можно, посмотрев на нижний средний рисунок: т.к. хинты были смещены вниз, vbsp.exe прийдется разрезать верхний лист с углом на еще 3, потому что листья, как и браши не могут быть вогнутыми. Неважно, как vbsp.exe разрежет листья — хинты все равно будут работать в этом случае менее эффективно, т.к. создадутся дополнительные листья (больше работы для vvis.exe), также левый игрок будет «видеть» листья 1 и 2, а правый — все три листа. Два правых примера показывают, что нужно делать вещи как можно более простыми. Если вы можете ограничиться размещением только одного хинта — сделайте это; и не надо ставить хинтов, если они не требуются (как на нижнем рисунке): здесь vbsp.exe никак не сможет разделить карту на листья так, чтобы один игрок видел второго, так что здесь хинты не нужны (разве что для того, чтобы скрыть от игрока некоторые части коридора). Также на средних примерах изображена стена, которую НИКОГДА не следует превращать в func_detail (или другие энтити), т.к. такие энтити не учитываются при создании листьев, и оба игрока тогда окажутся в одном листе.

Последний пример использования хинтов — это упрощение карты. Иногда vbsp.exe разрезает вашу карту на множество ненужных листьев, которые только увеличивают время компиляции и размер bsp-файла. В этом случае нам тоже помогут хинты. Например, поставьте хинты в дверных проемах, чтобы разделить помещения, которые отделяют двери. Или если, вы получаете ошибку с сообщением о том, что определенный лист находится рядом со слишком большим числом других листьев, разрежьте его на меньшие листы, которые будут соседствовать с меньшим числом листьев.

И наконец, поскольку хинты не тратят на себя дополнительных затрат во время игры на вашей карте, то их расстановка — основной способ ускорения производительности и контроля видимости; но напоследок хочу отметить, что правильная расстановка хинтов — чуть ли не целое искусство (), и подходить к ней надо аккуратно и осторожно.

Приятного вам маппинга
Источник: взято с Valve Developer Community.
Перевод: AndrewDragon.
30 сентября 2005, 23:11