Как реалистично программировать стайное поведение в играх?

erid: 2VtzqwWb7qC

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

Когда появилась симуляция стайного поведения?

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

Вот что пишет Крейг про свою разработку: «В 1986 году мной была создана компьютерная модель скоординированного движения животных, птиц, рыб. Она была сделана на основе трехмерной вычислительной геометрии, которая часто используется в компьютерной анимации. Моделируемым существам было дано название — боиды. Основная модель стайного движения опирается на три простых режима управления, каждый из которых описывает как маневрируют отдельные боиды в зависимости от их местоположения, скорости передвижения и своих товарищей по стае». В момент разработки Boids Рейнольдс работал в студии Symbolics Graphics Division, она занимается созданием графического софта, который позже использовался в таких проектах, как «Звёздный Путь 3: В поисках Спока», «Освободите Вилли».

В 1987 году компания Symbolics Graphics Division выпускает мультфильм длительностью три минуты под названием Stanley and Stella in: Breaking the Ice — в нем первый раз был использован Boids. Сам сценарий картины довольно простой: по космическому пространству летает ракета, она поделена на две половины льдом. Внизу находится вода, в которой плавают рыбы, а сверху воздух, в котором летают птицы. Главные герои картины: птица Стэнли и рыбка Стелла полюбили друг друга и поэтому в один момент птичка таранит клювом лед и тем самым объединяет два мира. Вот что делает любовь… Стаи птиц и косяки рыб в мультфильме ведут себя таким образом, каким бы вели себя в реальной жизни. Stanley and Stella in: Breaking the Ice показали на ежегодной конференции по компьютерной графике. На ней же присутствовал Крейг, который представил свой доклад с подробным описанием того, как ему удалось при помощи чисел воспроизвести процесс, на который у эволюции ушло миллионы лет

Если сильно не вдаваться в подробности, то каждый боид ведет себя на основе трех правил:

  1. Разделение — боиды никогда не должны сталкиваться друг с другом;
  2. Выравнивание — боид всегда должен четко знать куда ему двигаться и если нужно менять направление, чтобы не с кем не столкнуться на своем пути;
  3. Сплоченность — боид всегда должен передвигаться в средней позиции между разными соседями, но при этом он всегда должен придерживаться своих товарищей.

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

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

Можно настроить совершенно любой угол обзора и радиус поиска боида для каждого из правил, тем самым получить необходимый вид построения маршрута для проекта. Для примера мы решили взять проект для Unity от разработчика SuboptimalEng, который был выполнен с использованием алгоритма Boids. Мы проверили, что если во время работы программы менять радиус для Separation, Alignment, Cohesion, то боиды сразу станут менять свое построение опираясь на новые условия. Можно создать совершенно разные модификации для алгоритма Boids — неограниченное количество, сколько нужно будет для конкретного проекта.

Можно сделать вывод, что сложное поведение большой стаи должно быть создано при помощи трех самых простых правил, по которым должен двигаться каждый из боидов. Теперь мы хотим на конкретных примерах игр посмотреть, как использовался алгоритм Boids — это поможет еще более детально разобраться в этом вопросе.

Half-Life

Первый пример, в котором мы видим, как реализуется алгоритм Boids — это первая выпущенная игра Half-Life в 1998 году. В какой сцене это заметно? В финальном сюжете, когда герой G-Man подробно рассказывает Гордону Фримену о его работе, о новом месте. Основной сюжет разворачивается в мире Зен, когда G-Man начинает рассказывать Гордону свой текст, то мимо него пролетает стая животных, отдаленно похожих на птиц. Вот именно эта стая построена при помощи алгоритмов Boids, название у них кстати соответствующие. Мы решили подробно разобрать движение птиц.

