I was determined to learn as much as I could before asking for help - that point has now arrived!
A summary of my setup:
- The game space has zero-gravity, so we need a substitute for table friction - the balls need to slow down, after all. This is done by damping (0.5 seems to be a reasonable emulation)
- Rail (cushion) sections are composed of static segments
- Balls have their MoI set to infinity, to suppress 2D rotation, which is an undesired effect. At this stage I am deferring the delicate topic of cue-ball spin, which is of course a 3D attribute. I think I can implement basic top-spin and back-spin by simple collision callbacks, but that's for later on.
- Because there are so few moving objects (max 22) I can run the engine with very small timesteps (eg: 1 msec). Chipmunk is really fast, even with this setting, so I don't really need to implement swept collisions.
My first real problem comes with a ball rebounding off a cushion. Balls have elasticity of 1. With cushions also having elasticity 1 I get accurate rebounds. But if I reduce rail elasticity to emulate cushion speed (e.g 0.5 = slow, say) then the rebound angles are affected, quite a lot in fact. (I now understand why this so, see PS below)
Is there another way to implement my cushion speed setting without affecting rebound angles?
Or do I need to just bite the bullet and put in a collision callback to reduce the velocity myself?
PS: I have found Scott's explanation of how elasticity affects rebound, which is explained here