-
Notifications
You must be signed in to change notification settings - Fork 5
/
Пояснение.txt
26 lines (25 loc) · 3.19 KB
/
Пояснение.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Логика функционирования бота:
1. Если параметр Walking == false, то не двигаться, и ничего не делать.
2. Если не определен список точек маршрута (если он пуст):
- подать планировщику запрос на построение маршрута до цели
//---------------- Вариант 1 --------------
- определить угол между направлением вперёд и целью
- если угол больше предельного по модулю (не можем сразу вертеться на большой угол), то уменьшить до допустимого
- в выбранном направлении движения получить точку на расстоянии одного шага (определяется скоростью движения бота)
- запросить планировщик о достижимости точки (можно ли сделать один шаг), это вызов соответствующей функции
- если точка достижима - сделать шаг (вызов соответствующей функции), иначе пропуск шага
Проблема этого подхода - пока нет маршрута, идём совсем не туда, куда надо
//----------------- Вариант 2 --------------
- подать локальному планировщику запрос на построение пути из текущей точки в направлении цели, с ограничением на максимальную дистанцию. Например, бот просит построить локальный маршрут на расстояние в 10 шагов - это должно выполняться довольно быстро, и без выхода из текущей области навигации
- получить список точек (путь), и сделать шаг в направлении первой точки, остальной список игнорировать.
Та же самая проблема - идём совсем не туда
3. Если есть маршрут, который вернул глобальный планировщик, то:
- извлекать из начала списка те точки, до которых расстояние не превышает одного шага (это для случая, если мы уже движемся вдоль маршрута)
//---------------- Вариант 1 --------------
- выбрать начальную точку маршрута
- повернуться к точке (с учётом ограничений на угол поворота), проверить, достижима ли точка в пределах шага, если да - сделать шаг, если нет - запросить локальный планировщик о построении локального маршрута до точки, и уже там делать шаг
//----------------- Вариант 2 --------------
- определять эвристически расстояния до начальных точек маршрута до тех пор, пока такое расстояние не превысит некоторую верхнюю границу - таким образом, найти ближайшую точку, движение к которой позволит вернуться на маршрут, дальше - по аналогии
Логика работы планировщика
Строится из двух уровней - глобального и локального. Глобальный получает запрос на построение маршрута, и строит маршрут до цели, оперируя заранее размеченными областями на карте (теоретически за это может NavMesh отвечать). В процессе построения маршрута генерируются точки в текущей области, а между остальными областями (если цель лежит в другой области) используются заранее выбранные стоимости переходов. Это может представлять проблему при областях с динамически меняющейся достижимостью - необходимо рассматривать время как отдельную координату. Результатом глобального планировщика становится маршрут до выхода из текущей области (до первой точки соседней области), эта точка передаётся локальному планировщику. В общем тут можно использовать эвристические оценки - только до выхода из текущей области, для открытых пространств вполне сгодится.
Локальный планировщик строит маршрут до заданной промежуточной точки - если не связываться с сетками, то можно использовать Sample based, его и возвращает агенту. Должен работать в отдельном потоке.