RK4、デリバティブ、ゲーム物理の理解


8

Gafferon Gamesには、物理​​シミュレーションを構築するためのRK4統合に関する優れた記事があり、ここにあります:統合の基本

個人的には、私の数学と物理学の知識で改善を利用できます。私はベクトル数学、トリガー、いくつかの統計(ソフトウェアに線形回帰式を使用する必要がありました)などの領域と、基本的に高校レベルから大学1年生までのほとんどの領域で快適です。

質問に答えて、私はこの記事を読み、関連するソースをダウンロードし、1行ずつデバッグして、何が起こっているのかを理解しようとしましたが、それでも私が見ているものを明確に取得していないように感じています。私はインターネットを検索して「For Dummies」バージョンを見つけようとしましたが、正直言って少し違った方法で学習し、暗記に重点を置いて数式をじっと見つめていると、何が起こっているのかを理解する必要があるので、それを削減するつもりはありません。柔軟に適用できます。

これが私がこれまでに理解したことだと思いますが、他の誰かが私を明確にしたり完全に修正したりできることを願っています。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
teodron、2014

1
興味深いことに、私はいくつかのコーヒーをつかんでそれを読みます!個人的には、基本的なシミュレーションから高度なシミュレーションまで可能な限り理解したいと思っています。現在、非常に基本的なものをいくつか作成しましたが、これは純粋に知識の探求であるため、開発者としての柔軟性をさらに高めることができます。参考にしていただき、ありがとうございます。
Bennett Yeates 14

回答:


6

RK4は数値積分器の例です。オイラー積分も同様の概念ですが、精度ははるかに低くなります。数値積分は正確ではありませんが、ゲームなどのリアルタイムの状況でコンピュータが処理するにははるかに優れています。オイラーの代わりにRK4を使用する理由は、RK4は2次および3次導関数(加速とジャーク)の積分を考慮に入れるため、分析解にはるかによく適合します。

RK4は本質的に、変位と速度に関する加速度を定義する微分方程式のテイラー級数展開です。これにより、拘束や万有引力など、これらの量に依存する力を統合できます。コンピュータはそれらを非常に効率的に評価できるので、テイラー級数展開はプログラミングに役立ちます。

acceleration使用される関数は一例であり、単純な減衰ばねシステム、ではない重力。 kはフックのばね定数であり、b、システムの減衰(エネルギーの除去)に使用されます。エンジン内のほとんどすべてのスプリング関連の制約について、数値エラーがエネルギーの膨大な蓄積を引き起こし、シミュレーションを爆発させる可能性があるため、それらを減衰させたいと思うでしょう。オイラー統合を使用している場合、これはさらに悪くなります。

に関してacceleration()は、より完全な物理エンジンが力(トルク)に基づいて直線加速度と角加速度の両方を計算します。合計する力には、重力(一定またはユニバーサルグラビテーションに基づく)、浮力、およびばね(ほとんどの拘束は硬いばねを使用してモデル化できます)を含めることができます。

3番目の質問は簡単に答えられます。キネマティクスでは、変位(位置)、速度、および加速度の3つの基本的な量があります。加速度は、速度の導関数であり、変位の導関数です(両方とも時間に関して)。導関数は、何かが変化する速度です。 Derivative.dx「の派生物State.xます。

シミュレーションでは、ばねが原点に固定されており、残りの長さがゼロであると想定しているため、変位が100の場合、パーティクルが振動し始めます。テストシミュレーションは、パーティクルが移動しておらず、原点に近いときに終了します。


もう1つの説明は、RK4を微分方程式のテイラー展開として考えることができるというものです。
RandyGaul 2014

これは素晴らしい答えであり、私の物理学の知識のいくつかの穴を本当に明らかにしました。減衰ばねシステムとは何か、トルクなどを理解するための適切な出発点についていくつかの参照を提供できますか?私はこれらのより高度なメカニズムに間違いなく欠けていると思います。特に私が最近テイラー多項式を始めたばかりなので、あなたの答えは本当に私にとって多くのことを明確にします。
Bennett Yeates 2014

私はここで試してみる:khanacademy.org/science/physics
jmegaffin

パーフェクト、カナカデミーは私が考えていた場所でした。
Bennett Yeates 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.