Houdini JoyOfVex 教程03

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;

好了好了這節課就是個補充,想改想調看官自己試吧,我們趕緊進入下一個環節把。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章