使用runge kutta的2D刚体物理

时间:2012-04-13 19:58:46

标签: c++ physics runge-kutta

有没有人知道使用runge kutta进行2D刚体物理的c ++ / opengl源代码演示?

我想构建一个物理引擎,但我需要一些参考代码来更好地理解其他人如何实现它。

1 个答案:

答案 0 :(得分:3)

你需要注意很多事情才能做得很好。我将专注于集成商实施,我发现的对我有用。

对于系统中的所有自由度,实现一个函数,以根据时间a,位置t和速度x返回加速度v。这应该在数量的数组或向量上运行,而不仅仅是标量。

a = accel(t,x,v);

在每个RK步骤之后评估加速度,为下一步做好准备。在循环中,然后执行以下操作:

{
   // 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个元素。如果您将问题分解为两个N状态向量并简化一点,您将得到上述第二阶RK的方案。

我已经完成了这项工作,结果与具有N=6自由度的计划系统的商业软件相同。