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

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

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

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

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

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

20 Апр в 13:20
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 718 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир