Вот реализация сферической линейной интерполяции или slerp, предложенная в этом ответе :
import numpy as np
import matplotlib.pylab as plt
def slerp(p1, p2, t):
omega = np.arccos( p1.dot(p2) )
sin_omega = np.sin(omega)
t = t[:, np.newaxis]
return ( np.sin( (1-t)*omega )*p1 + np.sin( t*omega )*p2 )/sin_omega
p1 = np.array([1, 0, 0])
p2 = np.array([0, 1, 0])
t = np.linspace(0, 1, 30)
arc = slerp(p1, p2, t)
plt.plot( arc[:, 0], arc[:, 1] );
plt.axis('square');
, который дает в 2D: