Wow! You are stepping into a problem that is bigger than you can comprehend (no offense). This problem is the general problem of collision detection. To do this correctly and efficiently is a huge deal.
Generally, to solve this problem, you need to solve a number of very difficult problems.
First, you need a means to efficiently determine if two geometries are intersecting (i.e. colliding). There are a number of ways to do this ranging from closed-form minimum-distance formulas between primitive geometric volumes (boxes, cylinders, spheres, etc.), to optimization-based mathematical programming to determine the minimum distance or interception between meshes (set of polygons attached together making up the boundary of a 3D object, i.e. boundary representations (often called "B-Rep" for short)). The latter usually involves efficient mathematical programming algorithms from simple linear programs (e.g. Dual Simplex Method) to quadratic programs (e.g. Ellipsoid Method) to non-linear methods (e.g. general non-linear optimization methods, like LBFGS). In all cases, the methods generally operate only on convex geometries.
Second, if you deal with non-convex geometries, you need to decompose the volumes into a composite of convex geometries (i.e. Convex Decomposition). And that isn't a particularly easy task by itself. Beyond the complexity of just testing sub-meshes for being convex or not, and actually finding a split that works, there are measures involved to figure out the best split for the mesh such that collision detection on those sub-meshes is most efficient.
Third, in order to perform collision detection efficiently, you have to have methods that "cut through the crap", or, more formally, a dynamic programming method (or "divide-and-conquer", or "pruning strategies"). In the collision detection context, this usually involves Space Partitioning which is a way to compartmentalize or sort your 3D objects (or sub-meshes) according to their spatial distribution. For example, say you shoot a bullet through a scene with several characters and object in it, if you split your entire scene into a grid and categorize each object with what grid slot they are in, then you can simple test collision along all the grid slots that will be traversed by the bullet instead of testing collision with all the objects in the scene. Usually, people implement this using techniques such as Binary Space Partitioning (BSP), Kd-trees, quadtrees, octrees, Discrete Oriented Polytopes (DOP-trees), Axis-Aligned Bounding-Boxes (AABB-trees), Dynamic Vantage-Point trees (DVP-trees), etc.
Finally, to try to predict the collision point along the trajectory of a moving object (like a bullet) and possibly other moving objects (like characters, etc.), you are in even more trouble. The general "bullet-through-a-scene" type of problem is called Ray-Tracing (a term that is also used for high quality light-models, e.g., for photo-quality 3D rendering). With proper minimum-distance algorithms, it's possible to use binary search methods (or better) to find the point of collision along the trajectory (if it is a straight-line, or at least, if it is a reasonable assumption). More generally, these types of problems are solved with so-called "anytime" and "dynamic" algorithms which employ a strategy of successive approximate solutions with increasing precision and reuses previous estimates of the projected point of collision to make an educated guess to start the next iteration, and so on.
In summary, this is a huge deal and a very challenging problem. In most computer games, collision detection is simply done with simply geometric bounding volumes (boxes, spheres, cylinders, etc.) and space partitioning. But the general collision detection problem with all the possible source of complications (rapid motions, mesh-based representations, exact proximity queries, mesh deformations, large scenes, with few simplifying assumptions, etc.) is very hard and there are and have been a lot of university-level research on finding methods to do this efficiently.
Personally, I would suggest that you use software packages that have those methods implemented already (from complex to simpler methods), this site is a pretty good starting point. Many Physics Engines also include simple collision detection methods, like ODE. Several geometry packages also have collision detection included (often slower but exact methods).