void Update(float dt) { // Divide the dt for multiple simulations. dt /= (float)SimulationIterations; // Perform the simulation as many times as requested. The more // iterations the less likely objects will fly through each other. for (size_t i = 0U; i < SimulationIterations; ++i) { // Integrate all bodies. for (auto& body : bodies) { body->ApplyActors(dt); body->Integrate(dt); } // Generate contacts. size_t contacts = GenerateContacts(); // Resolve contacts. ContactResolver resolver; resolver.PositionIterations = contacts * 2; resolver.VelocityIterations = contacts * 2; resolver.ResolveContacts(collisionData.Contacts, dt); } // Clear accumulators for all bodies. for (auto& body : bodies) { // Reset forces applied. body->ClearAccumulators(); } }
void PhysicsManager::CollisionUpdate(const float& dt) { //First off, let's begin our coarse collision detection. This tests for only intersections in each frame, no fancy stuff. std::vector<CollisionPair> sceneCollisions = CoarseCollisionDetection(sceneCollideables); if (!sceneCollisions.empty()) { GenerateContacts(sceneCollisions); ResolveCollisions(sceneCollisions, dt); } }