Je fais de l'IA rudimentaire pour mon défilement latéral et j'ai besoin de savoir si une unité AI peut atteindre le point B à partir du point A simplement en faisant un saut.
La trajectoire de vol de mes personnages est un peu inhabituelle car ils peuvent appliquer une force dans les airs (comme dans Jazz Jackrabbit 2 par exemple), donc contrairement à la trajectoire classique d'un projectile qui est d'environ ...
trajectoire qu'un projectile lancé ou lancé prendra (...) sans propulsion.
... Je suppose que mon problème concerne davantage un projectile à propulsion (par exemple une fusée).
Pour illustrer cela, voici à quoi ressemble la courbe de vol pour mon personnage si je saute et appuie continuellement sur le "bouton gauche" (ça a l'air différent à l'extrémité gauche, c'est là que je faisais des manœuvres en l'air):
La force appliquée pendant le vol est toujours parallèle à l'axe X, donc elle est F = (-f, 0) si je maintiens "gauche" et elle est F = (f, 0) si je maintiens "droite".
Il peut bouger comme un sauteur à ski:
Elle diffère donc beaucoup de la trajectoire classique qui est tout simplement une parabole (source: wikipedia ):
Pour le rendre plus difficile, je simule une simple résistance à l'air afin que mes personnages ne puissent accélérer que jusqu'à une certaine valeur de vitesse maximale.
Cela se fait en appliquant une petite force dans la direction opposée de la marche :
b2Vec2 vel = body->GetLinearVelocity();
float speed = vel.Normalize(); //normalizes vector and returns length
body->ApplyForce( AIR_RESISTANCE_MULT * speed * speed * -vel, body->GetWorldCenter() );
L'AIR_RESISTANCE_MULT est une constante qui dans mon cas est égale à 0,1.
Supposons que mon personnage soit un point infiniment petit.
Et je ne prends PAS en considération les obstructions, alors ma question va comme ça ...
Comment déterminer (au moins de façon fiable), étant donné la vitesse initiale V, une impulsion J = (0, -j) que j'applique au personnage au saut, la gravité G = (0, g) , la force F = (+ -f , 0) appliqué continuellement pendant le vol et AIR_RESISTANCE_MULT si nous décidons vraiment de prendre en compte la résistance de l'air (ceci est facultatif) , si un point se trouve en dessous de la courbe tracée par le chemin que mon personnage prendra?
Je n'ai littéralement aucune idée par où commencer avec les calculs et en fait, je ne suis pas nécessairement intéressé par une réponse exacte; un hack / approximation qui fonctionne bien serait génial car l'IA n'a nullement besoin d'agir parfaitement.
edit: J'ai décidé de résoudre ce problème en utilisant la simulation comme le suggère Jason, mais comment gérer un tel cas?
Dois-je dessiner un segment de C à D et vérifier si le point souhaité se trouve en dessous de ce segment?
Ou dois-je rechercher en binaire les pas de temps entre C et D pour rechercher le point qui est assez proche de la distance horizontale du point souhaité, et ensuite seulement vérifier la différence verticale? (me semble un peu exagéré)