Геймдев
#статьи

Как ИИ заставляет машины ездить и стоять в пробках на улицах игровых городов

Изучаем подходы к созданию симуляций дорожного движения в больших городах на примере GTA, Driver: San Francisco, Cities: Skylines и других игр.

Иллюстрация: скриншоты из игр Midtown Madness 2 / Angel Studios / Cities: Skylines 2 / Colossal Order / Grand Theft Auto 3 / Rockstar Games / Annie для Skillbox Media

Если в игре есть современный большой город, значит, должны быть и машины. Если есть машины, то они обязаны соблюдать ПДД, устраивать пробки, иногда биться друг о друга. Иначе нереалистично будет.

И вот тут разработчики сталкиваются с комплексной проблемой — как настроить искусственный интеллект так, чтобы он правдоподобно создавал городской трафик? Симуляция стайного поведения здесь не подойдёт, ведь каждое транспортное средство должно восприниматься как самостоятельная единица, которая двигается по своему маршруту, а не по одному общему.

При этом каждая такая единица должна не просто находить своё место на дороге, но и учитывать при этом постоянно меняющееся окружающее пространство. В этом тексте мы решили разобраться, как решали эту проблему авторы разных игр.

Игры Angel Studios

Серия гоночных игр Midtown Madness, появившаяся в 1999 году, выделялась среди других представителей жанра наличием открытого мира. В первой части можно было свободно исследовать Чикаго. Во второй появились Сан-Франциско и Лондон. В третьей — Париж и Вашингтон.

По дорогам ездили машины, работали светофоры, по тротуарам ходили пешеходы. Полиция порой включала сирены и гонялась за игроком. Над первыми двумя частями работала Angel Studios (будущая Rockstar San Diego), которая также запустила в 2000 году очень похожую серию Midnight Club — тоже с большими открытыми городами и гонками.

Скриншот: игра Midtown Madness 2 / Angel Studios

Для обеих игр Angel Studios использовала один и тот же подход к созданию ИИ, симулирующего движение автомобильного трафика по городским улицам.

Начнём с того, что с точки зрения ИИ вся карта города состоит из трёх компонентов — дорог, перекрёстков, соединяющих их, и открытых пространств вроде скверов или площадей. Последние, кстати, тоже включали дороги, но их видел только ИИ. Он использовал их, когда хотел срезать маршрут.

Каждая машина в игре двигается по сплайну — кривой, построенной в пространстве на осях X и Z. Сама кривая строится автоматически по ходу движения транспортного средства. Для этого дорога разделена на небольшие сегменты. Когда машина покидает один сегмент и заезжает в следующий, вычисляется следующая часть кривой.

Скриншот: игра Midtown Madness 2 / Angel Studios

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

На дорогах для ИИ введён лимит по скорости движения. При этом у каждой машины случайным образом определяется число, на которое она превышает или, напротив, недобирает разрешённую скорость. Благодаря этому поток автомобилей двигается более реалистично, как бы вразнобой.

Но тут возникает другой вопрос. А если они двигаются с разной скоростью, то как избежать постоянных столкновений между ними? Сложность в том, что если позволить каждой машине проверять себя на столкновения с окружающими транспортными средствами, то производительность у игры упадёт, ведь это слишком уж много вычислений в единицу времени.

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

Джо Аздима,
программист ИИ, работавший над Midtown Madness, Midtown Madness 2 и Midnight Club

Скриншот: игра Midtown Madness 2 / Angel Studios

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

Во-первых, надо получить одобрение от системы, которая определяет, как машины должны реагировать на сигналы светофора. Есть четыре состояния, которые присваиваются дорогам, выходящим на перекрёсток:

  • NoStop — машины с этой дороги могут спокойно проехать по перекрёстку.
  • AllwayStop — на этой дороге машины должны остановиться перед перекрёстком и стоять, независимо от того, что там горит на светофоре.
  • TrafficLight — транспорт на этой дороге поедет через перекрёсток, когда загорится зелёный.
  • StopSign — ехать может транспортное средство, которое ожидало дольше всего.

