runge kuttaを使用して2D剛体物理のC++/openglソースコードデモを知っている人はいますか?runge kuttaを使用した2D剛体物理
私は物理エンジンを構築したいと思いますが、他の人がこれをどのように実装したかを理解するために、参考コードが必要です。
runge kuttaを使用して2D剛体物理のC++/openglソースコードデモを知っている人はいますか?runge kuttaを使用した2D剛体物理
私は物理エンジンを構築したいと思いますが、他の人がこれをどのように実装したかを理解するために、参考コードが必要です。
これをうまくやらなければならないことがたくさんあります。私はインテグレータの実装に焦点を当て、私がうまく動作していることがわかりました。システム内のすべての自由度については
は、時間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
の自由度を持つ計画システムの市販のソフトウェアと同じです。
より簡単なオイラー法のバージョンから始めます。これを済ませたら、Runge-Kuttaに "アップグレード"するのは簡単なはずです。 – leftaroundabout