Many application use angle-based tangents instead of proper weighted tangents with bezier interpolation. Maya can support weighted tangents and you’ll notice that although they require more performance to evaluate it is much, much more flexible.

Maya without weighted tangents & other software such as Unity3, apparently facefx and I think also Motion Builder use radians to define in and outgoing tangents. They are interpolated using hermit curves, which – if you Google them – are explained in a very confusing mathematical way.

So here’s a python function taking two key objects of type {‘time'<float>: time in arbitrary time unit (I use seconds), ‘value'<float>: value at this time, ‘inAngleRad'<float>: radians of incoming tangent, ‘outAngleRad'<float>: radians of outgoing tangent

def __inteprolateCubicHermiteSpline(self, key0, key1, worldTime): # http://en.wikipedia.org/wiki/Cubic_Hermite_spline # duration = key1.time - key0.time parameter = (worldTime - key0.time) / duration p0 = key0.value m0 = (p0 + sin(key0.outAngleRad)) p1 = key1.value m1 = (p1 + sin(key1.inAngleRad)) # reusable time powers tt = parameter * parameter ttt = parameter * tt ttt2 = ttt * 2 tt3 = tt * 3 # Hermite basis functions h00t = ttt2 - tt3 + 1 h10t = ttt - tt*2 + parameter h01t = -ttt2 + tt3 h11t = ttt - tt return h00t * p0 + h10t * duration * m0 + h01t * p1 + h11t * duration * m1