Zaczynam się uczyć fizyki majsterkowania i mam pytanie dotyczące implementacji integracji na najbardziej podstawowym poziomie (tj. Nie jest to pytanie Eulera vs. RK4).
Niemal każdy przykład, na jaki natrafiam, ma integrate()
funkcję, która pobiera czas od ostatniej aktualizacji i aktualizuje przyspieszenie (i / lub prędkość i / lub pozycję) od ostatniej aktualizacji.
W najprostszej formie: position += velocity * deltaTime
Nie rozumiem jednak, dlaczego gromadzi się w ten sposób, skoro równie łatwo można go uzyskać, zmieniając funkcję . Na przykład: getPosition = makeNewFunction()
który może zwrócić coś, co ma sygnaturę Time -> Position
, a wewnętrzne funkcje tej funkcji są generowane za pomocą odpowiedniego wzoru matematycznego.
W ten sposób nie dochodzi do kumulacji ... ilekroć trzeba uzyskać pozycję, wywołuje tę funkcję z bieżącym czasem.
Rozumiem dla początkujących, że pozwoli to uniknąć błędów wynikających z akumulacji ... więc dlaczego to nie działa, czego mi brakuje?
(FWIW ja nie ułożyła podstawowy dowód koncepcji tego idea- choć to także testowanie kilka innych rzeczy w tym samym czasie, więc nie jest to najczystszy przykład: https://github.com/dakom/ball-bounce-frp )
EDYCJA 1: jak wspomniano w komentarzach, prawdopodobnie ważne jest, aby zauważyć, że jeszcze nie nauczyłem się o zmianie przyspieszenia lub radzeniu sobie z szarpnięciem i innymi rzeczami, które wymagają integracji wyższego rzędu niż stałe przyspieszenie.
EDYCJA 2: oto podstawowy przykładowy kod pomysłu i składnia pseudo javascript - zauważ, że getKinematicPosition
jest częściowo zastosowana, więc zwraca nową funkcję tylko Czas -> Pozycja:
Trzymam się pozycji, ale może to być coś innego, jak getVelocity
sądzę ...
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
}
}