Во-вторых, одобрение должна дать система, проверяющая, не произойдёт ли ДТП на перекрёстке, если позволить автомобилям ехать.

В-третьих, на дороге, на которой окажется машина после пересечения перекрёстка, должно быть достаточно места, чтобы машина поместилась на ней целиком во всю длину.

Четвёртая финальная проверка смотрит, не выезжают ли в этот самый момент на перекрёсток другие автомобили, управляемые ИИ.

«Эта проверка необходима для случая, когда машина поворачивает с дороги со статусом StopSign на дорогу со статусом TrafficLight. По идее, StopSign даёт разрешение на движение по перекрёстку транспорту, простоявшему у него дольше всех. Но в реальности он двинется на нужную ему дорогу, только когда по перекрёстку проедут машины, для которых светофор загорелся зелёным».

Джо Аздима,
программист ИИ, работавший над Midtown Madness, Midtown Madness 2 и Midnight Club

Скриншот: игра Midnight Club: Street Racing / Angel Studios

И вот, когда все четыре проверки пройдены и машина поехала по перекрёстку, она должна принять решение, куда же ей дальше двигаться — налево, направо или прямо. Определяется это согласно следующим правилам.

Если машина стоит на крайней левой полосе, то она может поехать налево или прямо. Если на крайней правой — направо или прямо. Автомобиль на одной из центральных полос поедет только прямо. Машина, едущая по дороге с односторонним движением случайно выберет одну из примыкающих дорог. Ну и самое занятное: крутые U-развороты под запретом, так как траектория движения, построенная сплайном в этом случае выглядит неестественно.

Если дорога достаточно длинная, то машина может перестроиться из одной полосы в другую. Делается это для того, чтобы на каждой из них было примерно одинаковое количество транспорта. Само перестроение начинается, когда автомобиль проедет примерно 25% от длины дороги. В момент перестройки машина рассчитает сплайн, который плавно переместит её с одной полосы на другую. В этот момент проверку на столкновение с машиной впереди она будет проводить сразу на всех полосах.

Скриншот: игра Midnight Club: Street Racing / Angel Studios

Чтобы не тратить ресурсы компьютера на проработку поведения всех автомобилей в городе, полноценную симуляцию получают лишь те из них, что находятся в небольшом радиусе от игрока, в так называемом симуляционном пузыре.

Так как машины не стоят на месте, иногда они подъезжают к границе этого симуляционного пузыря. Если в этот момент автомобиль едет по дороге с двусторонним движением, то он перемещается на соседнюю встречную полосу и начинает ехать обратно к игроку. Если автомобиль едет по дороге с односторонним движением, то он убирается в пул машин, откуда игра потом может снова взять его для размещения на дорогах.

Driver: San Francisco

В игре Driver: San Francisco, вышедшей в 2011 году, использовался похожий подход к созданию городского трафика, но с поправкой на особенности геймплея. В вашем распоряжении большой город, в котором надо выполнять разные миссии, — и при этом можно в любой момент пересесть в любую понравившуюся машину, которую вы увидите на дороге.

Разница с той же GTA в том, что в Driver: San Francisco для этого не надо выходить из машины. По сюжету, главный герой — детектив, который находится в коме и ведёт расследование, переселяясь из одного водителя в другого. И чтобы машина, которую герой покинул, не встала на месте, словно брошенная, а продолжила движение естественным образом, разработчикам пришлось продумать систему работы ИИ.

Скриншот: игра Driver: San Francisco / Ubisoft Reflections

В Driver: San Francisco за движение транспорта отвечают два разных типа ИИ — Civilian Traffic AI и Active Life AI. Первый отвечает за симуляцию движения общей безликой массы машин. Каждое транспортное средство двигается по городу по кругу, по заранее начерченному маршруту — сплайну.

