Движение созданного персонажа(NPC) по вейпоинтам

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Всем здравствуйте.
Мне нужна помощь в движении персонажа по карте. Проблема заключается в следующем:
Персонаж у меня двигается по карте, по точкам навигации(waypoints).
Сначала, отдельной функцией, получаю ближайшую к персонажу точку со всеми её данными (номер(типа id), позиция, углы, радиус видимости, назначение(двери, лестница и т.д.), следущая видимая точка и т.д.), все эти данные записанны у меня в отдельный текстовый файл(получаю их в массив при загрузке карты).
Персонаж двигается к этой точке, при дистанции менее определенного кваром значения эта точка игнорируется, переключается на поиск следующей (если не указанна другая в tex. файле).
Все работает нормально, но если у точки указан вейпоинт к которому нужно двигаться то, естественно, на ней происходит разворот и движение в сторону указанного в ней следующего вейпоинта.
То-есть ехал-ехал прямо, на таком вейпоинте происходит разворот в обратную сторону и движение к след. вейпоинту, указанному в файле.
В общем вопрос такой, как можно заблокировать видимость такого вейпоинта если он уже пройден.
У меня получается так - такие вейпоинты на лестницах(с нижнего указан верхний), поднимается по лестнице, проезжает какое-то растояние, возвращается назад, спускается вниз по лестнице, а там этот вейпоинт, естественно разворот и подъём по лестнице, по новой. Так может до бесконечности.
Я пробовал и флаг делать, активный - не активный, и точке id персонажа назначать(в принципе тот-же флаг). Не могу сообразить как сделать, как "отключить" такой вейпоинт.
Нужно "отключить" нижний вейпоинт при движении вниз, т.е. к нему. При движении вверх, все должно работать как обычно.

Позднее сделаю видео, для наглядности.



 
Последнее редактирование:

WhoAmI / WillStriX

Мошенник
Сообщения
222
Реакции
129
Всем здравствуйте.
Мне нужна помощь в движении персонажа по карте. Проблема заключается в следующем:
Персонаж у меня двигается по карте, по точкам навигации(waypoints).
Сначала, отдельной функцией, получаю ближайшую к персонажу точку со всеми её данными (номер(типа id), позиция, углы, радиус видимости, назначение(двери, лестница и т.д.), следущая видимая точка и т.д.), все эти данные записанны у меня в отдельный текстовый файл(получаю их в массив при загрузке карты).
Персонаж двигается к этой точке, при дистанции менее определенного кваром значения эта точка игнорируется, переключается на поиск следующей (если не указанна другая в tex. файле).
Все работает нормально, но если у точки указан вейпоинт к которому нужно двигаться то, естественно, на ней происходит разворот и движение в сторону указанного в ней следующего вейпоинта.
То-есть ехал-ехал прямо, на таком вейпоинте происходит разворот в обратную сторону и движение к след. вейпоинту, указанному в файле.
В общем вопрос такой, как можно заблокировать видимость такого вейпоинта если он уже пройден.
У меня получается так - такие вейпоинты на лестницах(с нижнего указан верхний), поднимается по лестнице, проезжает какое-то растояние, возвращается назад, спускается вниз по лестнице, а там этот вейпоинт, естественно разворот и подъём по лестнице, по новой. Так может до бесконечности.
Я пробовал и флаг делать, активный - не активный, и точке id персонажа назначать(в принципе тот-же флаг). Не могу сообразить как сделать, как "отключить" такой вейпоинт.
Нужно "отключить" нижний вейпоинт при движении вниз, т.е. к нему. При движении вверх, все должно работать как обычно.

Позднее сделаю видео, для наглядности.


(Костыльно) создать такой же по размеру только уже бульный массив, при достижении way поинта в бульном массиве на этой позиции ставим true, а при поиске, находя какой-то вейпоинт под номером x в массиве проверять ваш бульный массив, если там true, то этот way поинт не подходит и нужно искать дальше.
 

WhoAmI / WillStriX

Мошенник
Сообщения
222
Реакции
129
Смотри, чтоб вейпоинты были в пределах твоего фов, рисуй вектор от своей позиции к позиции вейпоинтов ближайших, так же рисуй вектор исходя из направления бота и проверяй фов тогда "бот" будет выбирать наиболее подходящий вейпоинт и не будет разворачиваться, стоит учитывать горизонтальное направление, когда бот на земле и вертикальное, когда он на лестнице
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
@WillStriX,
Я сделал ограничение "угла зрения" дрона(FOV) 90 градусов (могу сделать любой угол в принципе, кваром меняется). 90 град. по моему самый оптимальный угол.
Когда на лестнице (нижний вейпоинт), я запускаю другой движек(на таймере), в нем жестко указываю что движение от нижнего вейпоинта к верхнему(по их номеру (id)), когда достигнут верхний вейпоит - запускаю обычный движек(прямо).

У меня иногда, при движении прямо, Дрон теряет вейпоинт, начинает крутиться, искать. Пока не пойму что с ним происходит. По моему что-то с нормализацией угла(ограничиваю 180 градусов), или из-за дисплейсмента, "земля" то не ровная. Может быть приподнять вейпоинты над землей.
 

WhoAmI / WillStriX

Мошенник
Сообщения
222
Реакции
129
Когда работаешь следи чтоб векторы лежали в 1 плоскости, вернее позицию вейпоинта опускай до позиции дрона по высоте и тогда уже производи расчеты
 
Последнее редактирование:

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
А как на один уровень вывести с Дроном? Дрон имеет физ. свойства, у него есть вес, поэтому он переваливается по холмам. Вообще, когда я делаю трассировку, я игнорирую столкновения с миром, т.е. все что равно нулю не учитываю. Поэтому дисплейсмент не должен мешать, по идее.
 

WhoAmI / WillStriX

Мошенник
Сообщения
222
Реакции
129
А как на один уровень вывести с Дроном? Дрон имеет физ. свойства, у него есть вес, поэтому он переваливается по холмам. Вообще, когда я делаю трассировку, я игнорирую столкновения с миром, т.е. все что равно нулю не учитываю. Поэтому дисплейсмент не должен мешать, по идее.
Позицию дрона поднимай (не самого дрона) до позиции вейпоинта
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Позицию дрона поднимай (не самого дрона) до позиции вейпоинта

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


--- Добавлено позже ---

Нашел решение этой проблемы!
У каждого вейпоинта помимо координат есть углы, вот из этих углов я делаю вектор направления, в соответствии с направлением вейпоинтов и Дрона происходит движение. Если эти направления совпадают то это нужные вейпоинты. Игнорирую только кемперские вейпоинты (желтого цвета).
--- Добавлено позже ---
Практически полностью работоспособный Дрон, способный обороняться как от врагов, так и от своих(если обижают).
Но всё-равно "хромой", не совсем устраивает движение. Иногда одновременно находит 2 вейпоинта и начинает дергаться.
И еще одна ошибка, хоть и мелкая но неприятная, ракета тяжелая, прижимает её к земле.
Нужно или вес убрать, или тип движения другой задать.

На сегодня выглядит так:
 
Последнее редактирование:
Сверху Снизу