Estoy empezando a aprender a hacer física de bricolaje, y tengo una pregunta sobre la implementación de la integración en el nivel más básico (es decir, esta no es una pregunta de Euler vs. RK4).
Casi todos los ejemplos que encuentro tienen alguna integrate()
función que obtiene el paso de tiempo desde la última actualización, y actualiza la aceleración (y / o velocidad y / o posición) desde la última actualización.
En la forma más simple: position += velocity * deltaTime
Sin embargo, no entiendo por qué se acumula de esta manera cuando se podría obtener fácilmente cambiando una función . Por ejemplo: getPosition = makeNewFunction()
qué podría devolver algo que tiene la firma de Time -> Position
, y el funcionamiento interno de esa función se genera a través de la fórmula matemática adecuada.
De esa manera, no hay acumulación ... cada vez que se necesita obtener la posición, llama a esa función con la hora actual.
Mi comprensión de novato es que esto también evitaría los errores que provienen de la acumulación ... entonces, ¿por qué esto no funciona? ¿Qué me estoy perdiendo?
(fwiw me he reunido una prueba básica del concepto de esta idea-aunque también está probando algunas otras cosas al mismo tiempo, así que no es el ejemplo más limpio: https://github.com/dakom/ball-bounce-frp )
EDITAR 1: como se menciona en los comentarios, probablemente sea importante señalar que aún no he aprendido sobre el cambio de la aceleración, o sobre el manejo de tirones y otras cosas que requieren una integración de orden superior a la aceleración constante.
EDITAR 2: aquí hay un código de muestra básico de la idea y una sintaxis de pseudo javascript: tenga en cuenta que getKinematicPosition
se aplica parcialmente, por lo que devuelve una nueva función de solo Tiempo -> Posición:
Me estoy quedando en la posición aquí, pero podría ser algo más, como getVelocity
, supongo ...
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
}
}