Houdini學(xué)習(xí)筆記031_蜂窩迷宮

今天我們繼續(xù)學(xué)習(xí)迷宮的DFS生成算法,思路和上一篇基本一致。但是為了代碼的簡(jiǎn)化,上一篇我們是從一個(gè)點(diǎn)陣開(kāi)始的,找鄰點(diǎn)時(shí)使用的是nearpoints函數(shù)。但我發(fā)現(xiàn)拓展起來(lái)不太方便,所以這一篇我們換個(gè)做法,從網(wǎng)格面開(kāi)始。(可參考Horikawa的這個(gè)視頻)
使用的是筆記021中的六邊形蜂窩面,也是直接由一個(gè)point wrangle節(jié)點(diǎn)生成的。因?yàn)槊總€(gè)六邊形是單獨(dú)的,用fuse節(jié)點(diǎn)焊接起來(lái)。

這次我們從0號(hào)面開(kāi)始,過(guò)程中使用的是primitive wrangle節(jié)點(diǎn)。同樣,要用active和visited對(duì)每個(gè)面的狀態(tài)進(jìn)行標(biāo)記,并且用stack[ ]數(shù)組存儲(chǔ)走過(guò)的路徑。
在primitive wrangle節(jié)點(diǎn)(可取名為“set_group”)中輸入VEX代碼如下,基本和上一篇一樣,只是point換成了prim。如果DFS算法還沒(méi)搞清楚的請(qǐng)先看上一篇教程。

Geometry Spreadsheet窗口查看,沒(méi)有問(wèn)題。

然后開(kāi)始solver節(jié)點(diǎn)解算,節(jié)點(diǎn)內(nèi)部同樣創(chuàng)建一個(gè)primitive wrangle節(jié)點(diǎn),取名為“honeycomb_maze”。
第一步還是定義一個(gè)找鄰居(未被訪問(wèn)過(guò)的)的函數(shù),為了簡(jiǎn)短起見(jiàn),這里我就用拼音linju作為函數(shù)名了。
由于neighbours函數(shù)是找點(diǎn)的鄰居,那有沒(méi)有找面的鄰居的函數(shù)呢?打開(kāi)幫助文檔后搜索VEX Functions,輸入neighbours后,果不其然,找到一個(gè)polyneighbours函數(shù),返回的就是相鄰面的編號(hào)。

自定義函數(shù)的代碼如下(黃字是說(shuō)明性語(yǔ)句):

用代碼檢驗(yàn)下是否正確:
i[ ]@linju = linju(@primnum);
沒(méi)毛病~

進(jìn)入主函數(shù)的書(shū)寫(xiě),通過(guò)自定義函數(shù)得到當(dāng)前active面的鄰居。先討論有鄰居的情形,即
len(linju) > 0
同樣分以下幾步:
(1)隨機(jī)選取一個(gè)目標(biāo)鄰居target;
(2)當(dāng)前面的active值改為0,target面的active值改為1;
(3)target面的visited值改為1(表示到訪過(guò)了);
(4)將target面加入stack[ ]數(shù)組(記錄路徑);
(5)畫(huà)線。

結(jié)果如下,走著走著,就進(jìn)入死胡同了。這就是我們要討論的第二種情形:else{...}。

第二種情形是沒(méi)有鄰居(未被訪問(wèn)過(guò)的),即len(linju) == 0。這時(shí)候前面的stack[ ]數(shù)組就派上用場(chǎng)了,來(lái),給我挨個(gè)搜查,看誰(shuí)還有沒(méi)拜訪過(guò)的鄰居?!
找到之后將這個(gè)新的面設(shè)為active面,原來(lái)的active值改為0。

再次運(yùn)行就能遍歷所有的面了~~~

現(xiàn)在得到的線和原來(lái)的面都在一個(gè)節(jié)點(diǎn)中,為了后面便于分離(split),可以在創(chuàng)建線時(shí)單獨(dú)設(shè)置一個(gè)primitive組。也就是用addprim函數(shù)畫(huà)線時(shí)多寫(xiě)一句:
int line = addprim(0, "polyline", pt1, pt2);
setprimgroup(0, "line", line, 1);
之后添加split節(jié)點(diǎn),Group根據(jù)line來(lái)分離,就可以分別得到線和原來(lái)的蜂窩面了。

將原來(lái)的面轉(zhuǎn)為線,然后用intersection analysis節(jié)點(diǎn)求交點(diǎn),并勾選其Primitive Number參數(shù)選項(xiàng),生成屬性sourceprim。

Geometry Spreadsheet窗口查看可知,這個(gè)屬性返回的是一個(gè)數(shù)組,里面有兩個(gè)數(shù)字。第一個(gè)是生成的迷宮線的primitive編號(hào),第二個(gè)是蜂窩面得到的網(wǎng)格線的primitive編號(hào),后面我們要打通網(wǎng)格線,就要根據(jù)第二個(gè)編號(hào)來(lái)移除對(duì)應(yīng)的primitive。

最后再添加一個(gè)attribute wrangle節(jié)點(diǎn),用removeprim函數(shù)來(lái)移除迷宮線路經(jīng)過(guò)的地方。


后面的建模部分我就不講了,無(wú)非就是polyextrude之類(lèi)。今天的分享就到這里,感謝各位閱讀,下回見(jiàn)~