03

这一节算是对第二节的补充应用
我们首先来回顾一段代码:

float d= length(@P);
d *= ch('v_scale');
d += @Time;
@P.y = sin(d);

我们将创建一个grid,然后连上一个subdivide节点让grid获得更多的细分,以便于后面表现的更光滑,也能展示出更多的细节。之后,连上我们的pointWarngle节点,将上述代码写进去,调整ui,拉动时间轴,ok!平面呈现了向中心式波浪的动画。
以上代码的波形动画只是在平面上是正常效果,因为对于该平面,只是对每个点在y轴进行改变。而对于复杂模型的表面要呈现这种波动的话,就不太一样,需要让点沿着法线方向移动。实际上对于grid的y轴方向移动,也是该点的法线方向,那么我们可以对@P稍稍改动。
对了,值得提醒的是,wrangle节点不会自动更新@N法线信息,需要勾选节点内第二个面板的“update normals if displaced”,或者再wrangle节点下再连一个normal节点

@P+=@N;
或者加上滑块
@P +=@N * ch('dilate;');

此时我们如果把gird换成复杂模型,就会感觉,scale的改变像是对于模型的拉伸,而dilate则像对模型全身进行膨胀,或者像加了一个peak节点。现在我们把参数控制改成三角函数控制试试:

float d= length(@P);
d *= ch('v_scale');
d += @Time;
@P.y = @N *sin(d);

也可以加一个参数滑块控制波形高度,也就是振幅,是sin函数的最大值

@P += @N *sin(d) * ch('wave_height');

那么模型就会呈现全身的波形膨胀,不过有时候膨胀或内缩过头,也太丑了。
好吧,其实这个效果并不是很好看,我们赶紧让三角函数一边去吧,回到我们的grid,继续研究形状变化。
现在,假如我们只是想在一定范围内取值,或者只想吧一些变量的值给予一些限制,超出限制范围的值(阈值)都会变成我们要求的值,就像opencv中的inRange函数,那么我们在vex里则可以使用clamp函数

clamp
float d =length(@P);
@P.y = clamp(d,0,3);
//当d值是0~3时,值不变,如果d<0,则d变为0,如果d>3,d变为3

当然,我们上节所说的fit函数也可以用于这里

float d=length(@P);
@P.y = fit(d,1,2,1,2);//把范围限制到1~2内
@P.y = fit(d,1,2,0,10); //然后把1-2内的值映射到0-10

还有一些其他用法:

float d =length(@P);
d =fit(d,1,3,1,0);
//filp and clamp the range 范围反转映射,1-3变为1-0
或者
d=clamp(d,0.5,1);

或者,把所有参数都变成滑块调节:

float d=length(@P);
float inmin = ch('fit_in_min');
float inmax = ch('fit_in_max');
float outmin = ch('fit_out_min');
float outmax = ch('fit_inout_max');
d=fit(d, inmin, inmax, outmin, outmax);
@P.y = d;

好了好了这节课就是个补充,想改想调看官自己试吧,我们赶紧进入下一个环节把。