Редактирование префабов ETS2: пути AI, сервисы и навигация.
ZModeler3 теперь позволяет редактировать и создавать свои новые префабы для ETS2. Поскольку для работы с префабами используются сплайны, необходимо предварительно настроить ZModeler.
Открываем окно конфигурации Configuration, там General, и раскрываем ветку Splines. Там выключаем "Automatic detalization", чтобы при создании сплайнов у них была постоянная детализация (по умолчанию 8 и этого достаточно). Вообще детализация сплайнов не используется в префабах и лишь влияет на отображение в ZModeler.
Также рекомендуется включить опцию "Always draw points" чтоб в ZModeler всегда отрисовывались точки сплайна, даже когда работаете на уровне объектов. В таком случае при создании сплайнов, к примеру, будет видно, к какой существующей точке другого сплайна можно примкнуть. Ну и заодно включаем опцию "Draw direction arrow". С ней ZModeler будет отрисовывать стрелку у сплайна, указывая направление. Размер стрелки в единицах измерения ZModeler, для префабов рекомендуется где-то 2.5, хотя для других целей это может быть слишком крупная стрелка. После смены значения перезапускать занозу не надо, так-что легко менять и подбирать размер стрелки в процессе работы.
Теперь самая важная опция которую надо включить это Compatibility. Выбрав там "SCS Compatibility" и перезапустив ZModeler, мы получаем ZModeler в режиме совместимости с ETS2. Грубо говоря, некоторые опции будут обозначаться и именоваться именно так, как и должны для ETS2. Не включив совместимость, некоторые опции вообще будут недоступны для редактирования.
Также рекомендую включить опцию "Custom mesh colors", чтобы объекты (а в нашем случае сплайны) могли быть разных цветов. По умолчанию на импорте ZModeler дает разным группам спалйнов разные цвета для удобства. Сам цвет непосредственно для ипорта/экспорта смысла в себе не несет, но работать так будет удобнее.
Я загрузил префаб с небольшой заправкой на обе стороны трассы и на её примере объясню особенности работы с префабами. Вот визуальная модель заправки:
А вот тут префаб - т.е её "логическая" часть. Префаб у модели загружен в ветку prefab в иерархии и внутри у него еще несколько веток или групп элементов, содержащих сплайны и дамми объекты. Все названия веток и свойств которые будут упоминаться не чувствительны к регстру:
Группа lanes (дословно "дорожки") это пути AI траффика, и она может содержать только сплайны. Сплайны в этой группе взаимосвязаны через общие точки, что позволяет траффику переходить с одного пути на другой и вообще осуществляет ветвление траекторий на перекретсках. Вся эта группа как таковая может отсутствовать, если в префабе нет путей траффика - например, ферма или гараж. Эта группа будет рассмотрена подробно чуть ниже.
Группа nodes ("узлы) - наиболее важная и в каждом префабе всегда должна быть эта группа и в ней как минимум "connector 0". Префаба без узлов быть не может, хотя бы один должен быть, чтоб префаб можно было пристыковать к дороге:
Узлы в этой группе прогумерованы начиная с нуля и до 5. всего 6, хотя в ETS я больше 4 не видел. Каждый узел состоит из коннектора connector (собсвтенно сама точка привязки, её ось Z смотрит внутрь префаба) и опционально к узлу может задаваться сплайн-граница border spline. Цифра после названия есть порядковый номер. Сплайн граница это последовательность точек на границе префаба, к которой игра примыкает ландшафт рядом с префабом. Точки должны идти на виде сверху против часовой стрелки. На рисунке этого не видно, но сплайн-граница идет против часовой стрелки:
В ZModeler border сплайн довольно хитрый. В самом начале к нему я добавляю несколько точек, которые склеены с вершинками AI путей (только с первой или последней). И только после этих склееных вершинок уже идут точки границы которые нужны игре. Склееные вершинки нужны только ZModeler на экспорте, чтоб достоверно установить, какие пути AI начинаются в соответсвующем узле (и в каком порядке), а какие заканчиваются (и тоже в каком порядке). Когда сплайна-границы для узла нет, то не только не будет границы ландшафта, но и пути траффика не смогут состыковаться с данным узлом - приходящий с дороги траффик будет просто пропадать.
На рисунке вверху сплайн начинается с двух вершинок к которым подклеены уходящие сплайны (их хвостовые точки) - с этих путей трафик будет уходить на примыкающую дорогу, затем идут две вершики, к которым подклеены входящие пути (головные точки сплайнов) - на эти пути трафик будет попадать с путей примыкающей дороги. Ну и следо за этими четырьмя точками начинаются точки-границы сплайна, начало отмеченно как "actual in-game border will start here" ("реальная граница префаба для игры начинается лишь здесь").
Несклееные точки сплайна идут до конца префаба против часовой стрелки (до противоположного конца участка дороги), предполагая что игра создаст полигоны ландшафта на каждой последовательной паре точек (не частите, это лишнее). На картинке показано как именно примкнут полигоны ландшафта:
В общем, узлы и границы не слишком сложны и изучив десяток разнообразных префабов, их логика станет совершенно ясной.
Следующая группа в префабах названа lights и включает дамми объекты для светофоров. В имени дамми объекта может (хотя и не обязательно) присутсвовать название (например, на всех перекрестках у светофоров прописано имя City), а затем идет порядковый номер в скобках. Номера начинаются с нуля и идут по порядку 0,1,2,3... так-что набор 0, 2, 3, 4 или 1, 4, 5 неправльный. Фактический порядок светофоров в группе значения не имеет, важны их номера в скобках.
На картинке показаны свойства одного из светофоров. Эти свойства надо самому вручную задвать и они могут включать следующие свойства:
Mode:
0 (или вообще свойство отсутствует): обычный режим работы, зациклен.
1: светофор активируется вручную (например, на границе платного участка).
2: светофор активируется приближающимся mover-ом, например, шлагбаум при приближении поезда.
Type:
0 (или вообще свойство отсутствует): обычный светофор
1: автоматический светофор (наиболее часто используется на перекрестках)
2: автоматическй барьер (помимо светофора еще есть коллизия-препятствие) - на платных участках такой стоит.
3: просто визуальная модель, не влияет на траффик.
4: маленький вариант (например шлагбаум - в одной анимационной модели может быть маленькая и большая версия - использовать маленькую/простую)
5: большой вариант (например шлагбаум - в одной анимационной модели может быть маленькая и большая версия - использовать большую/сложную)
Timing с четырьмя значениями (в секундах) задают интеравал работы светофора (назначение каздого из значений не знаю), это
свойство должно быть обязательно!
Названия свойств не чувствительны к регистру.
Следующие две группы похожи: services и zones. Сервисы это группа с дамми объектами, у которых имена в виде чисел. Каждое число это определенный сервис и игра на месте этого дамми поставит сервисную точку. Например, 3 это заправка, 10 это паркинг/зона отдыха.
Группа Zones содержит замкнутые spline с именами. Если не ошибаюсь, в сплайнах может быть не более четырех точек, хотя и не факт. Сплайн задает область, заезжая в которую, пользователь активирует какое-то действие. Настройки вот в этом файле: def\world\trigger_action.sii. На данный момент я видел чтобы использовались токлько Hud_parking (парковочная зона) и Cam7_on_off (включает вид из "киношной" камеры).
Группа Locators содержит дамми объекты, которые в игре будут заменены моделями знаков и указателей. Модель задается числом в имени дамми и дополнительно может указываться имя геоментрии внутри модели (обычно Vis). Если имя не указано, именно "Vis" будет использоваться при экспорте. Для справки по числовым значениям смотрим номера в файле def\world\sign.sii.
Пути трафика AI:
Ну собственно самая интересная группа lanes содержит только сплайны для AI трафика. С ней надо быть предельно внимательным и следить за правильной раскладкйо и склейкой вершинок, а также за свойствами кажой вершинки сплайна. Ну прежде всего, направление сплайна задает направление движения трафика по нему. Каждая вершинка сплайна должна быть типа Bezier-corner или Bezier. Нельзя использовать типа вершинки Corner (без управляющих векторов), даже если прокладываете прямой участок - всегда должны быть управляющие векторв в вершинках. Также ненадо ставить слишком много вершинок (в префабах вы можете встретить пути с большим количеством вершинок - но это не для улучшения "кривизны" а для расстановки скоростных ограничений, чтоб траффик плавно снижал или набирал скорость на кривом участке). Так вот, игра сглаживает кривуб и движение трафика на путях, так-что несколько точек достаточно для плавного движения:
Вот чему следует уделить внимаени, так это склейки сплайнов в узловых точках. Когда несколько путей сходятся в одну общую точку, они должны быть склеены этой точкой (инструмент Modify\Submesh\Weld). Аналогично, если на какой-то точке пути расходятся в несколько - тоже склеенные сплайны. Склееные точки ZModeler отрисовывает розовым цветом (хотя это можно перенастроить в опциях). Ну и самое главное - не накладывайте дублирующиеся сегменты сплайнов. Сплайны могут пересекаться, сходиться в одну точку, расходиться из одной точки, но они не должны совпадать один поверх другого - даже на небольшом участке так делать не надо. Также заметьте, не нужно тянуть путь от начала прям до конца. Путь может прерваться и быть продолжен другим сплайном (склееным в этой вершине). Например, на картинке один из путей по заправке (а там два пути) начинается на вершинке другого пути и заканчивается, примыкая к этому пути обратно. Своего рода кусочек с альтернативным путем, отличным от основного.
Вершинки сплайнов (доступны на уровне манипуляторов) содержат основную логику AI трафика и редактируются на закладке Properties. Следует отметить, что редактируете и задаете свойства точки, но для игры это будут свойства сегмента или куска кривой до следующей точки. Начнем со свойств "user-defined". Там можно задать свойство "speed" и указать ограничеие скорости для AI трафика на указанном сегменте. Ну а основные свойства доступны в ветке General->External State->SCS Compatibility т включают с десяток различных флагов, характеризующих поведение и предпочтения трафика на указанном сегменте. Я дам описание свойств чуть ниже, сначала обращу ваше внимание на очень важную особенность:
На картинке вы видите свойства точки на крайнем-правом сплайне. Эта точка розовая и склеена с другим сплайном (второй путь по заправке). Склеенные точки склеены только ПОЗИЦИЕЙ, но это всё равно разные точки и у каждой свои собственные свойства. Так, например, когда трафик подходит к такой точке, у него есть два пути по которым следовать далее - самый правый и тот что слева от него. На самом правом в точке (на картике вверху), включено свойтсво "No trucks allowed" (не для грузовиков), поэтому грузовик AI с трейлером по этому пути не поедет.
С другой стороны как бы "та же точка" но у другого сплайна имеет другие свойства - на ней указано "Trucks only" (только для грузовиков), так-что грузовик поедет именно по этому пути.
Собственно вот описание и значение свойств:
Give way (дай дорогу): AI трафик будет пропускать трафик идущий с других направлений. Эта опция идет только вместе с опцией "Intersection ahead".
Trucks only (только для грузовиков): Последующий участок пути предназначен только для грузовиков с прицепами. Например, на перекрестке могут быть пути для грузовиков, чтоб они проходили перекресток чуть по другой траектории и не сносили столбы и другие машины.
No trucks allowed (кроме грузовиков): Путь нельзя использовать грузовикам трафика с прицепами (более крутые траектории).
Player only (только для игрока): Путь используется только игроком, AI трафик по нему не пойдет (видел такие на префабах с круговым движением).
Right blinker и Left blinker (правый и левый поворотник): опция включает поворотники на трафике и дает ему преимущетсво в движении (в сочетании с опцией "Intersection ahead"). Заметьте, это немножко не по российским пдд.
No blinker advantage (поворотник не дает преимущетсва): В сочетании с "Right blinker" или "Left blinker" не дает преимущетсва в движении (ближе к российским реалиям)
Rare usage (использовать редко): уменьшает вероятность выбора этого пути трафиком (например, съезды назаправку).
Intersection ahead (впереди пересечение): ставится на вершинках, если сегмент сплайна потом пересекается с каким-то сегментом или сходится в общую точку. Так, если два пути сходятся в точку, надо обоим выставить "intersection ahead". Если тракетории просто пересекаются, тоже надо выставить эту опцию, чтоб трафик был в курсе о возможно пересечении. Часто сочетается с "Give way", чтоб задать приоритет на пересечении, без этой опции вероятны столкновения AI.
Traffic light control (управляется светофором): трафик AI по достижении конца участка будет руководствоваться светофором. Как ни странно, но сам светофор (его индекс) указывается лишь на следующей точке в user-defined свойсвте Light пишем индекс светофора. На обычных перекрестках эта опция не используется и просто указывается Light в свойствах. Непосредственно опция "Traffic light control" встрачется перед светофорами, активируемыми вручную (платные участки, на заправке).
Как было сказано выше, помимо пользовательского свойсвта "Speed", можно задать свойство Light и указать индекс светофора, чтобы трафик при проезде этой точки руководствовался сигналом светофорам с данным индексом.
Теперь покажу как сделать путь AI и задать свойства. Предположим, чтоб после заправки, некторый трафик разворачивался через все полосы в обратное направление (как это по-русски):
Для начала я добавляю точку в сплайн, к которум новая траектория примкнет. Так, при создании нового сплайна у меня уже будет готовая точка, с которой я его склею в конце - так проще и быстрее.
Используя инструмент Strip в группе Create\Spline, нажимаем примерно поверх вершинки-начала (на сущетсвующей траектории) и тянем вектор кривизны чуть всторону. отпускем левую кнопку и задаем Weld + new spline (склеить и начать новый сплайн). Заметьте, когда вы кликаете на сущетсвующих вершинках, ZModeler подсвечивает розовым кружком точку, с которой он может связать точку сплайна при построении.
Затем кликаем и тянем в промежуточной точке.
И нажимаем на точку сведения и тянем вектор-траекторию. Отпускаем и выбираем Weld and stop (склеить и закончить). Новый сплайн уже склеен в начальной и конечной вершинке и практически готов к работе:
Надо лишь перетащить его в группу "Lanes", чтобы на экспорте ZModeler его счел как путь AI тарфика.
Небольшое пояснение про "нажмите и потяните" - при создании точек таким образом, точка автоматически создаётся типа "Bezie", т.е. с управляющим вектором, а как было сказано выше, на AI путях все точки должны быть с управляющими векторами!
Прежде чем назначить свойства, я добавил точки на прямых путях, которые пересек вновь-созданный путь. Это сделано для того, чтоб на этих путях можно было выставить свойство "intersection ahead", чтоб трафик, идущий прямиком, был предупрежден о возможном столкновении (сейчас столкновения все еще возможны):
Затем выделил все эти точки, а также первую и среднюю точку нового сплайна. Назначил им свойство Intersection ahead. Трафик теперь предупрежден о возможном столкновении, но приоритеты не расставлены (трафик запрудит всю дорогу в пробке).
Я включаю свойство "Give way" на самой первой вершине нового сплайна - трафик будет пропускать машины, идущие мимо и потом пойдет на разворот. Я не указал "дай дорог" перед примыканием к пути на противоположной стороне, там возможны столкновения. Просто хочу показать, что небольшая опция, не поставленная на нужной вершинке может вызывать проблемы в движении трафика по префабу. Также заметьте я включил опции "Left blinker" и "No blinker advantage", так-что трафик включит поворотник перед разворотом, но все равно будет пропускать трафик и ждать свободного пути.
На скрине виден грузовик ушедший на разворот с заправки. да, он попер через ограждение, суть сейча не в этом конечно.
Навигация: Карта и GPS:
Последняя группа в префабе, которую обсудим, это navi - навигация. В этой группе расположены сплайны для GPS навигации и для карта. Правило простое - Замкнутый сплайн для отрисовки полигонов на карте, незамкнутый сплайн это путь для навигации.
Замкнутые сплайны могут содержать только четыре точки, формируя тем самым четырёхугольник. Игра не триангулирует более сложные формы сплайнов, так-что если нужно нарисовать на карте полгион более сложной формы, делайте его из нескольких четырехугольных сплайнов. Замкнутые сплайны могут иметь следующие свойства в user-defined options:
Color:
0 (или свойство отсутствует): сцвет по умолчанию - рыжий, как цвет дороги на карте
1: светлый цвет (светло-серый для неисследованных дорог или песочный для исследованных)
2: темный цвет (темно-серый для неисследованных дорог или коричневый для исследованных)
3: зеленый цвет (обозначает озелененные участки на префабе)
Over (для включение ставьте значение 1) - режим "поверх остальных". полигон на карте будет отрисован поверх остальных, часто истользуется для отрисовки форм строений на префабе.
Border - включает отрисовку границы полигона (не проверял в действии).
Не замкнутые сплайны считаются путями навигации, или груба "дорогой". На картинке выше я чуть сдвинул такой сплайн, чтоб его было видно. Пути навигации могут содержать следующие свойства:
Width - ширина дорогиа в "полосах":
0 (или свойство отсутствует) самая тонкая дорога, одна полоса в единственном направлении
1 - по одной полосе в каждом направлении
2 - по две полосы в каждом направлении
3 - по три полосы в каждом направлении
4 - по четыре полосы в каждом направлении
Offset - расстояние до встречных полос (в метрах). Ноль или если на задано свойство - попутка и встречка примыкают вплотную. Можно задать значения: 1,2,5,10,15,20 и 25. Другие значения игнорируются.
Гораздо важнее обсудить пользовательские свойства, задаваемые на вершинках сплайнов навигации. Их свойства такие же как и на спалйне (но подавляют значения выставленные на сплайне), а также несколько дополнительных важный свойств:
link (связь) - точка навигации расположена на границе и привязана к узлу префаба с указанным индексом. Таким образом, если вы заезжаете на префаб с дороги, примыкающей к узлу 0, то GPS будет прокладывать путь по путям навигации, начиная с той вершинки (или вершинок) где был link 0. Если вы не указали привязки к узлам в свойствах граничных точек, вся сеть навигационных путей будет не удел - GPS вообще не сможет проложить путь через префаб. Естественно, только на граничных точках можно выставлять "link".
route (путь к) - указывает, какие уззлы достижимы при движении через указанную точку. Это очень важное свойство и смысл и принцип его использования надо понимать, так-что я подробно на этом остановлюсь. Прежде всего, скажу что можно убрать это свойтсво со всех вершинок навигации и тогда ZModeler на экспорте будет руководствоваться направлением сплайнов навигации и свойствами "link" чтобы автоматически рассчитать правильную маршрутизацию по префабу. Это работает в большинтсве случаев, кроме круговых развязок, где можно получить закольцованные пути. С ними тоже маршрутизация пропишется, но будет работать в игре неправильно. Давайте разберем перекресток с круговым движением:
Пути навика очень похожи на пути трафика AI, они связаны общими точками между собой. Но каждый отрезок навигационной сети воспринимается GPS как двусторонний. GPS просто игнорирует направление сплайнов ZModeler и прокладывает маршрут кратчайшим образом. Естественно, на круговом движении он может дать необычную рекомендацию. Для корректной прокладки маршрута надо задать навику подсказки. Разберем детально навигацию на префабе с круговым движением. На нем вот такая конфигурация узлов:
Предположим, я хочу переделать его в левосторонний (вариант UK), чтоб путь из узла #1 в узел #0 прокладывался по часовой стрелке. Для начала я выбрал все пути, в них выбрал все точки, открыл их свойства и удалил свойтсво route. Затем Apply. Все, свойства "route" теперь нет, будет расставлять его заново.
GPS идет от вершинки с которой мы приехали ("link" 1) по всем возможным направлением в попытке выйти на вершинку с "link" 0). Собственно, ему надо лишь задать подсказки, как проходить точки с несколькими возможными направлениями. Он встретит такую почти сразу, посмотрите на картинку. Дойдя до точки на круге, возможны три направления - налево к вершинке Node #2, по часовой стрелке и против часовой стрелки.
Я задаю свойтва вершинки которая от смежной точки в направлении по часовой стрелки - и задаю там свойство route со значением 0,1. Это означаем, что "выбрав направлением через эту точку, достижимы Node #0 и Node #2". Я не выставляю никакого свойства на точке, которая против часовой стрелки - я не могу "запретить" идти в том или ином направлении - я могу лишь подсказать, куда идти "лучше" для выхода на тот или иной узел. Естественно, в вершинке влево я задам посказку "route 2". Таким образом, в нашей точке с несколькими вариантами GPS уже будет однозначно знать, куда идти к вершинами 0,1 и куда к вершине 2. при этом напраление против часовой стрелки остаётся невостребованным и GPS туда не пойдет. Собсвтенно, вот так разбираются все точки с несколькми связями.
Это может быть несколько сложно для понимания, но изучте внимательно полную картинку маршрутизации с подсказками. Тут отображено каким вершинкам какое свойство я указал (красное) и почему именно эти точки я взял (зеленая индикация).
Вот пример как этот префаб работает в игре:
Как видите это участок карты в европе с правосторонинм движением, но GPS рисует мне развязку как с левосторонним движением.
Ну и напоследок несколько слов о навигационных путях "низкой детализации". Эти пути после импорта скрыты и они своего рода простейшая развязка через префаб, которую будет отображать карта на большом отдалегнии. Вместо кругового движения что мы разбирали вверху, вот такое примитивное сочленение дорог будет использоваться::
Я подкрасил сверзу линии, чтоб было видно, как они идут. На этих путях навигации в вершинках тоже должны быть привязки к узлам (свойства "link"), а на самих сплайнах дополнительно указывается свойство lowres со значением 1.
Следует отметить, пути низкой детализации должны быть в группе "navi" в самом низу списка. В противном случае, GPS найдет их первыми и построит по ним кратчайшую навигацию через префаб даже на увеличенной крате - это будет смотреться неверно в игре. Как видите на картинке, это пути с номерами #1, #2, #3, но при этом они в самом низу списка, чтобы экспортировались в правильном порядке.