Я роблю деякий рудиментарний ШІ для свого бічного скролера, і мені потрібно знати, чи може AI-одиниця досягти точки B з точки A, просто перескочивши.
Траєкторія польоту моїх героїв трохи незвична, оскільки вони можуть застосовувати силу в повітрі (як, наприклад, у 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, якщо ми дійсно вирішимо враховувати опір повітря (це необов'язково) , чи лежить точка нижче кривої, намальованої траєкторією мого персонажа?
Я буквально не маю ідеї з чого почати з розрахунками, і насправді мене не обов’язково цікавить точна відповідь; добре працює злом / наближення було б чудово, оскільки AI жодним чином не повинен діяти ідеально.
редагувати: Я вирішив вирішити це за допомогою моделювання, як пропонує Джейсон, але як впоратися з такою справою?
Чи слід намалювати відрізок від C до D і перевірити, чи знаходиться бажана точка нижче цього відрізка?
Або я повинен двійковий пошук часових кроків між C і D, щоб шукати точку, яка знаходиться досить близько в горизонтальній відстані до потрібної точки, і лише після цього перевірити вертикальну різницю? (мені здається трохи зайвим)