1,cubic-bezier
vector start = point(0,"P",0);vector end = point(0,"P",@numpt-1);vector range_01 = fit(@ptnum,0,@numpt-1,0,1);float ix = range_01.x;float dx = end.x - start.x;float dy = end.y - start.y;vector p2 = set(start.x + dx * 0.5 , start.x + dy * 0.1, 0 );vector p3 = set(start.x + dx * 0.5 , start.x + dy * 0.9, 0 );float x= pow((1-ix),3) * start.x + 3* pow((1-ix),2) * ix * p2.x + 3*(1 - ix)* pow(ix,2) * p3.x + pow(ix,3) * end.x; float y= pow((1-ix),3) * start.y + 3* pow((1-ix),2) * ix * p2.y + 3*(1 - ix)* pow(ix,2) * p3.y + pow(ix,3) * end.y; @P.x = x;@P.y = y;
https://en.wikipedia.org/wiki/B%C3%A9zier_curve
如果将代码的0.1 和 0.9改成0.5 , 0.5 又会变成直线。
2 Houdini中的四元数.
float theta = @Time ;vector axis = set(0,1,0);float vx = axis.x * sin(theta/2);float vy = axis.y * sin(theta/2);float vz = axis.z * sin(theta/2);float s = cos(theta/2);vector v = set(vx,vy,vz);// so the q =@P = @P * s *s + cross(v*2*s , @P) + v * dot(v,@P ) - cross(cross(v,@P),v);
q = cos(theta/2) + A*sin(theta/2)
A表示旋转轴向。是个单位向量
还需要个q的共轭四元数