RK4, Derivate, Spielphysik verstehen

8

Gafferon Games hat einen großartigen Artikel über RK4-Integration für bauphysikalische Simulationen, den Sie hier finden: Integrationsgrundlagen

Persönlich könnten meine mathematischen und physikalischen Kenntnisse verbessert werden. Ich fühle mich wohl im Bereich der Vektormathematik, Trigger, einiger Statistiken (ich musste lineare Linienregressionsformeln für Software usw. verwenden) und im Grunde der meisten Dinge auf Highschool-Niveau bis zum ersten Studienjahr.

Nun zur Frage: Ich habe diesen Artikel gelesen, die zugehörige Quelle heruntergeladen und Zeile für Zeile debuggt, um zu verstehen, was passiert, und trotzdem das Gefühl zu haben, dass ich eindeutig nicht das bekomme, was ich sehe. Ich habe im Internet nach den "For Dummies" -Versionen gesucht, ehrlich gesagt lerne ich etwas anders und wenn ich den ganzen Tag auf Formeln mit dem Schwerpunkt auf Auswendiglernen starre, wird das nicht schaden, da ich verstehen muss, was passiert, also ich kann flexibel angewendet werden.

Ich glaube, ich verstehe Folgendes, aber ich hoffe, dass jemand anderes mich klarstellen oder vollständig korrigieren kann. Der RK4 verwendet einen Euler-Schritt, basiert dann darauf, dass er sich rechtzeitig vorwärts bewegt, um mehrere wesentlichere Euler-Schritte (?) Zu berechnen, und bestimmt anhand einer gewichteten Summe, welche Position und Geschwindigkeit für den nächsten Frame am besten ist.

Darüber hinaus diese Beschleunigungsmethode (konvertiert in AS3):

private function acceleration(state:State, time:Number):Number
{
    const k:int = 10;
    const b:int = 1;
    return - k*state.x - b*state.v;
}

nimmt eine konstante Masse (10) und Kraft (1)? und gibt eine seltsame Berechnung zurück Ich habe keine Ahnung warum ...- Masse * Position - Kraft * Geschwindigkeit? Was?

Dann für meine letzte Verwirrung in den Bewertungsmethoden, die aussehen wie (AS3):

private function evaluateD(initial:State, time:Number, dtime:Number, d:Derivative):Derivative
{
    var state:State = new State();
    state.x = initial.x + d.dx*dtime;
    state.v = initial.v + d.dv*dtime;
    var output:Derivative = new Derivative();
    output.dx = state.v;
    output.dv = acceleration(state, time+dtime);
    return output;
}

Wir speichern einen neuen Zustand mit dem Zeitschritt und setzen dann eine Ableitung, um zurückzukehren ... Ich verstehe das irgendwie, wie es im Approximationsprozess verwendet wird, aber was ist das!:

output.dx = state.v;
output.dv = acceleration(state, time+dtime); 

// ok I get we are getting the new velocity since v = a * t, obviously I   
// don't what acceleration() is returning though. 

Wir setzen die Positionsänderung der abgeleiteten Ausgabe auf die Zustände neue Geschwindigkeit? Huh?

Zuletzt wird diese Testsimulation folgendermaßen ausgeführt:

var state:State = new State();
state.x = 100;
state.v = 0;

t = 0;
dt = 0.1;

while (Math.abs(state.x)>0.001 || Math.abs(state.v)>0.001)
{
    trace(state.x, state.v);
    integrate(state, t, dt);
    t += dt;
}

Wir setzen also einen neuen Zustand mit einem Positionswert von 100 und einer Geschwindigkeit von 0? Was ist der Sinn dieser Simulation, wenn wir keine Geschwindigkeit haben ...

Wie auch immer, ich bin ziemlich verwirrt und vom Planeten Erde abgewandert. Die Hoffnung, dass jemand da draußen das für mich klären kann.

Bennett Yeates
quelle
Wenn Sie nach Spielen suchen, ist RK4 ein Overkill und aufgrund seines Verhältnisses von Kosten zu Stabilität auch nicht die beste Wahl für plötzliche und starke Änderungen Ihrer Beschleunigung. Wenn Sie nach einer Diskussion darüber suchen, aus welchen Integratortypen Sie auswählen sollten und wie Sie einen eher vereinfachten Simulator erstellen können, kann ich Ihnen einen technischen Bericht zu genau diesen Problemen empfehlen: arxiv.org/pdf/1311.5018v1.pdf
Teodron
1
Interessant, ich hole mir einen Kaffee und lese das noch einmal durch! Persönlich bin ich daran interessiert, so viel wie möglich von der einfachen bis zur fortgeschrittenen Simulation zu verstehen. Ich habe derzeit einige sehr grundlegende gemacht, aber dies ist nur eine Suche nach Wissen, damit ich meine Flexibilität als Entwickler fördern kann. Vielen Dank für den Hinweis, sehr zu schätzen!
Bennett Yeates

Antworten:

6

RK4 ist ein Beispiel für einen numerischen Integrator . Die Euler-Integration ist ein ähnliches Konzept, aber viel weniger genau. Die numerische Integration ist nicht exakt, aber für einen Computer in einer Echtzeitsituation wie einem Spiel viel besser. Der Grund, warum Sie RK4 anstelle von Euler verwenden, ist, dass RK4 die Integration der zweiten und dritten Ableitung (Beschleunigung und Ruck) berücksichtigt und somit viel besser zur analytischen Lösung passt.

RK4 ist im Wesentlichen eine Taylorreihenerweiterung der Differentialgleichung, die die Beschleunigung in Bezug auf Verschiebung und Geschwindigkeit definiert. Auf diese Weise können Sie Kräfte integrieren, die von diesen Größen abhängen, z. B. bei Einschränkungen und sogar bei der universellen Gravitation. Taylor-Reihenerweiterungen sind beim Programmieren nützlich, da Computer sie sehr effizient auswerten können.

Die verwendete accelerationFunktion ist ein Beispiel für ein einfaches gedämpftes Federsystem, nicht für die Schwerkraft. kist die Federkonstante von Hooke und bwird verwendet, um das System zu dämpfen (Energie zu entfernen). Bei so gut wie allen federbedingten Einschränkungen in Ihrem Motor sollten Sie diese dämpfen, da numerische Fehler eine enorme Energieanhäufung verursachen können und die Simulation explodieren lässt. Wenn Sie die Euler-Integration verwenden würden, wäre dies viel schlimmer.

In Bezug auf acceleration()berechnet eine vollständigere Physik-Engine sowohl lineare als auch Winkelbeschleunigungen basierend auf Kräften (Drehmomenten). Die zu summierenden Kräfte können die Schwerkraft (konstant oder basierend auf der universellen Gravitation), den Auftrieb und die Federn umfassen (die meisten Einschränkungen können mit steifen Federn modelliert werden).

Ihre dritte Frage ist leicht zu beantworten. In der Kinematik gibt es drei Grundgrößen: Verschiebung (Position), Geschwindigkeit und Beschleunigung. Die Beschleunigung ist die Ableitung der Geschwindigkeit, dh die Ableitung der Verschiebung (beide in Bezug auf die Zeit). Ein Derivat ist nur die Geschwindigkeit, mit der sich etwas ändert. Derivative.dxbedeutet "die Ableitung von State.x".

Da bei der Simulation davon ausgegangen wird, dass die Feder am Ursprung verankert ist und eine Ruhelänge von Null hat, bedeutet eine Verschiebung von 100, dass das Partikel zu schwingen beginnt. Die Testsimulation endet, wenn sich das Partikel nicht bewegt und sich nahe am Ursprung befindet.

jmegaffin
quelle
Eine andere Beschreibung ist, dass Sie sich RK4 als eine Taylor-Erweiterung der Differentialgleichung vorstellen können.
RandyGaul
Dies ist eine großartige Antwort und hat einige Lücken in meinem Physikwissen aufgedeckt. Können Sie einige Hinweise auf einen guten Ausgangspunkt geben, um zu verstehen, was ein gedämpftes Federsystem ist, Drehmomente usw.? Ich glaube, mir fehlt definitiv diese fortgeschrittenere Mechanik. Ihre Antwort verdeutlicht mir sehr viel, zumal ich erst kürzlich mit Taylor-Polynomen angefangen habe.
Bennett Yeates
Ich würde es hier versuchen: khanacademy.org/science/physics
jmegaffin
Perfekt, an die Khanakademie dachte ich.
Bennett Yeates