Here's the problem: imagine you have a huge circle and a smaller circle. Maybe the smaller circle is 1/10th the radius of the larger circle.
The smaller circle is on top of the larger circle, and starts to roll down. I can calculate tangent and frictional forces fairly easily. Anyone who's had an intro to physics course should be able to do that part. The hard part is then what to do with that information. If I step the simulation forward even 1/10000th of a second, the smaller circle will have moved in a ballistic path, which does not exactly follow the curve of the larger circle (it underestimates it in this case). It will have left the surface of the larger circle; it is now floating a few inches (or whatever) above the surface of the larger circle. If I step the simulation forward another 1/10000th of a second, the smaller circle is now inside the larger circle, since the tangent and friction forces no longer apply since they are no longer touching, and gravity rules supreme. The simulation detects that a collision between the two has occurred, and applies the proper impulses to both bodies. This process continues, and what you end up with is a bouncing, spinning circle on top of a larger circle, when the correct behavior is for the smaller circle not to bounce at all, but to smoothly roll down the larger circle.
It might not matter, of course. You might be able to ignore it in issues like this. But it isn't correct, and worse(!), the end behavior depends immensely on the step size. If I use 1/100th of a second instead of 1/10000th, I'll have a completely different motion. But by contrast I can model exactly the behavior of a square sliding down a ramp for some given time interval (until the square reaches the end of the ramp). It boils down to a polynomial. If I have two squares sliding down the same ramp, and one is stickier than the other and sliding slower, I can calculate the exact moment of collision by solving a 4th degree polynomial. Most physics engines work by moving the objects in the world some fraction of a second, then testing for collisions and resolving, then moving another fraction of a second, etc. I was imagining a system that didn't need to be stepped at all. Each body would know it's exact state at any time between now and when it eventually collided with something. I called this time interval an "epoch", but it might have a real name. After collisions, new epochs would be calculated for all bodies involved, (resulting in a possible cascade of collision calculation as these new epochs invalidated other epochs, etc. etc.).
It works fine for some very limited cases. As long as these hold true, it works:
1. Bodies are composed of unions of polygons. No curves. I can't simulate sliding along a curve, since the curve motion isn't polynomial. That is, I can't solve an equation like sin(x) - f(x) = 0, at least not without resorting to numerical methods.
2. Bodies do not rotate (although I was playing with the idea of approximating rotations with quadratics) or are limited to only circles (conflicts with #1).
3. All motion consists of discrete time periods of constant acceleration, so that the motion can be represented as a piecewise quadratic. Like, from 0 to 1 seconds acceleration is <0, 10, 0>, and from 1 to 5 seconds it's <10, -20, 0>, etc. That eliminates drag forces, spring forces, etc. etc.
Basically all three boiled down to the same issue: at some point I have some function, dependent on time, which represents the motion of a body. Colliding two bodies together requires subtracting the motion of one body from another, and finding the smallest positive zero, if it exists. I can do this extremely easily with the 3 limitations above since it just becomes a vector quadratic minus another vector quadratic. That is, something like this: At^2 + Bt + C = 0, where A, B, and C are vectors. In order to solve it, you square both sides, which gives a quartic equation that can be solved analytically (it's known how to solve up to quartics analytically. Something with degree 5 or higher isn't known (or might not be possible, I forget which)).
But there are lots of motions that can't be simulated well with a quadratic. Springs and viscous or turbulent drag, and lots of others. There might be some tricks I'm unaware of (I played with taking an arbitrary equation of motion, bounding it's first zero, and fitting a quadratic to the motion just during that window, for instance), but I realized that getting it working would probably be on par with a PhD thesis, which is more work than I wanted to do. Plus if I have to use iterative methods to find the time of impact, I basically am reinventing the wheel with existing methods for swept collision detection (I think there's an algorithm called conservative advancement which does this, and is employed in most physics engines).
Heh, that was probably a more long winded explanation than anyone wanted. To sum: physics simulations are hard!