пример точечной гравитации в с ++ - PullRequest
2 голосов
/ 01 апреля 2011

Я пытаюсь понять, как внедрить гравитацию в мое приложение, которое я создаю. У меня есть сфера в Opengl, и я хочу придать ей гравитацию, как планету. поэтому любые маленькие объекты рядом с ним будут «падать» на поверхность. Каждый раз, когда я выхожу в сеть, он показывает формулы, но никогда не показывает примеры. Мне интересно, если кто-нибудь может указать мне в направлении примера в C ++. Я действительно не хочу использовать физическую библиотеку, я хочу иметь возможность посмотреть на пример и учиться на нем, чтобы понять его сам.

Ответы [ 4 ]

6 голосов
/ 01 апреля 2011

Вам нужно написать функцию, которая реализует формулу гравитации, например:

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, вероятно, предоставляет один.

5 голосов
/ 08 июля 2012

Может быть, для этого уже слишком поздно, но, по крайней мере, другие могут получить что-то от этого.

Вот программа, которую я только что написал на C ++ и OpenGL для гравитационного моделирования. Надеюсь, это поможет. Исходный код приведен в описании видео, а также можно найти здесь .

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

3 голосов
/ 25 ноября 2012

Я думаю, что есть ошибка. Формула, которая вычисляет силу между объектом A массой mA и объектом B массой mB на расстоянии r, имеет вид: [g * (mA * mB)] / (r ^ 2)

То же, что и выше, до сих пор. Ошибка заключается в том, что при использовании метров для расстояний и кг для массы существует постоянная, которая делает силу пропорциональной измерениям в реальном мире. Эта константа в моей формуле отмечена как «g». Это «г» не 9,81. Это «г», гравитационная постоянная. равно: 6.67300 × 10 ^ -11 м ^ 3 / (кг * с ^ 2).

Таким образом, для объектов A и B, имеющих массу 1 кг и расстояние «r», равное 1 метру, сила между ними будет: 6,67300 × 10 ^ -11 (кг * м) / (с ^ 2) или 6,67300 × 10 ^ -11 Ньютонов. Это очень маленькая сила :) На нашей планете ОГРОМНО: D. Эта масса - то, что дает на поверхности силу 9,81 Ньютона на тело с массой 1 кг.

3 голосов
/ 01 апреля 2011

Возможно, вы не захотите использовать физическую библиотеку, но если вы посмотрите на исходный код для нее, это, вероятно, поможет вам понять формулу, которую вы продолжаете видеть немного лучше. Box2D - физический движок с открытым исходным кодом, на который вы можете взглянуть.С другой стороны, Bullet - это трехмерный физический движок с открытым исходным кодом.

...