Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Прицеливание и ведение цели ИИ

Прицеливание и ведение цели ИИ

Поделиться
elitdieПостоялецwww8 авг. 201717:51#0
Добрый день!
Столкнулся с проблемой реализации прицеливания по движущейся цели у врагов.
Игра 2D. Цель враг находит при загрузке его на уровень.
Задача: сделать имитацию прицеливания, продолженного по времени. Скажем, две секунды. То есть передвигать точку прицеливания от своих координат в НОВУЮ позицию цели, но всё это должно занимать 2 секунды. И цель еще может замедлиться, так что на скорость полагаться сильно не стоит.
Работаю в Cocos Creator. Там есть функция moveTo(время, точка в пространстве) и функция update(dt), которая раз в кадр. Как изящнее и без лишней нагрузки решить эту проблему?
se-sssПостоялецwww8 авг. 201720:27#1
Я делал фильтр для  подобного.
Вот пример реализации фильтра первого порядка.
T  - это нужны 2 секунды

Вход фильтра x(t) -  одна из коодинат цели
Выход  фильтра  y(t) - соответствующая координата прицела
Фильтру первого поряка соответствует уравнение

T*dy/dt  + y = x
(Ключевые слова: апериодическое звено)
Нам надо помнить выход с прошлого шага симуляции.
(Для самого первого шага - просто начальное положение прицела)
T* (y(t) - y(t-dt))/dt + y(t) = x(t), где y(t-dt) - положение прицела на предыдущем шаге.

(T/dt + 1) y(t)  - y(t-dt)*(T/dt) = x(t)

И, если я нигде не напутал в вычислениях, текущая координата прицела выражается формулой
y(t) = x(t) * (dt/(T+dt)) + (dt/(T+dt)) * y(t-dt)*(T/dt) =
= x(t) * (dt/(T+dt)) + (T/(T+dt)) * y(t-dt) =
= [x(t) * dt +  y(t-dt) * T]/(T+dt)

Точно такие же вычисления производятся по  другой координате. Можно задать например другое время.
Чтобы прицел проскакивал цель и возвращался назад, надо делать фильтр 2-го порядка.
Но его я сейчас не готов распиисывать.
(Ключевые слова: колебательное звено.  Понятнее будет физически реализовать как связь прицела и цели пружинкой с демпфером. Описанный выше вариант - это демпфер без пружинки)

Есть ещё один момент, особо важный для прицела в 2d. Если скорость прицела уменьшилась почти до нуля, то стоит принудительно остановить прицел.
Это из-за того  что прицел в этой модели никогда не останавливается,  а редкие скачки на 1 пиксель выглядят некрасиво.

elitdieПостоялецwww8 авг. 201720:34#2
Спасибо за развернутый ответ. Я новичок в геймдеве и меня всегда такого рода формулы пугали. Скажите, на мобильных платформах при 50 врагах (одновременных запусках этих фильтров) как это отражается на производительности? Или мы дожили до таких мощностей, что такие формулы щелкаются как орехи?
tacПостоялецwww9 авг. 20171:22#3
elitdie
> меня всегда такого рода формулы пугали
ага, я бы попросил хотя бы псевдокодом выражаться, а не производные в формулы вставлять

/ Форум / Программирование игр / Игровая логика и ИИ

2001—2017 © GameDev.ru — Разработка игр