Reducing precision errors within a skeletal hierarchy

Am I asking too much of single-precision floats?

When the root of a skeleton transformed using the following code is only 3000 units from the origin, I am seeing very noticeable errors, where the meshes all jitter and shake with respect to one another.

I reduced most of the errors in my smooth skinning by applying the large root transform after the rest of the skeleton was already computed. Is this what I should be doing for my rigid ‘skinning?’

Granted, I’m starting from rather crappy data where things are modeled in millimeters but the world space ranges in the thousands of meters.

I also have a small near clip plane, but increasing it shows that it’s not a z-fighting problem.

 
for( unsigned int i = 0; i < skin->joints.size(); ++i ) {
			RigidJoint *joint = skin->joints[i];

			Mat34 modifier;
			if( joint->parent ) {
				modifier = joint->bindmat * joint->modifier;
				joint->currentMat = joint->parent->currentMat * modifier;
			}
			else {
				modifier = joint->modifier * joint->bindmat;
				joint->currentMat = modifier;

			}

		}

Well i don’t know if it will help but always model things at the meter scale(or convert it to meter scale using double precision variables), at least if you are going to have world space range(read z-far) at thousands of meters, and z-near is close to 0.001 your going to have a z-near/far ratio of 1:1000000, it’s advisable to have a ratio around 1:1000.

The jittering thing is only natural for floats, variables will loose precision the higher the number is, so precision is the best the closer to 1.0 it is.
Now this is not really a problem but it does mean that if you are doing a lot of matrix calculations with huge numbers you are going to have a lot of precision degradation(aka jittering).
so you need to do all of your math around the origin with reasonable numbers and then translate it away