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

时间:2011-04-01 07:15:06

标签: c++ opengl physics gravity

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

4 个答案:

答案 0 :(得分: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);
}

将力的大小乘以单位向量并行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;
}

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

答案 1 :(得分:5)

这可能为时已晚,但至少其他人可能会从中获得一些东西。

这是我刚用C ++和OpenGL进行重力模拟的程序。希望它会有所帮助。 源代码位于视频说明中,can be found here as well

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

答案 2 :(得分:3)

您可能不想使用物理库,但是如果您查看一个物理库的源代码,它可能会帮助您理解您继续看到更好的公式。 Box2D是一个开源物理引擎,您可能需要查看。或者,Bullet是一个开源的3d物理引擎。

答案 3 :(得分:3)

我认为有一个错误。在距离r处计算质量mA的物体A与质量mB的物体B之间的力的公式为:[g *(mA * mB)] /(r ^ 2)

直到现在与上述相同。错误在于,当使用米距离和千克质量时,有一个常数使得力量与现实世界中的测量结合在一起。这个常数在我的公式中被标记为'g'。这个'g'不是9.81。这个'g',引力常数。等于:6.67300×10 ^ -11立方公尺/(kg * s ^ 2)。

因此,对于质量为1千克,距离'r'为1米的物体A和B,它们之间的力将为:6.67300×10 ^ -11(kg * m)/(s ^ 2) ,或6.67300×10 ^ -11牛顿。这是一个非常小的力量:)我们的星球是巨大的巨大的:D。该质量是在表面上产生9.81牛顿的力,质量为1千克的物体。