public void SetupJointTransforms(Vector3 worldTwistAxisA, Vector3 worldTwistAxisB)
{
worldTwistAxisA.Normalize();
worldTwistAxisB.Normalize();
Vector3 worldXAxis;
Vector3.Cross(ref worldTwistAxisA, ref Toolbox.UpVector, out worldXAxis);
float length = worldXAxis.LengthSquared();
if (length < Toolbox.Epsilon)
{
Vector3.Cross(ref worldTwistAxisA, ref Toolbox.RightVector, out worldXAxis);
}
worldXAxis.Normalize();
//Complete A's basis.
Vector3 worldYAxis;
Vector3.Cross(ref worldTwistAxisA, ref worldXAxis, out worldYAxis);
basisA.rotationMatrix = connectionA.orientationMatrix;
basisA.SetWorldAxes(worldTwistAxisA, worldXAxis, worldYAxis);
//Rotate the axis to B since it could be arbitrarily rotated.
Quaternion rotation;
Toolbox.GetQuaternionBetweenNormalizedVectors(ref worldTwistAxisA, ref worldTwistAxisB, out rotation);
Vector3.Transform(ref worldXAxis, ref rotation, out worldXAxis);
basisB.rotationMatrix = connectionB.orientationMatrix;
basisB.SetWorldAxes(worldTwistAxisB, worldXAxis);
}