public static void interpolate(float u, float v, List<List<Vector4f>> controlPoints, List<Float>[] knots,
            int basisUFunctionDegree, int basisVFunctionDegree, Vector3f store) {
        store.set(Vector3f.ZERO);
        float delimiter = 0;
        int vControlPointsAmount = controlPoints.size();
        int uControlPointsAmount = controlPoints.get(0).size();
        for (int i = 0; i < vControlPointsAmount; ++i) {
            for (int j = 0; j < uControlPointsAmount; ++j) {
                Vector4f controlPoint = controlPoints.get(i).get(j);
                float val = controlPoint.w
                        * CurveAndSurfaceMath.computeBaseFunctionValue(i, basisVFunctionDegree, v, knots[1])
                        * CurveAndSurfaceMath.computeBaseFunctionValue(j, basisUFunctionDegree, u, knots[0]);
                store.addLocal(controlPoint.x * val, controlPoint.y * val, controlPoint.z * val);
                delimiter += val;
            }
        }
        store.divideLocal(delimiter);
    }
This method interpolates the data for the nurbs surface.

@param u   the u value
@param v   the v value
@param controlPoints
           the nurbs' control points
@param knots
           the nurbs' knots
@param basisUFunctionDegree
           the degree of basis U function
@param basisVFunctionDegree
           the degree of basis V function
@param store
           the resulting point in 3D space
jme3-core/src/main/java/com/jme3/math/CurveAndSurfaceMath.java