import Blender from Blender import NMesh from math import pow def Bezier3(p1,p2,p3,mu): #_________________________________________ #Three control point Bezier interpolation #Parameters: p1 to p3- 3 point tuple [x,y,z] #mu ranges from 0 to 1 (start to end of curve) #_________________________________________ p = [0,0,0] mu2 = mu * mu mum1 = 1 - mu mum12 = mum1 * mum1 for z in range(3): p[z] = p1[z] * mum12 + 2 * p2[z] * mum1 * mu + p3[z] * mu2 return(p); def Bezier4(p1,p2,p3,p4,mu): #_________________________________________ #Four control point Bezier interpolation #Parameters: p1 to p4- 3 point tuple [x,y,z] #mu ranges from 0 to 1 (start to end of curve) #_________________________________________ p = [0,0,0] mum1 = 1 - mu mum13 = mum1 * mum1 * mum1 mu3 = mu * mu * mu for z in range(3): p[z] = mum13*p1[z] + 3*mu*mum1*mum1*p2[z] + 3*mu*mu*mum1*p3[z] + mu3*p4[z] return(p) def Bezier(p,mu): #_________________________________________ #General Bezier curve #Parameters: p array of points ( etc [[x1,y1,z1],[x2,y2,z2],...] ) #mu ranges from 0 to 1 (start to end of curve) #IMPORTANT, the last point is not computed #_________________________________________ b = [0,0,0] n = len(p) muk = 1 munk = pow(1-mu,n) for k in range(n): nn = n kn = k nkn = n - k blend = muk * munk muk *= mu munk /= (1-mu) while nn >= 1: blend *= nn nn -=1 if kn > 1: blend /= float(kn) kn-=1 if nkn > 1: blend /= float(nkn) nkn-=1 for z in range(3): b[z] += p[k][z] * blend return(b) me = NMesh.GetRaw() verts = [[8,-1,-20],[-9,2,8],[10,36,-3],[8,8,8],[10,4,-10],[0,0,0],[10,10,2]] points = 300 for y in range(points): #vertex = Bezier3(verts[1],verts[2],verts[3], float(y)/s) #vertex = Bezier4(verts[1],verts[2],verts[3],verts[4], float(y)/s) vertex = Bezier(verts,float(y)/s) vert = NMesh.Vert(vertex[0],vertex[1],vertex[2]) me.verts.append(vert) NMesh.PutRaw(me)