【问题标题】:example of point-based gravity in c++ [closed]C++中基于点的重力示例[关闭]
【发布时间】:2011-04-01 07:15:06
【问题描述】:

我试图弄清楚如何在我正在创建的应用程序中实现重力。我在 Opengl 中有一个球体,我想给它像行星一样的重力。所以它附近的任何小物体都会“掉”到它的表面。

我想知道是否有人可以指出 c++ 中的示例。

【问题讨论】:

  • 你看懂公式了吗?如果没有,那就去图书馆(一个真正的图书馆,一个里面有纸质书的真实世界的建筑)并查阅物理教科书。如果您不了解物理,就无法编写有效的代码,并且如果您试图通过学习物理模拟走捷径,您最终会一遍又一遍地回到这里.

标签: c++ opengl physics gravity


【解决方案1】:

也许为时已晚,但至少其他人可能会从中有所收获。

这是我刚刚用 C++ 和 OpenGL 编写的重力模拟程序。希望它会有所帮助。 源码在视频的描述和can be found here as well.

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

【讨论】:

    【解决方案2】:

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

    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 可能提供了一个。

    【讨论】:

    • 在您的示例中,您应该命名 vel accel,因为它是加速度而不是速度。为了获得速度,您必须不断地通过加速来增加速度。
    • 另外,您必须考虑 2 次计算之间的增量时间,因为它可能使用变量 fps 渲染,并且用于演示(而非模拟)目的,这意味着您不能依赖帧之间的恒定时间,您必须获取当前系统时间(精确到毫秒)并根据当前增量时间(实际时间 - 显然是前一次)计算新值。
    • 不,加速度等于力/质量。这是速度的变化,这就是为什么将该值添加到 vel 中的原因。对于您的第二条评论,您是正确的。我简化了代码,因为我没有这个项目。稍后会添加。
    • 您使用了错误的引力常数。虽然在地球表面,重力加速度确实是 9.8 m/s^2,但这不是重力方程中应该使用的值。您需要使用引力常数 G,这适用于所有大质量物体,而不仅仅是地球。 G 的值为 6.67 x 10E-11,单位为牛顿 * 米^2 / kg^2。
    • 我不知道为什么 stackoverflow 算法现在才决定通知我这条评论,但是是的,你是绝对正确的。
    【解决方案3】:

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

    到现在为止和上面一样。错误在于,当使用米表示距离,使用公斤表示质量时,有一个常数使力与现实世界中的测量值成比例。这个常数在我的公式中记为“g”。这个 'g' 不是 9.81 。这个“g”,引力常数。等于:6.67300 × 10^-11 m^3 / (kg * s^2)。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2011-07-27
        • 1970-01-01
        • 2011-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-01
        • 2010-12-28
        • 1970-01-01
        相关资源
        最近更新 更多