Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中基于点的重力示例+;_C++_Opengl_Physics_Gravity - Fatal编程技术网

C++ c+中基于点的重力示例+;

C++ c+中基于点的重力示例+;,c++,opengl,physics,gravity,C++,Opengl,Physics,Gravity,我正试图找出如何在我正在创建的应用程序中实现重力。我在Opengl中有一个球体,我想给它像行星一样的重力。因此,任何靠近它的小物体都会“坠落”到它的表面 我想知道有没有人能指出C++中的一个例子。你可能不想使用物理库,但是如果你看一个源代码,它可能会帮助你理解公式的更好。是一个开源的物理引擎,你可能想看看。或者,是一个开源的3d物理引擎。您需要编写一个实现重力公式的函数,例如: const float g = 9.81f; // Gravity of Earth in m/s² float g

我正试图找出如何在我正在创建的应用程序中实现重力。我在Opengl中有一个球体,我想给它像行星一样的重力。因此,任何靠近它的小物体都会“坠落”到它的表面


<>我想知道有没有人能指出C++中的一个例子。

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

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

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替换自己的vector类,并确保它具有运算符重载。OpenGL可能提供了一个。也许现在做这个已经太迟了,但至少其他人可能会从中得到一些东西

这是我刚用C++和OpenGL编写的一个重力模拟程序。希望这会有帮助。 源代码在视频和视频的描述中


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

到目前为止,同上。错误在于,当使用米表示距离,千克表示质量时,存在一个常数,使得力与实际测量值成比例。这个常数在我的公式中记为‘g’。这个‘g’不是9.81。这是重力常数。等于:6.67300×10^-11 m^3/(kg*s^2)


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

在您的示例中,您应该将vel accel命名为,因为它是加速度而不是速度。要获得速度,您必须通过accel不断增加vel。此外,您必须考虑两次计算之间的增量时间,因为它可能是使用可变fps渲染的,并且用于演示(而不是模拟)目的,这意味着您不能依赖帧间的恒定时间,您必须获得当前系统时间(精确到毫秒)并根据当前增量时间(实际时间-显然是以前的时间)计算新值不,加速度等于力/质量。这是速度的变化,这就是为什么该值被添加到vel中。你的第二个评论是正确的。我简化了代码,因为我不知道该项目。稍后再添加。你使用了错误的重力常数。虽然在地球表面,这是事实,但重力引起的加速度是9.8 m/s^2,这不是重力方程中应该使用的。你需要使用重力常数G,它适用于所有大质量物体,而不仅仅是地球。G的值是6.67 x 10E-11,单位为牛顿*米^2/kg^2。我不知道为什么stackoverflow算法只是刚刚决定的现在就通知我这个评论,但你是绝对正确的。你明白这个公式吗?如果不明白,那就去图书馆(一个真正的图书馆,一个里面有纸质书的真实世界建筑)如果你不懂物理,你就无法编写有效的代码,如果你试图通过学习物理模拟走捷径,你就会一次又一次地回到这里。