2012-04-13 13 views
0

runge kuttaを使用して2D剛体物理のC++/openglソースコードデモを知っている人はいますか?runge kuttaを使用した2D剛体物理

私は物理エンジンを構築したいと思いますが、他の人がこれをどのように実装したかを理解するために、参考コードが必要です。

+2

より簡単なオイラー法のバージョンから始めます。これを済ませたら、Runge-Kuttaに "アップグレード"するのは簡単なはずです。 – leftaroundabout

答えて

2

これをうまくやらなければならないことがたくさんあります。私はインテグレータの実装に焦点を当て、私がうまく動作していることがわかりました。システム内のすべての自由度については

は、時間tの関数として加速度aを返すための機能を実装し、xと速度vを配置します。スカラだけでなく数量の配列やベクトルにも作用します。各RKステップ後

a = accel(t,x,v); 

は、次のステップのために準備ができて加速度を評価します。ループでは、これを行う:

{ 
    // assume t,x[],v[], a[] are known 
    // step time t -> t+h and calc new values 
    float h2=h/2; 
    vec q1 = v + h2*a; 
    vec k1 = accel(t+h2, x+h2*v, q1); 
    vec q2 = v + h2*k1; 
    vec k2 = accel(t+h2, x+h2*q1, q2); 
    vec q3 = v + h*k2; 
    vec k3 = accel(t_h, x+h*q2, q3); 
    float h6 = h/6; 
    t = t + h; 
    x = x + h*(v+h6*(a+k1+k2)); 
    v = v + h6*(a+2*k1+2*k2+k3); 
    a = accel(t,x,v); 
} 

なぜですか?標準RKメソッドでは、2xN状態ベクトルを作成する必要がありますが、派生語のN要素の派生は、最後のN要素と等しくなります。問題を2つのN状態ベクトルに分割し、少し単純化すれば、2次のRKの上記スキームに到達します。

私はこれを行い、その結果はN=6の自由度を持つ計画システムの市販のソフトウェアと同じです。