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