В Gafferon Games есть отличная статья об интеграции RK4 для моделирования физики, которую можно найти здесь: Основы интеграции
Лично мои знания по математике и физике могли бы улучшить. Я чувствую себя комфортно в сфере векторной математики, триггеров, некоторых статистических показателей (мне пришлось использовать формулы линейной регрессии для программного обеспечения и т. Д.), И в основном в большинстве вещей от уровня средней школы до первого курса колледжа.
Теперь на вопрос, я прочитал эту статью, скачал соответствующий источник и построчно отлаживал, чтобы попытаться понять, что происходит, и все еще чувствую, что я явно не понимаю, на что смотрю. Я искал в интернете, пытаясь найти версии «Для чайников», честно говоря, я учусь немного по-другому, и весь день смотрю на формулы, делая упор на запоминание, но не собираюсь сокращать его, так как мне нужно понять, что происходит, поэтому я может быть гибким в применении.
Итак, вот что, я думаю, я понимаю до сих пор, но я надеюсь, что кто-то другой сможет уточнить или полностью исправить меня. RK4 использует шаг Эйлера, затем основывает его на том, чтобы двигаться вперед во времени, чтобы вычислить несколько более существенных шагов Эйлера (?), И определяет с помощью взвешенной суммы, какова лучшая позиция и скорость для следующего кадра?
Кроме того, этот метод ускорения (преобразован в AS3):
private function acceleration(state:State, time:Number):Number
{
const k:int = 10;
const b:int = 1;
return - k*state.x - b*state.v;
}
принимает постоянную массу (10) и силу (1)? и возвращает какой-то странный расчет, я понятия не имею, почему ...- масса * позиция - сила * скорость? что?
Тогда для моего последнего недоразумения в методах оценки, которые выглядят как (AS3):
private function evaluateD(initial:State, time:Number, dtime:Number, d:Derivative):Derivative
{
var state:State = new State();
state.x = initial.x + d.dx*dtime;
state.v = initial.v + d.dv*dtime;
var output:Derivative = new Derivative();
output.dx = state.v;
output.dv = acceleration(state, time+dtime);
return output;
}
Мы сохраняем новое состояние с шагом времени, а затем устанавливаем производную для возврата ... Я понимаю это, как оно используется в процессе аппроксимации, но что это такое !:
output.dx = state.v;
output.dv = acceleration(state, time+dtime);
// ok I get we are getting the new velocity since v = a * t, obviously I
// don't what acceleration() is returning though.
Мы устанавливаем изменение производной выходного положения в состояние новой скорости? А?
Наконец, эта тестовая симуляция выполняется следующим образом:
var state:State = new State();
state.x = 100;
state.v = 0;
t = 0;
dt = 0.1;
while (Math.abs(state.x)>0.001 || Math.abs(state.v)>0.001)
{
trace(state.x, state.v);
integrate(state, t, dt);
t += dt;
}
Итак, мы устанавливаем новое состояние с позиционным значением 100 и скоростью 0? Какой смысл в этом моделировании, если у нас нет скорости ...
Во всяком случае, само собой разумеется, я довольно растерян и улетел с планеты Земля. Надеясь, что кто-то там может прояснить это для меня.