«Каждый сплайн был определён таким образом, чтобы он не пересекался ни с каким другим сплайном. Каждое гражданское транспортное средство должно было следовать по сплайну, зная, что вероятность столкновения с другими гражданскими транспортными средствами исключена».

Крис Дженнер и Серджио Окио Барриалес,
разработчики Driver: San Francisco

А вот система Active Life AI управляет машинами, участвующими в сценах с преследованием и гонками. Эта система просчитывает для них сложную траекторию движения, учитывающую не только действия игрока, но и окружающее пространство и другие машины, едущие по дороге под управлением системы Civilian Traffic AI.

Скриншот: игра Driver: San Francisco / Ubisoft Reflections

Кроме того, когда игрок переключается с одного транспорта на другой, именно Active Life AI берёт на себя управление брошенной машиной.

«Если игрок покинет полицейскую машину, преследующую подозреваемого, ИИ назначит полицейской машине поведение „преследование цели“, и она продолжит делать то, что делал игрок до переключения. Если игрок управлял гражданской машиной без конкретной цели, то после того, как он её покинет, ИИ выберет для этой машины ближайшее свободное место на сплайне городского трафика и попытается встроить её туда. Как только это произойдёт, управлять машиной будет уже не Active Life AI, а более простой Civillian Traffic AI».

Крис Дженнер и Серджио Окио Барриалес,
разработчики Driver: San Francisco

Скриншот: игра Driver: San Francisco / Ubisoft Reflections

Cities: Skylines 2

В градостроительном симуляторе Cities: Skylines 2, вышедшем в 2023 году, особое внимание разработчики уделили симуляции движения городского транспорта. Автомобили рассчитывают траекторию своего движения с учётом окружающих их машин и пешеходов. Они постоянно решают, надо ли ускориться, объехать ли встречный транспорт, переключиться ли на другую полосу движения.

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

Скриншот: игра Cities: Skylines 2 / Colossal Order

«В Cities: Skylines 2 агенты [машины] выбирают маршрут, исходя из параметра стоимости пути. Эта стоимость вычисляется при помощи множества факторов, таких как дорожная сеть города, время в пути, стоимость проезда, предпочтения агентов и многое другое. Также агенты корректируют свой маршрут в зависимости от событий на пути следования. Они могут перестроиться на другую полосу движения, чтобы избежать автомобильной аварии или остановившегося служебного транспорта. Они могут освободить место для машины, прибывшей на место происшествия».

Дневники разработчиков Cities: Skylines 2

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

Скриншот: игра Cities: Skylines 2 / Colossal Order

Под деньгами понимаются такие параметры, как расход топлива и стоимость парковки. А под поведением — готовность водителя к опасному вождению. Гражданские машины и транспорт службы доставки, например, не будут делать U-разворот на дороге, чтобы срезать стоимость пути, в отличие от скорых и пожарных машин.

При определении маршрута учитывается и возраст условного водителя. Для молодёжи наибольшее значение имеет фактор денег — чем дешевле, тем лучше. Для взрослых людей важнее время. Пенсионеры предпочитают комфорт.

Двигаясь по городу, поток автомобилей распределяется по всем доступным полосам. Если на многополосной дороге у перекрёстка одна из полос полностью занята, то подъезжающая машина выберет свободную полосу. Благодаря этому они будут заполнены равномерно.

На кольцевой развязке машины, прежде чем въехать, уступают дорогу тем, которые уже движутся по ней. Но при случае они могут и попытаться проскочить перед носом у другого транспортного средства.

Скриншот: игра Cities: Skylines 2 / Colossal Order

ДТП, которые случаются на дорогах Cities: Skylines 2, по сути, всегда срежиссированы. Они происходят, когда на участке дорожного полотна сочетаются несколько условий — плохое освещение, плохая погода, плохое состояние асфальта.

