Thanks to Javier Toledo for the initial script. I have added the side_mult_error multiplier and few other things.
Polyframe the @tangentu, correct @up and gen @side
//create perpendicular SIDE v@up = {0,1,0}; v@side = cross(v@up, v@tangentu); //correct the UP v@up = cross(v@tangentu, v@side); v@N = v@tangentu;
Add Curvature and then Smooth
int prevId = clamp(@ptnum-1,0,@numpt); int nextId = clamp(@ptnum+1,0,@numpt); vector prevPos = point(0,"P",prevId); vector nextPos = point(0,"P",nextId); vector prevSide = point(0,"side",prevId); vector nextSide = point(0,"side",nextId); float side_mult_error = chf("side_mult_error") * 0.001; vector prevDisp = prevPos + prevSide * side_mult_error; vector nextDisp = nextPos + nextSide * side_mult_error; float dist = length(prevPos - nextPos); float dispDist = length(prevDisp - nextDisp); //ratio by distances f@ratio = (dispDist/dist) - 1; f@ratio *= chf("curvature_mult") * 10; f@ratio /= side_mult_error; f@ratio = clamp(f@ratio, -chf("curvature_clamp"), chf("curvature_clamp")); //rotate matrix matrix3 rot = ident(); rotate(rot, f@ratio, v@tangentu); //apply v@side *= rot; v@up *= rot;