有谁知道使用 runge kutta 的 2D 刚体物理的任何 c++/opengl 源代码演示?
我想构建一个物理引擎,但我需要一些参考代码来更好地理解其他人是如何实现的。
有谁知道使用 runge kutta 的 2D 刚体物理的任何 c++/opengl 源代码演示?
我想构建一个物理引擎,但我需要一些参考代码来更好地理解其他人是如何实现的。
你必须注意很多事情才能很好地做到这一点。我将专注于集成器的实施以及我发现的对我有用的东西。
对于系统中的所有自由度,实现一个函数以将加速度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
自由度的计划系统的商业软件相同。