RK4, Производные, Понимание физики игры

8

В 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 - это перебор, и из-за соотношения цена / стабильность не самый лучший выбор для этих внезапных и резких изменений в ускорении. Если вы ищете дискуссию о том, какой тип интеграторов стоит выбрать, а также о том, как построить довольно упрощенный симулятор, я могу порекомендовать технический отчет именно об этих проблемах: arxiv.org/pdf/1311.5018v1.pdf
Теодрон
1
Интересно, я возьму немного кофе и прочту это! Лично мне интересно понять как можно больше от базового моделирования до продвинутого. В настоящее время я сделал несколько очень простых, но это просто поиск знаний, чтобы я мог повысить свою гибкость как разработчика. Спасибо за ссылку, очень ценю это!
Беннет Йейтс

Ответы:

6

RK4 - пример числового интегратора . Интеграция Эйлера - похожая концепция, но она гораздо менее точна. Числовая интеграция не является точной, но намного лучше для компьютера в реальном времени, например, в игре. Причина, по которой вы используете RK4 вместо Эйлера, заключается в том, что RK4 учитывает интеграцию второго и третьего производных (ускорение и рывок) и, таким образом, намного лучше подходит для аналитического решения.

RK4 - это, по существу, разложение в ряд Тейлора дифференциального уравнения, которое определяет ускорение относительно перемещения и скорости. Это позволяет объединять силы, которые зависят от этих величин, например, в ограничениях и даже в универсальной гравитации. Расширения серии Тейлора полезны в программировании, так как компьютеры могут оценивать их очень эффективно.

accelerationФункция , используемая пример представляет собой простой затухают пружинную систему, не гравитационное. kявляется пружинной постоянной Гука, иb используется для демпфирования системы (удаления энергии). Для практически всех связанных с пружиной ограничений в вашем двигателе вы захотите их уменьшить, поскольку числовые ошибки могут привести к огромному накоплению энергии, что приведет к взрыву симуляции. Если бы вы использовали интеграцию Эйлера, это было бы намного хуже.

Что касается acceleration(), более полный физический движок будет рассчитывать как линейные, так и угловые ускорения на основе сил (моментов). Силы для суммирования могут включать гравитацию (постоянную или основанную на универсальной гравитации), плавучесть и пружины (большинство ограничений можно моделировать с помощью жестких пружин).

На ваш третий вопрос легко ответить. В кинематике есть три основных величины: перемещение (положение), скорость и ускорение. Ускорение является производной от скорости, которая является производной от смещения (как по времени). Производная - это просто скорость, с которой что-то меняется. Derivative.dxозначает «производная отState.x ».

Поскольку моделирование предполагает, что пружина закреплена в начале координат и имеет длину покоя, равную нулю, смещение 100 означает, что частица начнет колебаться. Тестовое моделирование заканчивается, когда частица не движется и находится близко к началу координат.

jmegaffin
источник
Другое описание состоит в том, что вы можете думать о RK4 как о расширении Тейлора дифференциального уравнения.
RandyGaul
Это отличный ответ и действительно выявил некоторые пробелы в моих знаниях физики. Можете ли вы дать некоторые ссылки на хорошее начальное место для понимания, что такое система с демпфированными пружинами, крутящие моменты и т. Д.? Я считаю, что мне определенно не хватает этой более продвинутой механики. Ваш ответ действительно многое проясняет для меня, тем более что я недавно начал изучать полиномы Тейлора.
Беннет Йейтс
Я бы попробовал здесь: khanacademy.org/science/physics
jmegaffin
Идеально, ханакадемия была тем местом, о котором я думал.
Беннет Йейтс