Ich fange an, das Erlernen der DIY-Physik zu erlernen, und ich habe eine Frage zur Implementierung der Integration auf der grundlegendsten Ebene (dh dies ist keine Frage von Euler vs. RK4).
Fast jedes Beispiel, auf das ich integrate()
stoße, hat eine Funktion, die den Zeitschritt seit dem letzten Update und die Beschleunigung (und / oder Geschwindigkeit und / oder Position) seit dem letzten Update aktualisiert.
In der einfachsten Form: position += velocity * deltaTime
Ich verstehe jedoch nicht, warum es sich so ansammelt, wenn es genauso leicht durch Ändern einer Funktion erhalten werden kann . Zum Beispiel: getPosition = makeNewFunction()
Was etwas zurückgeben könnte, das die Signatur von hat Time -> Position
, und das Innenleben dieser Funktion werden über die entsprechende mathematische Formel generiert.
Auf diese Weise gibt es keine Akkumulation ... wann immer die Position abgerufen werden muss, ruft es diese Funktion mit der aktuellen Zeit auf.
Mein Neuling Verständnis ist, dass dies auch die Fehler, die von Akkumulation kommen, vermeiden würde ... also warum funktioniert das nicht, was fehle ich?
(Fwiw Ich habe einen grundlegenden Proof of Concept für diese Idee zusammengestellt - obwohl gleichzeitig einige andere Dinge getestet werden, ist dies nicht das sauberste Beispiel: https://github.com/dakom/ball-bounce-frp )
EDIT 1: Wie in den Kommentaren erwähnt, ist es wahrscheinlich wichtig darauf hinzuweisen, dass ich noch nichts über das Ändern der Beschleunigung oder den Umgang mit Ruck und anderen Dingen gelernt habe, die eine Integration höherer Ordnung erfordern als eine konstante Beschleunigung.
EDIT 2: hier einige grundlegende Beispielcode von der Idee, und Pseudo-JavaScript - Syntax - Note , die getKinematicPosition
sich teilweise angewandt , so wird eine neue Funktion von nur Zeit Rückkehr -> Position:
Ich halte an meiner Position fest, aber es könnte auch etwas anderes sein, getVelocity
denke ich ...
getKinematicPosition = initialVelocity => acceleration => time =>
((.5 *acceleration) * (time * time)) + (initialVelocity * time);
getPosition = getKinematicPosition ([0,0,0]) (GRAVITY);
onTick = totalTime => {
position = getPosition (totalTime);
onCollision = () => {
getPosition = changeTheFunction(totalTime);
//changeTheFunction uses totalTime to base updates from 0
//it could use getKinematicPosition or something else entirely
}
}