Houdini學(xué)習(xí)筆記027_VEX和梯度

今天我們來學(xué)習(xí)下梯度的用法。梯度屬于一個比較寬泛的概念,本質(zhì)上是數(shù)值按照某種趨勢變化的過程。比如高度梯度、顏色梯度、密度梯度等。這里我們用最簡單的高度梯度為例進(jìn)行講解。

VEX代碼如下——

首先,給grid對象添加mountain節(jié)點,調(diào)節(jié)Height和Element Size參數(shù)得到起伏。

用Attribute Wrangle節(jié)點為其添加梯度屬性,VEX寫法很簡單:@grad = @P.y;
(可在Geometry Spreadsheet窗口中查看點屬性)

如果想在視圖中顯示,可用measure節(jié)點進(jìn)行查看。選擇measure節(jié)點,Measure方式選擇Gradient,Source Attribute輸入grad,在視圖中按【Enter】鍵查看。

下面我們這樣操作,對于平面上的每個點,找到其相鄰點并比較grad屬性大小(這里其實就是P.y)。找到grad最小的那個鄰點,并與之連線。如果周圍點的grad屬性都比中心點大,則不連線。使用的是Point Wrangle節(jié)點,首先用neighbours函數(shù)獲取相鄰點的編號,返回值用整型數(shù)組pts[ ]接收。
int pts[] = neighbours(0, @ptnum);

比較所有鄰點的grad屬性,找到最小值。這里可使用for循環(huán),寫法如下:
for(int i = 0; i < len(pts); i++){
}
比較大小需要有一個參照值,直接用當(dāng)前點的grad值作為初始最小值:
float mingrad = @grad;
鄰點的grad屬性值則可用point函數(shù)獲取:
float val = point(0, "grad", pts[i]);
如果鄰點的grad屬性小于當(dāng)前點,則取代當(dāng)前的最小grad值。使用的是if函數(shù),VEX代碼如下:

同時我們要獲得grad值最小點的編號,可以先定義
int num = @ptnum;
找到滿足條件的鄰點后,再用pts[i](鄰點編號)取代num的值:
num = pts[i];、
最后對當(dāng)前點和滿足條件的鄰點進(jìn)行連線,因為有些點本身就是局部最低點(grad值局部最?。瑳]有滿足條件的鄰點,所以不必進(jìn)行連線。如果有滿足條件的鄰點,那么num的值肯定和初始的@ptnum不同,因此可作為if語句的判斷條件:
if(num != @ptnum){
????addprim(0,"polyline",num,@ptnum);
}
最后移除原來的grid面,VEX代碼為:
removeprim(0,@primnum,1);
最終得到如下圖所示的結(jié)果——

后面的顏色添加可以用grad屬性來著色,Color Type選擇Ramp from Attribute即可。Range范圍即從grad的最小值到最大值。

你也可以將梯度設(shè)為其他的值,如
@grad =?@P.x + @P.y + @P.z;
結(jié)果如下所示——

今日分享到此為止,感謝閱讀,下回見~