c ++中基于点的引力的例子

Elg*_*oog 2 c++ opengl physics gravity

我试图弄清楚如何将重力应用到我正在创建的应用程序中.我在Opengl有一个球体,我想要像行星一样赋予它重力.所以靠近它的任何小物体都会"掉落"到它的表面.我在网上的每一个地方都显示公式,但从不显示例子.我想知道是否有人能指出我在c ++中的一个例子的方向.我真的不想使用物理库,我希望能够看一下这个例子并从中学习以便自己理解它.

jef*_*yer 6

您需要编写一个实现重力公式的函数,例如:

const float g = 9.81f;  // Gravity of Earth in m/s²
float gravity(Vec3 p1_pos, Vec3 p2_pos, float p1_mass, float p2_mass)
{
    float distance = (p2_pos - p1_pos).length();
    return g * p1_mass * p1_mass / (distance*distance);
}
Run Code Online (Sandbox Code Playgroud)

将力的大小乘以单位向量并行top2_pos - p1_pos,以给力一个方向.然后,使用F = ma简单地计算对象上的加速度

struct object
{
    Vec3 pos;
    Vec3 vel;
    float mass;

    void add_force(Vec3 force);
};

void object::add_force(Vec3 force, float dt)
{
    vel += (force / mass) * dt;
}
Run Code Online (Sandbox Code Playgroud)

务必将加速度乘以dt,即每帧的秒数.这样,无论计算机的速度如何,您的模拟都可以以常规速度进行.我编写了一个NBody模拟,它使用了与上面类似的技术来模拟任意数量的行星并计算它们相互吸引的力.对于要模拟的每个对象,使用重力函数来获取力的大小,并在对象上调用add_force()来推动它.您需要将Vec3替换为您自己的矢量类,并确保它具有运算符重载.OpenGL可能提供一个.

  • 您使用了错误的重力常数。虽然在地球表面,重力加速度确实是 9.8 m/s^2,但这不是重力方程中应该使用的。您需要使用引力常数 G,这适用于所有大质量物体,而不仅仅是地球。G 的值为 6.67 x 10E-11,单位为牛顿 * 米^2 / kg^2。 (3认同)

小智 5

也许现在为时已晚,但至少其他人可能会从中得到一些东西.

这是我刚用C++和OpenGL进行重力模拟的程序.希望它会有所帮助.源代码在视频的描述中,也可以在这里找到.

http://www.youtube.com/watch?v=TXY6NJm5se0&list=UU0OHvV8fkDcKlWAm1vFqc1w&index=1&feature=plcp