ИИ-генератор города для игр: сначала дороги, потом кварталы
Сгенерированный город хорошо смотрится сверху и разваливается на уровне глаз. Иерархия улиц, размеры кварталов, фронт застройки и перекрёстки — цифры, которые решают.
Сгенерированный город оценивают с высоты 200 метров — единственной высоты, на которой любой генератор выглядит компетентным. Опустите камеру на 1,7 м и встаньте на углу: продолжается ли тротуар за поворотом, согласны ли две сходящиеся дороги насчёт высоты бордюра, знает ли угловое здание, что оно угловое. Именно этот вид решает, читается город или нет, — и решается это задолго до того, как кто-то возьмётся моделировать здание.
Город — это прежде всего дорожная сеть
Порядок здесь — цепочка зависимостей, а не вопрос вкуса. Сеть режет землю на кварталы, кварталы делятся на участки, а фронт, глубина и отступ участка определяют, какое здание там может стоять. Поменяйте сеть — поменяется всё, что ниже по цепочке. Поменяйте здание — выше по цепочке этого никто не заметит.
Генераторы, которые переворачивают порядок — сначала навалить зданий, потом продеть дороги в промежутки, — выдают «город для скриншота». Сверху массинг правдоподобен, на уровне улицы ничто ни к чему не повёрнуто: в момент расстановки поворачиваться было не к чему. Работа Париша и Мюллера на SIGGRAPH 2001 года, предок почти всего процедурного инструментария для городов, сначала строила уличную сеть, потом позволяла улицам нарезать землю на участки и только затем ставила на участки здания.
Дорог три класса, а не один
У настоящей сети есть иерархия, и она читается на уровне глаз, знаете вы её названия или нет. Магистрали ведут транзитный поток и почти не касаются участков; распределительные улицы собирают трафик из районов и отдают его магистралям; местные улицы существуют, чтобы доехать до подъезда. По сети США магистрали и распределительные улицы вместе везут примерно 70–80 % автомобильного пробега, притом что по протяжённости преобладают местные дороги: немного широких, загруженных, непрерывных улиц и очень много узких, коротких и тихих.
Генератор, выдающий один класс дорог, делает шахматную доску: все улицы одной ширины, все перекрёстки одинаково важны, нет причин свернуть налево, а не направо. Дайте трём классам разную проезжую часть, разные тротуары, разный шаг фонарей и разную застройку — и игрок начнёт ориентироваться на ощупь, а не по миникарте.
Ширины, которые можно измерить
Числа, которые держат удар, в метрах, по Urban Street Design Guide от NACTO:
- Полоса движения: 3,0 м в городе, 3,3 м на маршрутах автобусов и грузовиков. От 3,6 м улица начинает читаться как шоссе.
- Местная двусторонняя улица с парковкой по обеим сторонам: 7,3–8,5 м от бордюра до бордюра. Типичная жилая улица — проезжая часть 9 м внутри полосы отвода 15 м.
- Пешеходная зона тротуара: 1,5–2,1 м в жилой застройке, 2,4–3,7 м в центре — и это только та часть, по которой идут. У настоящего тротуара есть ещё зона оборудования у бордюра (фонари, деревья) и зона фасада у стены (двери, ступени). Смоделируйте его одной плоской лентой — потеряете обе, и улица будет выглядеть подметённой начисто.
- Высота бортового камня: 0,10–0,15 м. Пропадает первой, а бордюр на нулевой высоте превращает улицу в нарисованную плоскость.
Кто соблюдает этот порядок — вопрос отдельный. Нодовые процедурные системы (графы Houdini, правиловые городские инструменты, выросшие из той самой статьи 2001 года) стартуют с графа улиц; плата — правила пишете вы. Однопроходные генеративные модели сети не имеют вовсе: дороги в их выводе — текстура, а не топология. Инструменты «библиотека плюс расстановка» обычно начинают с сетки, то есть с сети ровно одного класса. Агент, управляющий настоящим редактором, начинает с сети по прозаической причине: проложить магистраль — одно действие, а расставить четыреста зданий — четыреста. Cuberta работает именно так: редактор отдаёт операции уровня локации по Model Context Protocol, поэтому агент рисует магистраль, распределительные и местные улицы, нарезает кварталы и считывает сцену обратно между шагами. Выигрывает ли это у вручную написанного графа правил, зависит от того, сколько вы готовы писать сами, и это отдельный разговор.
Кварталы вторые, участки третьи
Квартал — это то, что сеть замкнула; что происходит внутри, решается отдельно, и именно это решение большинство генераторов пропускает. Фронт 6 м при нулевом отступе даёт сплошную рядовую застройку. Фронт 18 м при отступе 7 м даёт пригород. Из одной и той же библиотеки зданий получается и то и другое.
| Образец | Квартал | Как читается |
|---|---|---|
| Портленд, Орегон | 61 × 61 м | Перекрёстки без конца, отлично пешком, дорого по площади дорог |
| Барселона, Эшампле | 113 × 113 м, срезанные углы по 20 м | Плотно и регулярно; каждый угол — маленькая площадь |
| Манхэттен | 80 × 274 м | Короткие поперечные улицы, длинные авеню; направление имеет смысл |
| Послевоенный пригород | 150–250 м, кривые улицы, тупики | Мало перекрёстков, плохая читаемость пешком |
Забирать отсюда стоит соотношение, а не число. Портленд ставит перекрёсток каждые 61 м — один каждые 45 секунд при скорости шага 1,4 м/с; Манхэттен ставит один каждые 80 м по одной оси и каждые 274 м по другой, поэтому оси и ощущаются как разные города. Для игры рабочий диапазон — 60–120 м по стороне: меньше 60 м, и основная часть площади уходит под дорожное полотно; больше 120 м, и игрок слишком долго идёт между решениями мимо тех самых длинных глухих фасадов, на которых сгенерированный город виден насквозь.
Отступы, фронт, высоты этажей
Отступ — единственное число, отделяющее торговую улицу от жилой: у сплошной торговой застройки его нет, у рядовой — 2–4 м палисадника, у отдельно стоящего пригородного дома — 6–8 м и подъездная дорожка. Рабочие значения фронта: 5–7 м для рядового дома (классический бруклинский браунстоун стоит на участке 6 × 30 м), 15–25 м для городского многоквартирного, 12–20 м участка для отдельно стоящего. Угловые участки почти всегда шире соседних: углы дороже, им достаётся магазин, а в Эшампле разницу заложили прямо в план — срезкой угла на 20 м.
По вертикали честность линии крыш держит одна договорённость: жилой этаж — 3,0–3,3 м от пола до пола, офисный — 3,6–4,2 м, торговый первый — от 4,5 м, поэтому четыре жилых этажа дают 12–13 м до карниза. Если сгенерированные здания об этом не договорились, соседние фасады расходятся в уровнях перекрытий, и улица читается как коллаж.
Перекрёстки — то место, где генераторы ломаются
Перекрёсток — единственное место, где геометрия обеих дорог обязана свестись в одну поверхность, а в определении каждой из них не написано, как именно.
- Наложение поверхностей. Два пересекающихся дорожных меша дают компланарные полигоны и мерцающее пятно в середине перекрёстка — видно с первого кадра.
- Тротуары, проходящие насквозь друг через друга. Линия бордюра обязана повернуть за угол; две ленты, выдавленные вдоль собственных осей, вместо этого пересекутся.
- Пустота на углу. Стандартные радиусы бордюра — 3–4,5 м, в жилой городской застройке 1,5–3 м, а некоторые города опускаются ниже метра. Один радиус на всё даёт либо разгонные виражи в рядовой застройке, либо ножевые кромки на магистрали.
- Несовпадение ширин. Магистраль 12 м, встречающая местную улицу 7 м, требует перехода; без него линия бордюра обрывается в воздухе, не дойдя 2,5 м.
- Разметка под неверным углом. Переход, отштампованный под 90°, на перекрёстке, который сходится под 70°, — и весь узел читается как работа наклейками.
- Угловое здание, которое не угловое. В настоящем городе угловой участок — это магазин, бар, более крупный дом, срезка. Поверните вместо этого рядовое здание на 90° — и у перекрёстка не будет ориентира, а у района не будет навигации.
Тест — одно движение камеры: точка обзора на 1,7 м, встать в середину перекрёстка, повернуться на 360°. Переживёт — переживёт и всё остальное. Не переживёт — никакая панорама не спасёт: игрок проводит на этой высоте весь уровень.
Повторы выдают всё
Сгенерированный город выдаёт себя повторами гораздо раньше, чем геометрией. Вдоль стометровой стороны квартала игрок видит десять–пятнадцать фасадов сразу; два одинаковых в одном кадре — и иллюзия закончилась. Большая часть предлагаемого разнообразия поддельная:
- Киты фасадов. Шесть–десять стеновых панелей в разных сочетаниях: отраслевой стандарт, честно работает — ровно до момента, когда один и тот же оконный переплёт вылезает в пяти домах подряд.
- Джиттер цвета. Сдвиг тона в тинте альбедо. Убедительно на аэрофото, бесполезно с 10 м: геометрия под краской не сдвинулась.
- Поворот и отражение. Отражённый дом — тот же дом; глаз читает силуэт и пропорцию, а не хиральность.
- Случайный масштаб. Худшее из четырёх, потому что ломает то, что было правильным: двери перестают быть 2,0–2,1 м, линии перекрытий перестают сходиться с соседскими.
Заработанное разнообразие вырастает из плана. Ширины участков разные, потому что разной была нарезка. Здания разного возраста на одной улице, с разными высотами этажей и одним узким домом-вставкой в разрыве на месте снесённого. Линии крыш ступают, потому что ступает земля: даже уклон 1:40 загоняет карнизы в лесенку. И несколько зданий, которые вообще не из этого ряда, — трансформаторная будка, церковь, многоуровневый паркинг. Пять таких на район из трёхсот домов дают правдоподобия больше, чем ещё двадцать вариантов фасада.
Правило, разделяющее списки: читается то разнообразие, которое вы можете объяснить. Если вы не можете сказать, чем это здание отличается от соседнего, игрок тоже не сможет, и отличие останется шумом. Правиловый генератор варьирует только то, что вынесено в набор правил: хороший набор выносит очень многое, наспех написанный — цвет. Агенту в редакторе можно сказать: поставь маленькую церковь в северо-западном квартале и дай рядовой застройке спуститься ступенями к реке, — и эта фраза превратится в пять конкретных объектов, а не в ещё один параметр.
Сколько зданий на самом деле нужно району
Количество зданий вы не выбираете. Вы выбираете размер квартала и ширину фронта, а количество выпадает из арифметики. У квартала 80 × 110 м периметр 380 м; поделите на фронт — получите число зданий, выходящих на улицу: 63 при фронте 6 м, 31 при 12 м, 17 при 22 м или одно периметральное здание вокруг двора.
Пешеходный район — примерно 400 × 400 м, меньше пяти минут поперёк при 1,4 м/с. При шаге улиц 100 м это шестнадцать кварталов: по 17 зданий — 270 домов, по 31 — 500, по 63 — тысяча и совсем другой проект. Двести–четыреста зданий, выходящих на улицу, — рабочий диапазон: достаточно, чтобы заполнить любой вид вдоль любой улицы, и достаточно мало, чтобы вы успели посмотреть на все.
Уникальных мешей нужно отдельное и куда меньшее число. Если в кадре улицы двенадцать фасадов, до невидимости повторов нужно пятнадцать–двадцать разных корпусов плюс два правила расстановки: одинаковые здания не стоят рядом и не попадают вдвоём в один вид. Двадцать корпусов с тремя вариантами крыши и китом фасадов вытянут триста расстановок. Четыре корпуса с джиттером цвета не вытянут ничего, сколько бы их ни поставили.
Как описать город агенту
Чем бы город ни генерировался, описание должно читаться как задание градостроителя, а не как мудборд, и порядок здесь так же важен, как содержание: сеть, кварталы, участки, здания, малые формы, свет. В таком порядке каждая фраза ограничивает следующую — то есть повторяет цепочку зависимостей, которую геометрии всё равно придётся соблюсти.
Район на краю центра, 400 × 400 м, ровный. Одна магистраль идёт с севера на юг через середину: по две полосы 3,3 м в каждую сторону, озеленённая разделительная 2 м, тротуары 3,5 м с обеих сторон. Две распределительные улицы пересекают её с запада на восток с шагом 130 м, 8 м от бордюра до бордюра. Остальное заполняют местные улицы с шагом около 90 м, 7 м от бордюра до бордюра, парковка с одной стороны. Кварталы 80 × 110 м. Вдоль магистрали — сплошная застройка в пять-семь этажей, кирпич и камень, нулевой отступ, первый этаж 4,5 м с витринами, выше 3,1 м, фронт от 14 до 26 м. На местных улицах — трёхэтажные кирпичные ряды, фронт 6 м, палисадники 3 м за низкими оградами. На угловых участках здание шире, первый этаж со срезкой. Радиус бордюра 4 м на пересечениях с магистралью, 2 м в остальных. Фонари каждые 30 м на магистрали. Один квартал — парк, один — открытая парковка, в северо-западном квартале небольшая церковь. Позднее утреннее солнце с юго-востока.
Каждое предложение проверяется во вьюпорте — это и есть нужное свойство: когда результат выйдет не таким, вы укажете на проигнорированную фразу («распределительные стоят с шагом 90, а не 130») вместо того, чтобы переписывать описание и бросать кости заново. Структура вместо прилагательных работает для любой сцены из текста, но города наказывают за расплывчатость сильнее: у них больше частей, которые обязаны договориться между собой.
Что вы не пишете, важно не меньше: каждое ограничение придётся проверять, а сорок чисел проверяются дольше, чем строится район. Если агент управляет редактором, а не веб-формой, задание можно подавать частями — отметьте область, в которой ему разрешено строить, дайте проложить сеть, пройдите один перекрёсток и только после этого разрешите заполнять кварталы. В Cuberta любой шаг отменяется, поэтому неверная ширина проезжей части, пойманная на первом перекрёстке, стоит минуты, а не пересборки.
Интерьеры: нужны ли они вообще
Для городского района — в основном нет. Три уровня, по возрастанию цены:
- Непрозрачное стекло. Тёмный слегка отражающий материал на плоскости окна, за ним ничего. Под скользящим углом честно читается как зеркальный офис, в лоб с 5 м — как глухой блок.
- Interior mapping. Шейдерная техника, опубликованная Йостом ван Донгеном в 2008 году: пиксельный шейдер трассирует луч по воображаемым плоскостям пола и стен за окном и берёт текстуру комнаты в точке попадания. Окна получают настоящий параллакс без единого интерьерного полигона и без лишних данных на хранение. Именно это держит окна большинства открытых городов, и в пересчёте на потраченный час это самое выгодное, что можно сделать со сгенерированным районом.
- Настоящие смоделированные интерьеры. Стены, полы, мебель, свет и дверь, выходящая на тротуар на правильной высоте.
Важно не сколько у вас зданий, а в сколько игрок может войти: в большинстве городских уровней это от трёх до десяти из нескольких сотен. Эти сделайте до мебели, остальным тремстам отдайте шейдер. Генерировать интерьеры всему подряд — значит умножить число объектов примерно на двадцать ради комнат, куда никто не зайдёт, и заодно ухудшить те десять, которые важны: им нужен человек, решающий, где стоит диван. Cuberta строит меблированные интерьеры наравне с районами; тратить их стоит на список входимых зданий, а не на панораму.
Этот список составляйте до генерации района. У входимого здания есть требования, которых нет у фасада: дверь, выровненная по тротуару, первый этаж на высоте бордюра плюс ступень, пятно застройки, которое не является коридором 6 × 30 м, и внятная причина туда зайти. Дошивать это в здание, сгенерированное как обои, дороже, чем сразу построить правильно.
Куда уходит первый час
Постройте сеть и встаньте на перекрёсток раньше, чем сгенерируете хоть одно здание. Дороги режут кварталы, кварталы дают участки, участки ставят здания, и каждый шаг ограничивает следующий. Генераторы, которые это соблюдают, делают города скучные с воздуха и убедительные пешком — и это правильная сторона, потому что аэрофото игрок не увидит никогда. Генераторы, которые переворачивают порядок, дают обратное, и обратное уже не чинится ниже по цепочке: не существует операции над зданием, которая вернула бы его на улицу, к которой его никогда не ставили.