Я делаю некоторый элементарный ИИ для своего бокового скроллера, и мне нужно знать, может ли ИИ-подразделение достичь точки В из точки А, просто сделав прыжок.
Траектория полета моих персонажей немного необычна, так как они могут применять силу в воздухе (как, например, в Jazz Jackrabbit 2), так что в отличие от классической траектории снаряда, которая примерно ...
путь, по которому брошенный или запущенный снаряд пойдет (...) без движения.
... Я полагаю, что моя проблема больше касается снаряда с движителем (например, ракеты).
Чтобы проиллюстрировать это, вот как выглядит кривая полета моего персонажа, если я прыгаю и постоянно нажимаю «левую кнопку» (на левом конце она выглядит по-другому, именно здесь я выполнял маневры в воздухе):
Сила, применяемая во время полета, всегда параллельна оси X, поэтому F = (-f, 0), если я держу «влево», и F = (f, 0), если я держу «вправо».
Он может двигаться очень как прыгун с трамплина:
Так что он сильно отличается от классической траектории, которая представляет собой просто параболу (источник: wikipedia ):
Чтобы сделать это более сложным, я моделирую простое сопротивление воздуха, чтобы мои персонажи могли ускоряться только до некоторого максимального значения скорости.
Это делается путем приложения небольшой силы в противоположном направлении движения :
b2Vec2 vel = body->GetLinearVelocity();
float speed = vel.Normalize(); //normalizes vector and returns length
body->ApplyForce( AIR_RESISTANCE_MULT * speed * speed * -vel, body->GetWorldCenter() );
AIR_RESISTANCE_MULT - это константа, которая в моем случае равна 0,1.
Давайте предположим, что мой персонаж - бесконечно малая точка.
И я НЕ принимаю во внимание препятствия, поэтому мой вопрос звучит так ...
Как определить (по крайней мере, надежно угадать), учитывая начальную скорость V, импульс J = (0, -j), который я применяю к персонажу при прыжке, гравитацию G = (0, g) , силу F = (+ -f , 0) постоянно применяется во время полета и AIR_RESISTANCE_MULT, если мы действительно решили принять во внимание сопротивление воздуха (это необязательно) , лежит ли точка ниже кривой, проведенной путем, по которому будет идти мой персонаж?
Я буквально не знаю, с чего начать с расчетов, и на самом деле, я не обязательно заинтересован в точном ответе; хорошо работающий хак / аппроксимация был бы хорош, поскольку ИИ ни в коем случае не должен действовать идеально.
редактировать: я решил решить эту проблему с помощью моделирования, как предлагает Джейсон, но как справиться с таким случаем?
Должен ли я нарисовать отрезок от C до D и проверить, находится ли желаемая точка ниже этого отрезка?
Или мне следует выполнить двоичный поиск по временным шагам между C и D, чтобы найти точку, которая достаточно близка на горизонтальном расстоянии к желаемой точке, и только затем проверить вертикальную разницу? (кажется немного излишним для меня)