Если машина окажется на участке, где совпали все условия, то случайным образом решается «потеряет ли она контроль». В этот момент у неё включается простая система просчёта физики для столкновений, и невидимая сила толкает её в рандомном направлении. Кстати, если эта машина столкнётся с другой машиной, то у той тоже включится система просчёта физики.

Grand Theft Auto

Серия Grand Theft Auto, или просто GTA, с самой первой части могла похвастаться приличной симуляцией дорожного трафика. Игра создавалось с прицелом на то, что действие в ней будет происходить в функционирующем, живом городе — чтобы игроку было веселее поломать это всё, устроив хаос.

Машины едут по дороге, останавливаются на красный сигнал светофора. Каждую машину можно довольно долго преследовать, благодаря чему возникает ощущение, будто однажды она куда-то приедет.

Скриншот: игра Grand Theft Auto / DMA Design

«Вы чувствуете, что оказываете влияние на мир, если мир работает, даже когда вы ничего не делаете. …Для этого нам пришлось фактически создать функционирующую систему светофоров, чтобы в городе было движение и машины останавливались на светофорах в нужное время. <…>
С моей стороны было наивно думать, что игроки будут останавливаться на красный свет, чтобы полиция их не преследовала. Конечно, все хотели проехать на красный, чтобы полиция погналась за ними. Это же часть веселья».

Кит Гамильтон,
программист, работавший над первыми двумя частями Grand Theft Auto

Конечно же, всё это умело созданная иллюзия. На самом деле транспорт на дороге появляется непосредственно за границей экрана. Если для эксперимента полностью загородить дорогу несколькими брошенными автомобилями, а затем спуститься чуть ниже по улице, чтобы этот затор пропал из вида, то вы вдруг обнаружите, что со стороны затора едут новые машины, будто путь там свободен. Но если опять подняться по дороге — затор будет на месте.

Автомобили не исчезают, если долго ехать за ними: они движутся по выбранной полосе. Но объезжать препятствие в первой части GTA искусственный интеллект ещё не умеет. Если вы встанете у машины на пути, она просто будет ждать, пока вы не уйдёте. Зато если вы тараном сдвинете её со своей полосы или вообще оттолкнёте на тротуар, то она постоит и, как только путь освободится, вернётся на дорогу.

Скриншот: игра Grand Theft Auto / DMA Design

В Grand Theft Auto 3, вышедшей в 2001 году, одним из ограничений, которые усложняли симуляцию трафика на городских улицах, было небольшое количество памяти на PlayStation 2. За раз можно было показать лишь восемь транспортных средств на экране. Разработчики написали специальный код, который постепенно удалял существующие автомобили и загружал новые, создавая ощущение, будто по улицам Либерти-Сити постоянно ездит много разных машин.

Скриншот: игра Grand Theft Auto 3 / Rockstar Games

«Код подбирает модель, наиболее подходящую для района. В деловом районе ездят спорткары, в запущенных районах ездят старые машины. Если игрок отправится в другую часть карты, то некоторые из загруженных автомобилей будут выглядеть неуместно, и их нельзя будет использовать. Загрузка запасных моделей займёт некоторое время».

Оббе Вермейдж,
один из разработчиков Grand Theft Auto 3

Порой часть из восьми позиций, выделенных в памяти под автомобили, игре приходится отдавать под скорые или пожарные машины, которые приезжают на место происшествия, под сюжетный транспорт, который появляется только в определённых миссиях, или же под полицейские машины, фургоны SWAT и даже вертолёт в ситуации, если игрок набедокурил и повысил свой уровень розыска. Так что иногда на симуляцию городского трафика у игры оставалось всего одна-две свободных позиции.

Скриншот: игра Grand Theft Auto 3 / Rockstar Games

Игре также приходится держать в памяти последнюю машину, которую использовал игрок, чтобы тот мог выйти из неё, погулять, а потом вернуться и поехать дальше. Поэтому машины, которые игрок оставляет в гараже, удаляются сразу, как только дверь закрывается, чтобы слишком не нагружать память. Потом, когда дверь открывается, машина создаётся заново.

