To simplify the separation axis theorem for convex polyhedras, you can consider only two types of possible collisions. points vs faces, and edges versus edges. all other cases are derived from those two generic cases (edge vs face, face vs face, edge versus point...).
so basically, what you have to do for each faces, find the closest point on the other polygon to that face, and see if it is back facing. That can save some time. Instead of doing the test for each points against the face, pick a point on the convex object, and using the connectivity between points, follow the edge from one point to another to find the point that would be the closest to the face. Since the object is convex, you are bound to find a minimum point towards the face on the other object. if that point is front facing the face, then no collision. This point is called a support point along the face normal. That''s also the basis for the GJK algorithm.
for edges against edges, it''s a lot more tricky. the simplest solution would be, to cross product every edges of convexA against every edges of convexB, and see if the projection of ConvexA and ConvexB along the normal defined by the cross product of the two edges overlap or not. But that''s obviously impractical.
I never tried this, but I would think finding the closest point from an edge, and taking the interconnected edges from that point, and building planes by crossing the edges together would be more practical. although, it''s still very slow.
another method tries to find the closest features on the two convex polyhedras, and caching the closest features, you can quickly test two moving convex polyhedras against each others, taking advantage of the space-time coherence (the objects won''t move much relative to each other between physics frames).
I-collide uses that method, I think, and it''s a popular way of testing two convex objects. You need to store connectivity info for each polyhedras (like a list of neighbouring points for each vertex), but that''s not a big deal.
there is a library developed by Gino Van Der Gergen, called SOLID, which implements the GJK stuff. It''s free and the source code is available.
http://www.win.tue.nl/~gino/solid/
also, for non convex polyhedras, you have a variety of methods, build octrees, a voxel map, split the non convex objects into convex parts, ...
for example
http://www.dh.aist.go.jp/~kawachi/ncmd.html
I used to have a demo of a GJK-like collison detection on convex hulls, but I seemed to have lost it.
Anyway, it should not be too hard to implement, the tricky part is to find the penetration depth (i.e. the embedded points of contacts) when the GJK fails (intersection detected), as there is no easy way to solve that case. But that''s if you allow penetrations to occur.
You would think it should be easy, as easy as when the object do not intersect, but it''s not, for some weird reason (after all, it''s like finding geometrically the point on a convex curve the closest to the origin, when the origin is inside the curve). look for enhanced GJK, which gives pointers on how to solve this.