У них было довольно правдоподобное движение — это одна их технологических фишек проекта Half-Life Alpha. Каждая птичка выбирала себе лидера, за котором начинала свой полет. У стаи не было заранее определенного маршрута, их основная цель заключалась в том, чтобы не наткнуться на препятствия. Что делало движение птиц таким убедительным? Скорость, с которой они махали крыльями — она напрямую зависела от их ускорения и маневров при повороте. Если лидер погибал, то стае нужно было выбрать себе нового персонажа, за которым она пойдет. Когда совершенно любой боид погибал, то стая начинала издавать характерный звук. Boids используется только один раз в игре, поэтому игроки не могут взаимодействовать со стаей. Они внедрены в проект в качестве декорации, но при этом каждый пользователь имел возможность увидеть сзади героя птиц с уникальным маршрутом. В то время это был прямо игровой прорыв.

Assassin’s Creed Unity

Глобальную работу с поведением уличной толпы мы можем наблюдать в проекте Assassin’s Creed Unity. В один момент игры на экране появляются 120 NPC, каждый из которых обладает личной анимацией, но при этом нужно понимать, что искусственный интеллект будет только у трети особей. Несмотря даже на такие ограничения в некоторых сценах проекта можно увидеть около 10 000 боидов, которые ведут себя так, как будто у них полностью проработана модель движения

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

В Assassin’s Creed 3 была внедрена технология, которая дала возможность выводить на экран несколько 1000 дешевых мешей совершенно обычной анимации. Такие модели были использованы для крабов, птиц и для изображения армии. Но солдаты армии выполняют только самую простую анимацию, например могут пригнуться или перезарядить оружие, то есть игрок с ними работать никак не может. Доработанную версию технологии использовали потом в проекте Assassin’s Creed Unity, в которой повествование закручено вокруг Французской революции. Разработчики спроектировали проект Bulk — это прототип алгоритма Boids, но только с другим названием, больше отличий мы не нашли. Основная суть заключается в том, что первоначально толпа на улицах состоит из максимально простых моделей горожан, но когда к ним приближается герой, то игра меняет простого горожанина на более сложного.

Для проекта пришлось также создать собственную систему просчета столкновений NPC в стае, так как хитбоксы для нескольких сотен горожан создавать было довольно сложно. Есть карта с местоположением для каждого NPC, в ней для отдельных героев определяется тот факт, находятся ли они в пределах досягаемости другого персонажа и если это так, то начинается простая анимация скольжения в сторону. Это не физическое столкновение, его в проекте не допускают. За искусственный интеллект и за то, чтобы вовремя запустить анимацию, отвечают «пастухи» — это невидимые объекты, которые вокруг себя создают толпу и потом ей руководят. Разработчики заполняют улицы пастухами, а не обычными горожанами, с помощью которых можно настроить определенное количество персонажей в толпе, плотность ее и поведение. Например, можно выбрать как будут вести себя NPC — просто гулять по дороге или протестовать.

В Assassin’s Creed Unity есть блуждающие пастухи, которые держат под контролем поведение NPC, осуществляющих движение по улицам города. Они в большинстве случаев движутся по кругу заранее прокладывая маршрут. Если персонаж долго будет идти за одним из пешеходов по улице, то через 15 минут он опять вернется в исходную точку. Помимо этого, блуждающий пастух постоянно следит, чтобы по каждому району ходили только его пользователи. Не всегда в игре нужны стаи толпы, но если они правильно созданы, то это добавляет реалистичности и зрелищности. Воплотить в жизнь такое поведение можно совершенно разными способами, самое основное правило — это не перегрузить компьютер различными вычислительными операциями.

В некоторых проектах, например таких, как Subnautica, можно обойтись при помощи простого генерирования частиц. В более сложных играх, таких как

Assassin’s Creed Unity, Left 4 Dead, Hitman: Absolution, в которых толпа является отдельной игровой механикой нельзя использовать вышеперечисленные хитрости. Нужно было придумать свои или использовать наработки, которые уже есть в индустрии — например самый популярный алгоритм Boids, его до сих пор очень активно используют в играх и кино.

Реклама. ООО «3хВэБ» ИНН 5321134100

Комментарии
Комментариев пока нет