def air3D_continuous_dynamics_from_discrete(f_discrete, x_t, u_t, d_t, dt=0.1):
    """Starting from discrete dynamics f_dis(x_t, u_t) = x_t+1, compute continuous dynamics f_cont(x_t, u_t) = \dot{x} using
    an euler approximation:

    f_cont(x_t, u_t) = \dot{x} \approx \frac{x_t+1 - x_t}{dt} = \frac{f_dis(x_t, u_t) - x_t}{dt}
    
    :params:
        f_dis: discrete dynamics function f_dis(x_t, u_t)
        x_t: state vector np.ndarray (meta_batch_size, N, 3)
        u_t: control vector np.ndarray (N_u, N_d)
        dt: time step
    
    :returns:
        x_dot: state vector np.ndarray (meta_batch_size, N, 3)
    """
    x_t_plus_1 = f_discrete(x_t, u_t, d_t)
    x_dot = (x_t_plus_1 - x_t[:, :, None, None, :]) / dt
    return x_dot