首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用龙格库塔的二维刚体物理

使用龙格库塔的二维刚体物理
EN

Stack Overflow用户
提问于 2012-04-14 03:58:46
回答 1查看 4.1K关注 0票数 2

有谁知道使用runge kutta的2D刚体物理的c++/opengl源码演示吗?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-14 04:22:40

要很好地做到这一点,你需要注意很多事情。我将专注于集成器的实现,以及我发现对我来说很好的东西。

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

代码语言:javascript
复制
a = accel(t,x,v);

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

代码语言:javascript
复制
{
   // 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自由度的平面系统的商业软件相同。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10147507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档