when i first got my physics up and going i used the classic baraff style.. non-penetrating physics using discreet time-stepping with bisecting.
of course, that all works like crap in practice for next-gen game like scenarios that are meant to run real-time without hitching. i switched over to penetrating physics and that simplified most everything and everything got a whole hell of a lot faster. not time-stepping to the first point of impact really speeds everything up.
so the big problem with penetrating physics is handling triangle meshes. which are especially important for games. if the game world is made out of convex brushes that makes things simpler, but game worlds going forward are being built more and more with raw triangle soups. opende has pretty good mesh collision stuff, but it is not 100% robust and it can generate a whole hell of a lot of contacts slowing things down a lot.
when i first implemented the penetrating physics i still had my non-penetrating physics laying around, and i realized something.. a hybrid solution can solve the mesh problem and still be really fast.
it works like this:
do classic baraff style stuff with all dynamic objects against the static meshes ignoring dynamic-dynamic collisions. run the simulation until the full time-step is completed. because there are not dynamic objects interfering, that 99.9% will take only two sub-steps. in the other cases it might take a few more sub-steps, but it will solve in a reasonable number.
now do penetrating style physics between all the dynamic objects and sync to the current time.
very simple. very robust. very fast.
the condition with all this is the dynamic objects need to be primitives which is prefectly acceptable. composting of primitives works very well for dynamic objects in a game, but works like crap for worlds.