Houdini學(xué)習(xí)筆記025_Trihexagonal編織
最近貌似和編織杠上了,哈哈……今天我們來編個(gè)豬頭。和前面不同的是,這次我們換一種編織方式,如下圖所示——

這種編織圖案叫做Trihexagonal Tiling,是由六邊形和三角形組成的。制作過程部分參考了島國(guó)小哥Horikawa的教程(b站網(wǎng)址點(diǎn)這里),獲得基本型的過程我進(jìn)行了簡(jiǎn)化。

首先,我們需要有一個(gè)三角面構(gòu)成的網(wǎng)格模型。直接用Houdini中的豬頭pighead節(jié)點(diǎn),類型選擇easy,取消勾選Add Shader。然后用remesh節(jié)點(diǎn)進(jìn)行三角化,Target Size默認(rèn)為0.2。

接著添加divide節(jié)點(diǎn),勾選Compute Dual選項(xiàng),得到多邊形面。

下一步我直接用了一個(gè)polybevel節(jié)點(diǎn),將Stop Loops改為Individually。只要倒角的Distance足夠大,就可以直接獲得Trihexagonal結(jié)構(gòu)。島國(guó)小哥這里直接就上VEX了,技術(shù)可贊,精神可嘉。

到這里之后,我們?cè)趺传@得編織結(jié)構(gòu)呢?其實(shí)只需要對(duì)于每個(gè)三角形,將一條邊上的兩個(gè)點(diǎn)一個(gè)往上移,一個(gè)往下移,得到新的線就可以了。算法就是這么簡(jiǎn)單直白。當(dāng)然,這里的上和下指的是法線方向。

在使用VEX之前,我們還要對(duì)模型進(jìn)行一些處理。先用fuse節(jié)點(diǎn)焊接所有的點(diǎn),然后用delete節(jié)點(diǎn)刪除多邊形面。刪除的方式選擇Delete by Range,這個(gè)范圍就是倒角之前的面(primitive)的數(shù)量。我們可以預(yù)先定義一個(gè)detail屬性將其儲(chǔ)存起來。

比如用Attribute Create節(jié)點(diǎn)在divide后創(chuàng)建一個(gè)detail屬性,名稱取為number,Value設(shè)為@numprim。數(shù)值類型為Integer。

之后刪除時(shí)用detail函數(shù)獲取范圍值即可,寫法為:
detail("../number/", "number", 0) - 1

下面終于到了今天的VEX時(shí)刻——
由于是對(duì)每個(gè)面上的點(diǎn)進(jìn)行操作,使用的是Primitive Wrangle節(jié)點(diǎn),即Run Over方式改為Primitives。每個(gè)primitive其實(shí)就是一個(gè)三角形,用primpoints函數(shù)獲取一個(gè)點(diǎn)編號(hào)的數(shù)組,寫法如下:
i[ ]@pts = primpoints(0, @primnum);
i[ ]表示整數(shù)型數(shù)組,pts是屬性名稱,這里創(chuàng)建屬性只是為了方便在Geometry Spreadsheet窗口中查看。比如0號(hào)面的pts為[2,1,0]。

有了每個(gè)面的點(diǎn)編號(hào)之后,就可以獲取其坐標(biāo)和法線了。是不是很熟悉?和前面兩篇筆記是相同的套路。雖然每個(gè)面上只有三個(gè)點(diǎn),但還是可以用for循環(huán)語句。一共循環(huán)三次,i的值分別為0、1、2。每次循環(huán)我們要獲取當(dāng)前點(diǎn)和下一個(gè)點(diǎn)的信息,所以得知道這兩個(gè)點(diǎn)的編號(hào)。
注意每個(gè)primitive中三個(gè)點(diǎn)的編號(hào)是不一樣的,需要用pts[i]的方式來獲取。比如當(dāng)i=0時(shí),獲取pts[1]和pts[2]的點(diǎn)編號(hào)。而當(dāng)i=2時(shí),則要獲取pts[2]和pts[0]的點(diǎn)編號(hào)。這里分別定義兩個(gè)變量pt1和pt2,分別賦值為pts[i]和pts[(i+1)%3]。%是求余符號(hào),如(2+1)%3結(jié)果就是0。還有就是訪問屬性前面不要忘了加@。

兩個(gè)點(diǎn)的坐標(biāo)用point函數(shù)獲?。?br>
vector pos1 = point(0, "P", pt1);
vector pos2 = point(0, "P", pt2);
然后是法線的獲取,記得前面先用normal節(jié)點(diǎn)添加點(diǎn)法線。對(duì)點(diǎn)坐標(biāo)進(jìn)行偏移之后(定義offset變量用于調(diào)節(jié)偏移高度),用addpoint函數(shù)創(chuàng)建點(diǎn)。

最后用addprim函數(shù)創(chuàng)建線,寫法為:
addprim(0, "polyline", npt1, npt2);
npt1和npt2分別為添加新的點(diǎn)時(shí)的返回值。
循環(huán)結(jié)束后用?removeprim(0, @primnum, 1);?語句刪除原來的網(wǎng)格模型。

后面的過程比較簡(jiǎn)單,依次用fuse、polypath、resample、polywire節(jié)點(diǎn)得到編織的線條。resample節(jié)點(diǎn)的Treat Polygon As選擇Interpolating Curves可得到平滑的曲線。

下面講一下根據(jù)編織結(jié)構(gòu)線條凹凸進(jìn)行著色的設(shè)置??梢杂?span id="s0sssss00s" class="color-pink-03">setpointattrib函數(shù)給往內(nèi)外移動(dòng)的兩組點(diǎn)分別添加不同的屬性,如col,分別賦值為1和-1。

添加color節(jié)點(diǎn),Color Type選擇Ramp from Attribute,使用col屬性進(jìn)行著色。讓向外凸起的點(diǎn)為白色,向內(nèi)凹陷的點(diǎn)為黑色。

resample之后,會(huì)看到點(diǎn)屬性的Cd值在0~1之間分布。

這時(shí)如果再添加color節(jié)點(diǎn),用Cd屬性來設(shè)置漸變色(范圍為0~1),即可得到如下圖所示的結(jié)果。

最初的輸入端可以用null節(jié)點(diǎn)添加控制參數(shù),這里我設(shè)置了remesh size、height和radius三個(gè)參數(shù),分別調(diào)節(jié)三角化的尺寸、編織偏移的高度和最后線條的粗細(xì)。

輸入其他模型后,調(diào)節(jié)這幾個(gè)參數(shù)可以得到不同的效果。


這篇筆記就寫到這里,感謝大家的閱讀,下回見~