Ok, denken Sie daran, wir haben ein Fahrzeug wie das, das ich in meiner Antwort auf diese Frage beschrieben habe , mit einer 2D-Position, Geschwindigkeit, Winkelgeschwindigkeit und Widerstand / Reibung. Es kann um einen variablen Betrag beschleunigen und brechen, aber nicht sofort anhalten oder sofort die Höchstgeschwindigkeit erreichen. Wie kann ich es zu einem bestimmten Punkt bewegen und in der schnellstmöglichen Zeit anhalten, ohne zu überschießen oder zu schwingen?
Ich dachte so etwas wie:
- in Richtung Zielposition drehen.
- beschleunigen
- Schauen Sie 1 Tick voraus und fragen Sie: "Wenn ich die Pausen beim nächsten Tick anwenden würde, würde ich das Ziel überschreiten?"
- Wenn es zu einem Überschwingen kommen würde, wenden Sie die Pausen jetzt um einen gewissen Betrag an.
Ich bin sicher, dass dies ein gelöstes Problem ist und es wahrscheinlich eine bessere Methode als die von mir beschriebene gibt.
Wenn Sie mithilfe von Kalkül Ihre Geschwindigkeit und maximale Verzögerungsrate kennen, können Sie Ihren minimalen Bremsweg kennen. In diesem Sinne können Sie genau wissen, wann Sie die Bremsen betätigen müssen (abgesehen von Rundungs- / Quantisierungsfehlern), um an einem bestimmten Punkt anzuhalten.
Hoffentlich wird jemand, der besser in Mathematik ist als ich, die eigentliche Formel veröffentlichen ...
quelle
finalPositionDelta = -0.5 * sqr(currentSpeed) / maximumDeceleration
Dies setzt jedoch voraus, dass Ihre Verzögerung eine Konstante ist, was je nach Tiefe Ihrer Simulation möglicherweise nicht der Fall ist. Ich würde mit Ranieris Lösung gehen. (whoops sorry es ist DIV Verzögerung, nicht mul)Es ist ein Kontrollproblem. Sie müssen Ihre Eingaben proportional zu einer Art "Fehler" -Maß variieren, z. B. zur Entfernung zum Ziel. Siehe auch die Antworten auf diese Frage.
Zielverfolgung: Wann muss ein rotierender Turm beschleunigt und abgebremst werden?
quelle
Manchmal müssen Sie in der Spieleentwicklung Verknüpfungen verwenden. Die Abkürzung wird hier als Impuls bezeichnet, was physikalisch gesehen eine sehr große Kraft ist, die in sehr kurzer Zeit ausgeübt wird. Anstatt es im Laufe der Zeit zu integrieren, wenden Sie es einfach als direkte Änderung auf den Parameter an: Setzen Sie die Geschwindigkeit auf 0.
Die Frage ist: Möchten Sie die Verknüpfung verwenden oder nicht?
quelle