Как реализовать грамотную радиальную гравитацию средствами 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(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 работает медленнее моей реализации. Может быть есть более производительные движки с обработкой столкновений?

21 Авг 2019 в 06:18
168 +1
0
Ответы
1

Для правильной реализации радиальной гравитации средствами Box2D, вам следует использовать функцию SetGravityScale() для установки коэффициента гравитации для каждого объекта. Это позволит управлять гравитацией независимо для каждого тела.

Что касается проблемы с игнорированием силы LinearVelocity, возможно, вы неправильно используете функцию ApplyForceToCenter(). Убедитесь, что вы корректно устанавливаете параметр wake (true), чтобы объект просыпался и реагировал на приложенную силу.

Что касается производительности, Box2D является достаточно производительным движком, но если вы столкнулись с проблемами скорости, попробуйте оптимизировать ваш код, уменьшить количество объектов в мире, использовать более эффективные алгоритмы обработки столкновений и т.д.

Если вам все же нужен более производительный движок, вы можете рассмотреть альтернативы, такие как Chipmunk или Box2D-Lite. Но в большинстве случаев, оптимизация кода должна помочь улучшить производительность Box2D.

20 Апр 2024 в 13:20
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир