В этой заключительной статье мы подробнее рассмотрим системы, которые отдельные машины могут использовать как часть своего базового поведения. В них включены системы сенсоров, навигация для наземных и летающих машин, а также тесная связь ИИ-поведений с системами анимаций, обеспечивающая каждой машине опасное, но в то же время реалистичное поведение.
Сенсоры и движение
Для начала давайте рассмотрим сенсоры, используемые машинами для запуска реакций ИИ, а также узнаем, как анимация привязана к общему процессу выполнения их поведений. Машина может использовать значительное количество уникальных сенсоров: визуальные сенсоры, например, глаз «рыскаря», радар и сенсоры присутствия у «долгоногов», сенсоры слуха, улавливающие звуки далёких взрывов и бросков камней вблизи, а также способность чувствовать игроков, касающихся машины. У каждой машины есть набор этих сенсоров, откалиброванных собственными значениями чувствительности, благодаря чему подобраться, например, к «рыскарю» или «жвачнику» довольно просто, а «ловчего» поймать гораздо сложнее.
Традиционная система сенсоров способна всего лишь отслеживать происходящие вокруг ИИ события и «видеть»/«слышать» их, но на самом деле у системы сенсоров гораздо больше нюансов. Они используют пакеты информации, прикреплённые к объектам, способным вызывать стимулы на одном из сенсоров машин: такими объектами могут быть игрок, другие NPC, камни, летящие стрелы, другие машины и природа. Эти данные сообщают получателю (машине, которая что-то почувствовала) информацию о том, что она обнаружила, и о его состоянии. Поэтому машины, как и человеческие NPC, могут понять разницу между лежащим перед ними трупом и стрелой, просвистевшей рядом с их головой; кроме того, это позволяет сделать так, чтобы прячущийся в высокой траве или за деревьями игрок не был заметен — машины получают информацию, что он в этом состоянии невидим.
Каждый ИИ-персонаж, будь то машина или человек, способен обрабатывать и интерпретировать сенсорные данные разным образом, поэтому определённая информация может игнорироваться одними персонажами, в то время как другие должным образом реагируют на неё. На самом деле, в зависимости от силы сенсора в машине она может снижать получаемый от сенсорного события объём данных, который она может считать. Это позволяет управлять эмерджентными свойствами игры, чтобы каждый тип персонажей мог реагировать на информацию своим, уникальным образом.
Если ИИ должен выполнить основанное на этих сенсорных данных действие, то нам всё равно нужно сделать так, чтобы оно выглядело реалистично. Поэтому когда машина решает предпринять какое-то действие, например, перемещение в новую локацию, исследование источника беспокойства или нападение на игрока, существует проблема анимирования выполнения этих действий как можно более реалистичным способом. Анимация этих машин — очень сложная задача: они должны одновременно и выглядеть, как и живые прообразы, и иметь отчётливое машиноподобное поведение. Для этого необходимо, чтобы и навигационные, и боевые системы учитывали расстояние, которое должна пройти машина, а анимационный тулчейн должен подстраивать корневые кости анимаций и смешивать их в соответствии с воспринимаемым расстоянием и временем перемещения.
Это гарантирует, что при любом расстоянии перемещения и скорости машины она сможет начать анимацию, перейти в основную часть поведения, а затем смешать их правильно и в подходящее время. Это важно для таких поведений, как бег в определённую точку, когда машине нужно не только замедляться и останавливаться в нужной точке. Но особенно важно это в бою. Многие из используемых для атак анимаций имеют две отдельные последовательности: «замах», сообщающий о начале атаки, за которым следует завершение, наносящее урон. В Horizon Zero Dawn используется способ, похожий на тот, о котором я рассказывал в статье про ИИ игры DOOM: система контролирует текущее передвижение машины, смешивает анимации движения или атаки, чтобы оказаться в нужных точках, а затем делает так, чтобы машина оказалась или остановилась ровно в конце.
Навигация
Есть ещё одна серьёзная задача, о которой я ещё не говорил — навигация. Задача перемещения машин по миру очень сложна, существует большое разнообразие уникальных типов врагов, и все они имеют разный размер и форму. Поэтому они должны перемещаться по рельефу естественным для них образом. Кроме того, они должны распознавать изменения в локальной геометрии и адаптироваться к ним или просто игнорировать, в зависимости от типа машины. Для этого необходим широко используемый инструмент ИИ под названием navigation mesh (навигационный меш). Navmesh хранит в себе информацию о том, как конкретный персонаж может двигаться по карте на основании того, что для него в мире считается препятствиями. Хотя мы и можем вычислять всё это в процессе выполнения игры, такие данные обычно встраиваются или «запекаются» до выпуска игры и при необходимости загружаются в память.
Учитывая то, что карта Horizon Zero Dawn огромна и в конкретный момент времени требуются только отдельные её сегменты (ИИ активен и перемещается только вблизи от игрока), navigation mesh создаётся в процессе выполнения игры, но только в пределах непосредственной близости от игрока. Но интересно то, что используется не один navmesh, а целых шесть! Четыре из них обеспечивают движение персонажа на основании размера объекта: маленький, средний, большой или огромный. Поэтому люди и «рыскари» могут перемещаться вокруг маленького меша, а у таких машин, как «громозев», navmesh почти полностью принадлежит только им. Кроме того, есть ещё два дополнительных navmesh: один для плавающих машин, например, для «щелкозубов», а также уникальный меш, заставляющий машины стоять в удобных локациях на случай, если игрок попытается взобраться на них.
В каждом из этих случаев препятстия могут блокировать или изменять структуру навигационных мешей, а система пересчитывает изменения в реальном времени таким образом, чтобы подвижные препятствия (и даже другие машины) могли влиять на возможность перемещения по пространству. Интересно здесь то, что препятствия могут иметь разные свойства, и способны быть полностью непроходимыми, или просто нежелательными для перемещения — но это сильно зависит от состояния поведения ИИ машины. Как сказано в первой части, активно патрулирующие машины после своего создания избегают растительности, в которой можно спрятаться, но при исследовании ближайших источников беспокойства трава по-прежнему остаётся нежелательной, и при этом машина всё-таки может при необходимости пройти по ней. Тот же принцип применяется и для небольших камней и деревьев: это непроходимые объекты, за исключением крупных машин, таких как «бегемоты», «камнегрызы» и «громозевы». Эти монстры могут разбивать камни и вырывать деревья с корнем, но только если они в состоянии гнева или преследуют игрока. Находясь в состоянии других поведений, эти машины воспринимают такие препятствия как любые другие.
Движение по воздуху
Хотя этот тулчейн навигации справляется с наземными машинами всех размеров и форм, он совершенно не работает для тех, кто летает в воздухе. Неигровые персонажи, перемещающиеся по воздуху, не только должны учитывать ближайшие препятствия, чтобы не сталкиваться с деревьями или обрывами, но и обязаны знать высоту окружающей их геометрии. Мир Horizon Zero Dawn полон холмов, лесов, скал и крутых горных подъёмов… Два типа летающих машин, «коршун» и «буревестник», должны знать, как перемещаться по воздуху таким образом, чтобы можно было взлетать, перемещаться по маршрутам патрулирования, приземляться, а также снижаться и при необходимости нападать на игрока. Для этого в игре есть не только наземная система навигационных мешей, но и полностью отдельная система для воздуха.
Её создание оказалось сложной задачей для отдела разработки ИИ игры. Он воспользовался техникой под названием «планирование иерархических путей по MIP-текстурам» (hierarchical path planning over MIP maps). MIP-текстурирование (MIP Mapping) — это используемая в компьютерной графике техника. направленная на минимизацию объёма памяти, занимаемого текстурой или изображением. Для этого создаётся набор одинаковых изображений с постепенно уменьшающимся разрешением. Такое решение идеально подходит для управления уровнем детализации в играх: объекты в сотнях метров от игрока видимы, но используют меньше памяти текстур, чем те, которые находятся рядом с игроком и используют максимальное качество. Этот подход применили для навигации потому, что когда машина летит по проложенному в мире пути, ей не нужно знать с полной точностью локальную геометрию того места, где она будет через минуту, но необходимо знать расположение земли непосредственно перед тем, как она должна приземлиться. Система планирования пути для воздушных машин использует MIP-текстурирование для создания карты высот локальной геометрии — структуры данных, сообщающей нам высоту в заданной позиции x/y мира. MIP-текстуры имеют четыре уровня, и с приближением к земле становятся всё более сложными и реалистичными. Уровень 3 — это простая и абстрактная модель, а текстура уровня 0 — это достаточно точная карта высот мира.
Почти так же, как и навигационные меши, mip-текстуры создаются в процессе выполнения игры и по мере необходимости: при полёте в пределах определённой области машине не обязательно знать данные высот всего мира. Когда им необходимо перелететь в другую локацию, ИИ навигации полёта запускает алгоритм поиска A* по MIP-текстуре наивысшего уровня, то есть он вычисляет простейшую версию маршрута полёта по приблизительной версии геометрии. Алгоритм A* делает полёт над и под препятствиями более затратным, чем их облёт, поэтому машины парят рядом с горами и скалами чаще, чем пролетают над ними. Каждый раз, когда система вызывает алгоритм A*, он имеет только ограниченное количество итераций, поэтому после вычисления пути по простейшей mip-текстуре (уровня 3) он берёт определённый сегмент вычисленного пути, а затем усовершенствует его, заимствуя данные с уровней 1 и 0, чтобы сделать его более реалистичным и соответствующим геометрии. Кроме того, он сглаживает маршруты таким образом, чтобы исключить крутые уклоны и резкие повороты, делая их более реалистичными. Эта система работает очень хорошо, любая находящаяся в воздухе летающая машина всегда имеет план полёта (даже когда он плох), а при необходимости она может улучшить его, многократно вызывая алгоритм поиска, чтобы путь становился всё более естественным. К тому же это эффективно использует память, но такой подход имеет один изъян — так как он основан на максимальной высоте заданной области карты. машины не могут пролетать под мостами или каменными арками, но чаще всего игрок этого не замечает.
Благодаря наземным navmesh и воздушным mip-текстурам летающие машины могут координировать нападения, приземления, атаки пикированием и даже падения на землю в соответствии с геометрией. Машины, зависающие над игроком, во время атаки по-прежнему используют предварительно рассчитанный план полёта, но не обязательно движутся вдоль этого пути, и воспроизводят соответствующую анимацию. Скорость машины привязана к режиму (полёт, парение или зависание), поэтому они могут реалистично кружить над игроком, используя тот же инструмент навигации.
Взлёты и приземления используют отдельную систему, взаимодействующую с навигацией полёта и наземным навигационным мешем: она ищет на меше подходящие позиции, на которые можно приземлиться (обычно это точки немного выше над землёй, чем локальное среднее), а затем подбирают углы и скорость. Приземлившись, машина использует наземный navmesh, соответствующий её размеру. Тот же принцип на самом деле применяется и при падении, только в этом случае единственные подходящие позиции приземления основываются на текущем курсе машины, и хотя крушение выглядит менее грациозно, на самом деле оно использует те же инструменты. Специально запрограммированным граничным случаем здесь является атака пикированием «буревестника». «Буревестник» кружит над игроком, а затем падает вниз по направлению к текущей позиции игрока. Он использует те же системы, но гораздо более драматичным образом. Однако здесь есть ещё одна хитрость: кружась над игроком, «буревестник» часто ждёт перед атакой, пока не закроет солнце. Возможно, играя в игру, вы это замечали, и это сделано намеренно. При тестировании ИИ «буревестника» отдел QA заметил, что он периодически закрывает игроку солнце, и это делает его атаку более дизориентирующей, потому что во время пикирования свет сдвигается и ослепляет игрока. Тогда это происходило полностью случайно, но затем отдел разработки ИИ решил, что это должно происходить чаще.
В заключение
Horizon Zero Dawn создаёт уникальный игровой процесс; мир, наполненный механической жизнью, становится местом, где разворачивается история Элой и тайн её прошлого. Искусственный интеллект и геймплейные системы машин — важнейший аспект создания этого исследуемого игроками апокалиптического будущего. Это была масштабная работа для команды из 10 людей, занявшая несколько лет разработки. Создание систем ИИ подобного масштаба, хорошо работающих в играх с огромным открытым миром, становится всё более сложной задачей. Поэтому сообществу разработчиков игр жизненно необходимо делиться своим опытом с остальными.
Справочные материалы
- Julian Berteling, 2018. «Beyond Killzone: Creating New AI Systems for Horizon Zero Dawn», GDC 2018.
- Arjen Beij, 2017. «The AI of Horizon Zero Dawn», Game AI North 2017.
- Wouter Josemans, 2017. «Putting the AI back into Air: Navigating the Air Space of Horizon Zero Dawn», Game AI North 2017
Источник