B - spline surfaces

x(u,v) = (({{(Subscript[N, 0]^nu)(u), ..., (Subscript[N, nu+llu]^nu)(u)}}))  (({{(Subscript[d, 11]), ..., (Subscript[d, 1,llv+nv])}, {⋮, □, ⋮}, {(Subscript[d, llu+nu,1]), ..., (Subscript[d, llu+nu,llv+nv])}}))(({{(Subscript[N, 0]^nv)(v)}, {⋮}, {(Subscript[N, llv+nv]^nv)(v)}}))

	D: (({{□, v⟶}, {↓u, □}}))

nu=3;  (*u-degree *)
nv=3;  (*v-degree*)
llu=3;(* number of u-domain intervals *)
llv=5;(* number of v-domain intervals *)
(*u,v- knot sequences: *)

knotu = Join[Table[0,{i,0,nu}],Table[i/llu,{i,1,llu-1}],Table[1,{i,0,nu}]]//N
knotv = Join[Table[0,{i,0,nv}],Table[i/llv,{i,1,llv-1}],Table[1,{i,0,nv}]]//N

(*B-spline control grid: *)
dd=Table[{Sqrt[i]*Cos[j],Sqrt[i]*Sin[j],.5Sqrt[(j^2+i^2)]},{i,1,nu+llu},{j,1,nv+llv}]//N;

netplot=Graphics3D[{PointSize[Medium],Red,Map[Point,dd],Gray,Line[dd],Line[Transpose[dd]]}];
surfplot=Graphics3D[BSplineSurface[dd,SplineKnots->{knotu,knotv},SplineDegree-> {nu,nv}]];

Show[{surfplot,netplot},Boxed->False];

Isoparametric curve moving on a surface

Column j of dd is given by dd[[j]]. It has nu + llu elements.
We need dd[[i]] evaluated at the moving value v. All those values (points) are stored in the array cc, which has nu + llu elements. Its variable is u.

cv=Table[{0,0,0},{i,1,nu+llu}];

Manipulate[
Do[cv[[i]]=Sum[BSplineBasis[{nv,knotv},j-1,v]*dd[[i,j]],{j,1,nv+llv}],{i,1,nu+llu}];

points=Graphics3D[{Black,PointSize[0.025],Point[cv]}];
cvplot=Graphics3D[Line[cv]];

curve= Graphics3D[{Green,Thick,BSplineCurve[cv,SplineDegree->nu,SplineKnots->knotu]}];

Show[surfplot,points,curve,cvplot,netplot,Boxed->False],
{v,0,1}]

Comb moving on a surface

cv=Table[{0,0,0},{i,1,nu+llu}];

Manipulate[
Do[cv[[i]]=Sum[BSplineBasis[{nv,knotv},j-1,v]*dd[[i,j]],{j,1,nv+llv}],{i,1,nu+llu}];

isov[u_]:=Sum[BSplineBasis[{nu,knotu},i-1,u]*cv[[i]],{i,1,nu+llu}];

points=Graphics3D[{Black,PointSize[0.025],Point[cv]}];
cvplot=Graphics3D[Line[cv]];

curve= Graphics3D[{Green,Thick,BSplineCurve[cv,SplineDegree->nu,SplineKnots->knotu]}];

Show[surfplot,points,curve,cvplot,netplot,Boxed->False],
{v,0,1}]