По похожему принципу дорожный трафик работал и в Vice City, и в San Andreas. Но в Vice City игроки могли заметить, что, когда их преследовала полиция, на некоторых перекрёстках очень эффектно со смежной дороги выезжали полицейские машины и перекрывали персонажу путь.

«Обычно полицейские машины создаются вдалеке и получают приказ атаковать [персонажа] игрока. Но в Vice City я экспериментировал с заранее подготовленными локациями, где полицейские машины появляются как раз вовремя и с нужной скоростью, чтобы возникнуть прямо перед игроком. Их было слишком сложно настраивать, поэтому в игре лишь около пяти таких мест. Чтобы сработал такой триггер, надо повысить свой уровень розыска до трёх звёзд. И после того, как они выехали, надо подождать несколько минут, чтобы они снова могли так выехать».

Оббе Вермейдж,
один из разработчиков Grand Theft Auto 3

Скриншот: игра Grand Theft Auto 3 / Rockstar Games

Подробности того, как устроен ИИ городского трафика в GTA 4 и GTA 5, разработчики не рассказывали. Но игроки сами смогли обнаружить пару интересных деталей. Например, они узнали, что порой гражданский транспорт намеренно отклоняется от своего маршрута, чтобы оказаться на пути у игрока и спровоцировать ДТП. Эту особенность подробно обсуждали на Reddit.

Скриншот: игра Grand Theft Auto 3 / Rockstar Games

Если в четвёртой части машины виляли в сторону игрока как бы случайно, с учётом своей естественной скорости, чтобы была возможность уйти от столкновения, то в пятой игре они будто бросаются под колёса.

По мнению одного из моддеров, разбиравшихся в проблеме, Rockstar использовала на гражданских машинах тот же скрипт, который используют полицейские машины, когда преследуют персонажа игрока, — с его помощью, приблизившись к главному герою, они начинают копировать его движения.

И этот скрипт может в любой момент взять управление гражданской машиной, из-за чего та вдруг резко поедет в сторону персонажа. При этом такая машина временно получит возможность брать на таран что угодно, пробивая автомобильный поток насквозь, словно танк. Не совсем ясно, для чего это было сделано. Возможно, чтобы водители на дороге не вели себя слишком уж идеально?

Скриншот: игра Grand Theft Auto 5 / Rockstar North

Впрочем, в GTA 5 симуляция движения городского транспорта и так не идеальна. Да, если вдруг на дорогу выбежит олень, водитель легковушки вдарит по тормозам и посигналит, чтобы животное убежало. Но потом он продолжит движение и будет ехать бесконечно долго, без какой-либо конкретной цели.

Ярче всего ощущение реального города ломает машина скорой, которая иногда проносится мимо вас со включённой сиреной. Кажется, что она спешит оказать кому-то помощь. Но если поехать за ней, то она так и будет мчаться по городу, сворачивая на перекрёстках то в одну, то в другую сторону, пока в какой-то момент, минут через пятнадцать, ИИ просто не выключит сирену.

Разумеется, иного ожидать странно. Машины в игровых городах — это, скорее, актёры, которыми ИИ управляет, как режиссёр. Создавать эффектную постановку он научился ещё лет 20 назад. Дальнейший прорыв возможен будет лишь при усовершенствовании технологий ИИ, когда в поездке каждой машины главным будет уже результат, конечная цель, а не сам процесс.

Попробуйте новую профессию в геймдеве — бесплатно

Доступ к курсам за 0 р.

Я не знаю, с чего начать
Кто вы в мире геймдева? Узнайте на бесплатном курсе ➞
Вы на практике попробуете 3 профессии: геймдизайнера, 2D-художника и разработчика на Unity. Создадите свою первую игру в стиле Mario. Подробности — по клику.
Узнать больше
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована