code: def arcball_constrain_to_axis(point, axis):
      
      v = np.array(point, dtype=np.float64, copy=True)
      a = np.array(axis, dtype=np.float64, copy=True)
      v -= a * np.dot(a, v)  # on plane
      n = vector_norm(v)
      if n > _EPS:
          if v[2] < 0.0:
              np.negative(v, v)
          v /= n
          return v
      if a[2] == 1.0:
          return np.array([1.0, 0.0, 0.0])
      return unit_vector([-a[1], a[0], 0.0])
docs: Return sphere point perpendicular to axis.