AI Map. Теория

Материал из MODFAQ.RU — моддинг игр серии S.T.A.L.K.E.R., The Elder Scrolls и Fallout
Перейти к: навигация, поиск

AI Map. Теория

Автор HellRatz
Тип статьи справка
Актуальность ТЧ, ЧН, ЗП
Связанные статьи
AI Map. Теория

AI Map. Практика
AI Map. Корректировка сгенерированной карты

Что такое AI Map?

AI Map[1] - площадь на уровне, заполненная AI узлами (нодами), контролирующие или ограничивающие перемещение NPC/Мутантов (Далее - боты) по уровню. В движке X-Ray существует два типа сущности: либо что-то онлайн, либо оффлайн. Онлайн обычно ограничивается видимостью вокруг ГГ (В оригинале 150 метров). В онлайне боты перемещаются по AI сетке, в оффлайне же они перемещаются по точкам - графпоинтам. Когда моб попадает в видимость ГГ, он переходит из оффлайна в онлайн - это те самые моменты, когда игра зависает иногда на несколько секунд и движок переключает объекты из оффлайн в онлайн. AI карта должна быть цельной, не имеющая разрывы между нодами.

1.jpg
AI Map в X-Ray SDK Level Editor


На картинке выше видно, как AI сетка огибает статические объекты. Это не ошибка редактора, так и должно быть. Дело в том, что мобы в игре не видят статические объекты, они видят только AI карту и перемещаются строго по ней. По этому, если AI сетка будет проходить сквозь статический объект (Дерево, автомобиль, дом и т.п) то моб спокойно пройдет сквозь него.

2.jpg
Соединение нодов между собой


На изображении выше видно соединение нодов между собой и направление каждого из них. В зависимости от количества сторон, куда может вывести нод, ноду причисляется свой цвет:
1) Полностью серый нод - все 4 направления;
2) Нод с 1 оранжевым ребром - 3 направления;
3) Нод с 2 синими ребрами - 2 направления;
4) Нод с 3 зелеными ребрами - 1 направление.
В самом худшем случае нод имеет красный цвет, это означает, что нод не соединен с основной сеткой. Его нужно либо удалить, либо присоединить к основной карте.

Что такое графпоинты и для чего они нужны?

Если моб становится оффлайновым (Уходит из зоны видимости ГГ, заданным в alife.ltx), то движок переводит его в режим "оффлайн" и моб отправляется ходить по графпоинтам, от точки к точке перемещаясь, как бы живя своей жизнью. Графпоинты - особые точки, которые существуют только на AI карте. Графпоинты видны в SDK, их можно редактировать расставляя как угодно или удаляя их, но в итоге после компиляции под формат игры, графпоинты не будут являться частью игрового уровня или all.spawn: компилятор xrAI переводит графпоинты в вершины игры/уровня (в глобальный граф). Все оффлайновые мобы могут перемещаться по этим точкам, не считаясь с переходами между уровнями (Как для ГГ), то есть для них графпоинты каждого уровня одна большая бесшовная карта, по которой они ходят, по этому и происходят в сталкере многие оффлайн-события, особенно в модах (Типа АМК) без участия игрока, например NPC с Кордона ушел в Бар, на Складах убили сталкеров, пока ГГ был в Припяти и т.д. Следует заметить, что расставляя граф-поинты в SDK, они должны находиться строго на АИ-карте, не должны проваливаться под сетку или висеть над ней, каждый граф должен стоять на ноде - иначе будут ошибки.

3.jpg
Выделены все графпоинты на локации Кордон


Полезная информация касательно AI Map

1. При проекции на плоскость XZ представляет собой ноды 0.7х0.7
2. Ноды (или лв) нумеруются с юга на север, с запада на восток.
3. Нулевой вертекс самый западный, однако не всегда самый южный.
4. Вертекс имеет координаты X и Z кратные 0.7 (размеру ноды).
5. Если лв различаются только координатой У (на разной высоте), то нумерация чередуется (что нумеруется первым, верхний или нижний, пока не известно). (by Desertir)


Общий максимальный размер карты в среднем включает в себя 3.000.000 - 3.500.000 млн. плотно заполненных аи-нодов, что равняется уровню примерно равному 1.3 х 1.3 км (На данный момент GSC выложили исходные коды в свободный доступ, что увеличивает вероятность увеличения этого ограничения в ближайшем будущем). Так же следует учитывать и точки для оффлайна - графпоинты, чем больше аи-сетка, тем больше должна быть их плотность. Ограничения компиляторов xrAI (Возможно, на данный момент) не дают возможность сделать большой уровень, который можно наполнить жизнью, потому что если превысить среднее значение нодов в 3 млн и более 400 графпоинтов - компилятор будет валиться с ошибками. Конечно, никто не мешает сделать большой уровень сам по себе как таковой (Геометрия), тем более недавно выпущенные х64 компиляторы позволяют тянуть более тяжелую геометрию уровня, но наполнить его событиями не получится, либо нужно ограничивать размер AI карты. (Актуально на август 2016 года, возможно когда-нибудь картина изменится)


- Сетка внутри файла представляет собой линейный массив из всех узлов. Они нумеруются от нуля. Самих узлов может быть теоретически 2 в степени 32, но реально намного меньше, а главное - размер сетки в плане диктуется ещё одним ограничением, которое будет понятно далее.
- Положение отдельного узла задаётся двумя целыми числами: 16 бит для координаты Y по высоте и 24 бита на две упакованные координаты XZ в плане. Назовём эти числа NY и NXZ. Для перевода этих чисел в реальные геометрические координаты (X,Y,Z) в заголовке файла записаны следующие данные:
Размер уровня (точнее сетки) по вертикали, назовём HY размер элемента сетки по горизонтали (узел сетки квадратный), назовём DXZ размеры сетки уровня в виде бокса, заданного вектором двух вершин. Назовём их (X0,Y0,Z0) и (X1,Y1,Z1). При этом размер по вертикали HY всегда совпадает с размером, полученным из вычитания этих двух векторов Y1-Y0 (т.е. имеется избыточность данных). Размеры бокса в плане X1-X0 и Z1-Z0 должны быть кратны элементу ячейки в плане DXZ.
Алгоритм перевода упакованных числе в координаты такой:
По вертикали всегда имеем максимально возможное число уровней 65536 (два байта), и соответственно минимальный шаг по вертикали будет
DY = HY / 65536
Положение вертекса по вертикали будет соответственно
Y = Y0 + DY * NY или, что тоже самое
Y0 + NY * HY / 65536

Для получения координат по горизонтали надо распаковать 24 бита NXZ. Поступаем так:
Сперва вычисляем количество вертексов по X и Z (точнее размер бокса в вертексах, самих вертексов может быть меньше):
СX = (X1 - X0) / DXZ
СZ = (Z1 - Z0) / DXZ

Теперь как-бы принимаем, что все позиции вертексов в плане упорядочены в набор горизонтальных строк и пронумерованы сквозным образом примерно как показано на картинке:

4.png


24-х битное поле NXZ - это и есть номер сквозной нумерации. Для получения координат надо выделить номер строки NX и столбца NZ.
NX - это по сути номер строки, соответственно:
NX = результат целочисленного деления NXZ / CZ
NZ - это позиция внутри строки и соответственно:
NZ = остаток от деления NXZ / CZ
Теперь сами координаты получаем просто:
X = X0 + NX * DXZ
Z = Z0 + NZ * DXZ


Теперь что следует из такого алгоритма. Самое главное, что размеры сетки в плане "в ячейках" имеет ограничение, а именно:
NX * NZ <= 16777216 (2 в степени 24)
При этом не важно, насколько реально в плане уровень покрыт сеткой, важно именно расстояние между наиболее удалёнными точками сетки. Для примера, сетку уровня можно вписать в плане в квадрат 4096х4096 ячеек или в прямоугольник 8192х2048 или в прямоугольник 5592х3000 и т.д. Вот это и накладывает ограничения на максимальный размер уровня, а точнее той его части, что покрыта сеткой и соответственно доступна для неписей.

Размер ячейки обычно 0.7. Соответственно, для такого размера ячейки и квадратной в плане области сетки максимальные геометрические размеры будут 4096*0.7 = 2867.2 игровых метра.

К этому можно добавить, что вертексы в этом массиве отсортированы по возрастанию всех трёх координат для того, чтобы движок мог их искать бинарным поиском. (by Malandrinus)

Источники