Je commence à apprendre à bricoler la physique, et j'ai une question sur la mise en œuvre de l'intégration au niveau le plus élémentaire (c'est-à-dire que ce n'est pas une question Euler vs RK4).
Presque tous les exemples que je rencontre ont une integrate()
fonction qui obtient le pas de temps depuis la dernière mise à jour et met à jour l'accélération (et / ou la vitesse et / ou la position) depuis la dernière mise à jour.
Sous la forme la plus simple: position += velocity * deltaTime
Cependant, je ne comprends pas pourquoi il s'accumule comme ça alors qu'il pourrait tout aussi facilement être obtenu en changeant une fonction . Par exemple: getPosition = makeNewFunction()
qui pourrait retourner quelque chose qui a la signature de Time -> Position
, et le fonctionnement interne de cette fonction est généré via la formule mathématique appropriée.
De cette façon, il n'y a pas d'accumulation ... chaque fois que la position doit être obtenue, elle appelle cette fonction avec l'heure actuelle.
Mon débutant comprend que cela éviterait également les erreurs qui proviennent de l'accumulation ... alors pourquoi cela ne fonctionne-t-il pas, qu'est-ce qui me manque?
(FWIW je ne mis en place une preuve de base du concept de cette idée- mais il teste aussi quelques autres choses en même temps il est donc pas l'exemple le plus propre: https://github.com/dakom/ball-bounce-frp )
EDIT 1: comme mentionné dans les commentaires, il est probablement important de souligner que je n'ai pas encore appris à changer l'accélération, ni à gérer les secousses et d'autres choses qui nécessitent une intégration d'ordre supérieur à une accélération constante.
EDIT 2: voici un exemple de code de base de l'idée, et une syntaxe pseudo javascript - note qui getKinematicPosition
est partiellement appliquée, donc elle retourne une nouvelle fonction juste Time -> Position:
Je m'en tiens à la position ici, mais cela pourrait être autre chose, comme getVelocity
, je suppose ...
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
}
}