def quaternion_slerp()

in utilities/misc.py [0:0]


def quaternion_slerp(quat0, quat1, fraction, spin=0, shortestpath=True): 
  EPS = np.finfo(float).eps * 4.0
  q0 = np.asarray(quat0) / np.linalg.norm(quat0)
  q1 = np.asarray(quat1) / np.linalg.norm(quat1)
  if fraction == 0.0: 
    return q0 
  elif fraction == 1.0: 
    return q1 
  d = np.dot(q0, q1) 
  if abs(abs(d) - 1.0) < EPS: 
    return q0 
  if shortestpath and d < 0.0: 
    # invert rotation 
    d = -d 
    q1 *= -1.0 
  angle = math.acos(d) + spin * math.pi 
  if abs(angle) < EPS: 
    return q0 
  isin = 1.0 / math.sin(angle) 
  q0 *= math.sin((1.0 - fraction) * angle) * isin 
  q1 *= math.sin(fraction * angle) * isin 
  q0 += q1 
  return q0