Physics engine does not conserve momentum on tiny objects

I’ve recently realized that the default 1 unit == 1 meter scale does not fit my large-scale space combat game very well, and decided to attempt to rescale everything before proceeding further. However, Unity’s physics engine does not seem to approve of such tiny objects colliding.

My test case is a pair of spheres with radius = 0.0025, one stationary and the other moving toward it at 0.02 units/second. At first, I could not get them to collide properly at all, but decreasing the minimum penetration in the physics settings seems to have fixed that. Now they do collide, but both completely stop moving very soon after colliding, which looks weird and unnatural.

Is there some other setting I’m missing, or am I doing planets entirely wrong?

I suspect your objects are going to bed too early: rigidbodies have a min velocity (default 0.14) below which they go sleep - velocity and angularVelocity are set to zero and the physics engine forgets about them until something awake the rigidbodies (collisions, forces applied etc.)

Since your objects got too small, the sleeping threshold became too high - you should lower rigidbody.sleepVelocity and rigidbody.sleepAngularVelocity to something well below the 0.02 velocity prior to collision.

But too small values in a physics engine may not be a good idea: many physics calculations are solved by numeric techniques, which have an intrinsic error margin - when the values are too small, they may get dangerously close to this error margin and produce weird and/or unstable results. Based only in my engineer feeling, I usually avoid using values lower than 0.01 for things like mass, velocity, forces etc. - the numeric error margins and the limited float precision (about 7 digits) may cause severe errors during internal calculations.

Due to these reasons, I think it would be better to increase the scale - too huge objects seem to produce less headaches than too small ones.