您需要编写一个实现重力公式的函数,例如:
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可能提供一个.
小智 5
也许现在为时已晚,但至少其他人可能会从中得到一些东西.
这是我刚用C++和OpenGL进行重力模拟的程序.希望它会有所帮助.源代码在视频的描述中,也可以在这里找到.
http://www.youtube.com/watch?v=TXY6NJm5se0&list=UU0OHvV8fkDcKlWAm1vFqc1w&index=1&feature=plcp