Как реализовать грамотную радиальную гравитацию средствами Box2D?

Ситуация такая. Реализовал я в своей игрушке самописный движок с радиальной гравитацией: https://www.youtube.com/watch?v=mIiC-sHPVAM Все работало отлично до тех пор, пока мне не понадобилось реализовать столкновения. Решил для этой цели переписать все на Box2D.

Написал такую функцию:

void PhysicsManager::integrate(const qreal &timeStep)
{
    _world->Step(timeStep, _velocityIterations, _positionIterations);

    for (int i = 0; i < _gameObjects.count(); i++) {
        b2Body * body = _gameObjects[i];

        GravitySource * object = static_cast<GravitySource*>(body->GetUserData());

        if(object) {
            b2Vec2 gravityForce(0.0f, 0.0f);

            for(int j = 0; j < _gravitySources.count(); j++) {
                b2Body * gravityBody = _gravitySources[j];

                if(gravityBody == body) {
                    continue;
                }

                b2Vec2 direction = gravityBody->GetPosition() - body->GetPosition();

                float32 gravityBodyMass = 0;
                if(gravityBody->GetType() == b2_staticBody) {
                    gravityBodyMass = staticBodyMass(gravityBody);
                } else {
                    gravityBodyMass = gravityBody->GetMass();
                }

                float32 gravityAcceleration = _gravityConst * body->GetMass() * gravityBodyMass / qPow(direction.Length(), 2);

                direction *= 1.0f / direction.Length();
                direction *= gravityAcceleration;

                gravityForce += direction;

            }

            body->ApplyForceToCenter(gravityForce, true);

            object->setPosition(body->GetPosition());
            object->setGravitationVector(gravityForce);
            object->setVelocityVector(body->GetLinearVelocity());
        }
    }
}


Вот только теперь гравитация ведет себя не совсем адекватно. Мало того, если установить объекту LinearVelocity, то он вообще начинает игнорировать приложенную к нему силу. Подскажите, как реализовать корректную ньютоновскую физику, как на видео. И еще у меня возникло ощущение, что Box2D работает медленнее моей реализации. Может быть есть более производительные движки с обработкой столкновений?
  • Вопрос задан
  • 1157 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы