Как реализовать грамотную радиальную гравитацию средствами 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 (body->GetUserData()); if(object) { b2Vec2 gravityForce(0.0f, 0.0f); for(int j = 0; j 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 работает медленнее моей реализации. Может быть есть более производительные движки с обработкой столкновений?
Для правильной реализации радиальной гравитации средствами Box2D, вам следует использовать функцию SetGravityScale() для установки коэффициента гравитации для каждого объекта. Это позволит управлять гравитацией независимо для каждого тела.
Что касается проблемы с игнорированием силы LinearVelocity, возможно, вы неправильно используете функцию ApplyForceToCenter(). Убедитесь, что вы корректно устанавливаете параметр wake (true), чтобы объект просыпался и реагировал на приложенную силу.
Что касается производительности, Box2D является достаточно производительным движком, но если вы столкнулись с проблемами скорости, попробуйте оптимизировать ваш код, уменьшить количество объектов в мире, использовать более эффективные алгоритмы обработки столкновений и т.д.
Если вам все же нужен более производительный движок, вы можете рассмотреть альтернативы, такие как Chipmunk или Box2D-Lite. Но в большинстве случаев, оптимизация кода должна помочь улучшить производительность Box2D.
Для правильной реализации радиальной гравитации средствами Box2D, вам следует использовать функцию SetGravityScale() для установки коэффициента гравитации для каждого объекта. Это позволит управлять гравитацией независимо для каждого тела.
Что касается проблемы с игнорированием силы LinearVelocity, возможно, вы неправильно используете функцию ApplyForceToCenter(). Убедитесь, что вы корректно устанавливаете параметр wake (true), чтобы объект просыпался и реагировал на приложенную силу.
Что касается производительности, Box2D является достаточно производительным движком, но если вы столкнулись с проблемами скорости, попробуйте оптимизировать ваш код, уменьшить количество объектов в мире, использовать более эффективные алгоритмы обработки столкновений и т.д.
Если вам все же нужен более производительный движок, вы можете рассмотреть альтернативы, такие как Chipmunk или Box2D-Lite. Но в большинстве случаев, оптимизация кода должна помочь улучшить производительность Box2D.