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.
quelle
Antworten:
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
acceleration
Funktion ist ein Beispiel für ein einfaches gedämpftes Federsystem, nicht für die Schwerkraft.k
ist die Federkonstante von Hooke undb
wird 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.dx
bedeutet "die Ableitung vonState.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.
quelle