Houdini學習筆記038_Menger Sponge(門格海綿)

今天分享的VEX教程是一個簡單的分形結(jié)構(gòu)——門格海綿(Menger Sponge)的制作。

制作思路很簡單,但有一個地方困擾了我半天,希望知道的朋友能解釋一下。
給定一個初始點和邊長,當?shù)螖?shù)為0時,直接在初始點位置生成一個立方體,邊長即給定的邊長。每增加一次迭代,將原來的立方體分為3×3×3(=27)份,并去除體心和每個面的面心處的小立方體(共7個),剩下20個小立方體。小立方體的邊長為之前的1/3。
所以只需要得到每次迭代后的中心點坐標,以及立方體邊長,就可以拷貝出所有的小立方體。假設初始邊長為1,迭代n次后的立方體邊長則為:(1/3)^n。

box節(jié)點的Uniform Scale參數(shù)可設置如下:
這里的iteration和size都是自定義的參數(shù),分別為迭代次數(shù)和初始的立方體邊長。
接下來的關(guān)鍵是每次迭代的點坐標求取。對于每一個點,可以將其看作坐標原點,然后從(-1,-1,-1)到(1,1,1)的空間內(nèi)分布27個點坐標。除去(0,0,0)、(1,0,0)、(-1,0,0)、(0,0,1)、(0,0,-1)、(0,1,0)、(0,-1,0)這7個坐標,剩下的位置都生成新的點。
迭代使用的是For-Loop with Feedback節(jié)點,然后用point wrangle節(jié)點來創(chuàng)建點(對應函數(shù)為addpoint)。point wrangle節(jié)點中使用的是三層嵌套for循環(huán),得到27個點坐標,使用判斷條件 abs(x)+abs(y)+abs(z) > 1 即可篩選出需要保留的坐標。然后在原來的點坐標基礎上加上新的坐標值(需要乘以相應的邊長),就得到了新的點坐標。
原本我寫的代碼是:
pos = @P + pos*size;
可總是得不到正確的結(jié)果,后來將 @P 改成了 3*@P 才成功了,總感覺有些奇怪,感興趣的朋友可以幫忙分析下。

如果將上面的判斷條件改為 sum <= 1 則可以得到互補的結(jié)果,如下圖所示——

今天的分享就到這里,感謝大家的閱讀,下回見~