예제 #1
0
    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();
      }
    }
예제 #2
0
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);
	}
}