Ben DIY fiziği öğrenmek başladım ve ben en temel düzeyde entegrasyonu uygulanması hakkında soru (yani bu var değil bir Euler RK4 vs soru).
Karşılaştığım neredeyse her örnek integrate()
, son güncellemeden bu yana zaman aşımını alan ve son güncellemeden bu yana hızlandırmayı (ve / veya hız ve / veya konum) güncelleyen bazı işlevlere sahip.
En basit biçimde: position += velocity * deltaTime
Ancak, bir işlevi değiştirerek kolayca elde edilebildiğinde neden bu şekilde biriktiğini anlamıyorum . Örneğin: getPosition = makeNewFunction()
imzası olan bir şeyi döndürebilen Time -> Position
ve bu işlevin iç işleyişi uygun matematiksel formülle üretilir.
Bu şekilde, birikim olmaz ... pozisyonun ne zaman alınması gerektiğine göre, o zamana kadar o fonksiyonu çağırır.
Acemi anlayışım, bunun birikimden kaynaklanan hataları da önleyeceğidir ... peki bu neden çalışmıyor, neyi kaçırıyorum?
(I FWIW did o da aynı anda birkaç şey deniyor olsa birlikte bu fikir-kavramının temel bir kanıt koymak o en temiz örnek değil bu yüzden: https://github.com/dakom/ball-bounce-frp )
DÜZENLEME 1: açıklamalarda belirtildiği gibi, ben olduğunu işaret etmek muhtemelen önemli değil henüz hızlanmayı değiştirerek veya pislik ve sürekli ivme daha yüksek dereceden entegrasyon gerektiren diğer şeylerle uğraşan öğrendik.
DÜZENLEME 2: Burada fikir bazı temel örnek kod ve sözde JavaScript sözdizimi - nota getKinematicPosition
edilir kısmen uygulanan bu sadece Zaman yeni bir fonksiyon dönüyor böylece -> Pozisyon:
Ben burada duruyorum ama getVelocity
sanırım başka bir şey olabilir ...
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
}
}