В 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? Какой смысл в этом моделировании, если у нас нет скорости ...
Во всяком случае, само собой разумеется, я довольно растерян и улетел с планеты Земля. Надеясь, что кто-то там может прояснить это для меня.
источник
Ответы:
RK4 - пример числового интегратора . Интеграция Эйлера - похожая концепция, но она гораздо менее точна. Числовая интеграция не является точной, но намного лучше для компьютера в реальном времени, например, в игре. Причина, по которой вы используете RK4 вместо Эйлера, заключается в том, что RK4 учитывает интеграцию второго и третьего производных (ускорение и рывок) и, таким образом, намного лучше подходит для аналитического решения.
RK4 - это, по существу, разложение в ряд Тейлора дифференциального уравнения, которое определяет ускорение относительно перемещения и скорости. Это позволяет объединять силы, которые зависят от этих величин, например, в ограничениях и даже в универсальной гравитации. Расширения серии Тейлора полезны в программировании, так как компьютеры могут оценивать их очень эффективно.
acceleration
Функция , используемая пример представляет собой простой затухают пружинную систему, не гравитационное.k
является пружинной постоянной Гука, иb
используется для демпфирования системы (удаления энергии). Для практически всех связанных с пружиной ограничений в вашем двигателе вы захотите их уменьшить, поскольку числовые ошибки могут привести к огромному накоплению энергии, что приведет к взрыву симуляции. Если бы вы использовали интеграцию Эйлера, это было бы намного хуже.Что касается
acceleration()
, более полный физический движок будет рассчитывать как линейные, так и угловые ускорения на основе сил (моментов). Силы для суммирования могут включать гравитацию (постоянную или основанную на универсальной гравитации), плавучесть и пружины (большинство ограничений можно моделировать с помощью жестких пружин).На ваш третий вопрос легко ответить. В кинематике есть три основных величины: перемещение (положение), скорость и ускорение. Ускорение является производной от скорости, которая является производной от смещения (как по времени). Производная - это просто скорость, с которой что-то меняется.
Derivative.dx
означает «производная отState.x
».Поскольку моделирование предполагает, что пружина закреплена в начале координат и имеет длину покоя, равную нулю, смещение 100 означает, что частица начнет колебаться. Тестовое моделирование заканчивается, когда частица не движется и находится близко к началу координат.
источник