The collision type that you are doing currenlty is called “static collision detection” i.e only when they touch, do you know they are touching. Which makes sense in first person shooters or whatever.
But for a snooker, game, i would opt for “dynamic collision detection”. However, this is a little bit more complex than static, but it does provide you with a very powerful collision system…
The idea behind it is to preempt a collision by using the directional matrix of the object and ray casting forwards in that direction (across all extremeties ofcourse, not just the centre of the ball). Find out if the ray is going to collide with any other ball. If so, you can find out the distance between them. From that distance, and given the speed of the snooker ball (you have to work that one out yourself im afraid using speed = distance/time, the time is the interpolation between the current aned last frame, distance is the distance covered between the current and last frame).
Using speed = distance/time. GIven the speed, and the distance between the objects, you can find out when the objects will collide. And decrement that counter by the interpolation everytime, untill you get to 0 or around that figure and do your collision response.
A complication arrises when the two objects are moving. So you need to work out if they are going to intersect and where. Say a ball is moving at 1mph east (located at (-1, 0, 0)) and a ball is traveling north at 1mph located (0, -1, 0) then they are definetly going to collide. So you need to make adjustments as necessary.
That would be my solution. But there is another solution to the problem. And that is to find the distance between the two objects before collision, if the distance is less than a given threshold, then they have collided and you should initiate your response.
Choose whichever is more suitable to your needs.
DP