Ich mache eine rudimentäre KI für meinen Side-Scroller und muss wissen, ob eine KI-Einheit Punkt B von Punkt A aus erreichen kann, indem sie einfach einen Sprung macht.
Die Flugbahn meiner Charaktere ist etwas ungewöhnlich, da sie in der Luft Kraft ausüben können (wie zum Beispiel in Jazz Jackrabbit 2), also im Gegensatz zur klassischen Flugbahn eines Projektils, bei der es um ...
Weg, den ein geworfenes oder abgefeuertes Projektil (...) ohne Antrieb nimmt.
... Ich nehme an, mein Problem betrifft eher ein Projektil mit Antrieb (z. B. Rakete).
Um dies zu veranschaulichen, sieht die Flugkurve für meinen Charakter so aus, wenn ich springe und ständig den "linken Knopf" drücke (am linken Ende sieht es anders aus, hier habe ich einige Manöver in der Luft gemacht):
Die während des Fluges ausgeübte Kraft ist immer parallel zur X-Achse, also ist es F = (-f, 0), wenn ich "links" halte, und es ist F = (f, 0), wenn ich "rechts" halte.
Er kann sich sehr wie ein Skispringer bewegen:
Es unterscheidet sich also stark von der klassischen Flugbahn, die einfach eine Parabel ist (Quelle: Wikipedia ):
Um es schwieriger zu machen, simuliere ich einen einfachen Luftwiderstand, damit meine Charaktere nur bis zu einem Höchstgeschwindigkeitswert beschleunigen können.
Dies geschieht durch Aufbringen einer kleinen Kraft in die entgegengesetzte Fahrtrichtung :
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 ist eine Konstante, die in meinem Fall gleich 0,1 ist.
Nehmen wir an, mein Charakter ist ein unendlich kleiner Punkt.
Und ich berücksichtige KEINE Hindernisse, also geht meine Frage so ...
Wie man bei gegebener Anfangsgeschwindigkeit V einen Impuls J = (0, -j) bestimmt (zumindest zuverlässig errät) , den ich beim Sprung auf das Zeichen anwende, Schwerkraft G = (0, g) , Kraft F = (+ -f , 0) wird während des Fluges und AIR_RESISTANCE_MULT kontinuierlich angewendet, wenn wir uns wirklich dazu entschließen, den Luftwiderstand zu berücksichtigen (dies ist optional) , ob ein Punkt unter der Kurve liegt, die durch den Weg gezogen wird, den mein Charakter nehmen wird?
Ich habe buchstäblich keine Ahnung, wo ich mit den Berechnungen anfangen soll, und tatsächlich bin ich nicht unbedingt an einer genauen Antwort interessiert. Ein gut funktionierender Hack / Approximation wäre großartig, da die KI keineswegs perfekt handeln muss.
edit: Ich habe beschlossen, dieses Problem mithilfe einer Simulation zu lösen, wie Jason es vorschlägt, aber wie soll ich mit einem solchen Fall umgehen?
Soll ich ein Segment von C nach D zeichnen und prüfen, ob der gewünschte Punkt unter diesem Segment liegt?
Oder sollte ich die Zeitschritte zwischen C und D binär durchsuchen , um nach dem Punkt zu suchen, der in horizontaler Entfernung zum gewünschten Punkt nahe genug ist, und erst dann den vertikalen Unterschied überprüfen? (scheint mir ein bisschen übertrieben)