Вам нужно написать функцию, которая реализует формулу гравитации, например:
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, вероятно, предоставляет один.