Houdini學(xué)習(xí)筆記010
前幾天公眾號(3D科研繪圖)后臺有人問我二硫化鉬器件的畫法,其實主要就是MoS2分子結(jié)構(gòu)的建模。在之前的3dsMax和C4D教程中我都出過(見微信公眾號),也有比較適合用來程序化建模的方法,參考C4D科研模型100例【例52】。剛好最近在學(xué)習(xí)Houdini,于是就建了個參數(shù)化的MoS2器件模型。

在設(shè)置參數(shù)之前我們先要思考,最終的模型需要怎樣調(diào)節(jié)。比如這里我希望隨著基底長和寬的變化,二硫化鉬層的大小可以隨之自動調(diào)節(jié)。另外,兩側(cè)的電極寬度也會影響到二硫化鉬分子的分布。為了簡便起見,二硫化鉬單元尺寸是固定不變的,原子和化學(xué)鍵只給了固定的值,沒有額外添加調(diào)節(jié)的參數(shù)。最終可調(diào)節(jié)的參數(shù)只有底座的長(Length)、寬(Width)、高(Height),電極占整個長度的比例(Ratio)以及模型的倒角值(Round)。

這些參數(shù)可以在一個空白(Null)節(jié)點中添加,名稱可改為“CONTROLLER”。點擊設(shè)置中的“Edit Parameter Interface”選項,打開自定義參數(shù)設(shè)置窗口。

設(shè)置分三步,①先在左邊選擇參數(shù)的數(shù)據(jù)類型,本例中均為浮點數(shù)據(jù)(Float);②點擊向右的箭頭添加到參數(shù)列表中;③最右側(cè)設(shè)置參數(shù)的名稱(Name)、標(biāo)簽(Label)以及其他信息如取值范圍(Range)等。注意標(biāo)簽只是用于顯示,調(diào)用參數(shù)時用的是參數(shù)名稱。點擊【Apply】按鈕應(yīng)用,確認(rèn)后點擊【Accept】按鈕完成設(shè)置。

在創(chuàng)建過程中,每一步都需要考慮設(shè)置的參數(shù)是怎樣影響場景中的對象的。在筆記004中我已經(jīng)介紹過怎么讓參數(shù)進(jìn)行關(guān)聯(lián),除了復(fù)制粘貼的方法,如果你對Houdini的表達(dá)式很熟悉的話,也可以直接輸入ch("../CONTROLLER/length")。這里的第一個點是返回上一級(obj),第二點是進(jìn)入現(xiàn)在的層級(geo),斜杠后面跟的是節(jié)點名稱,再后面是參數(shù)名稱。還有一點要注意的是,Size的y值對應(yīng)的是高度,z值對應(yīng)的才是寬度。

關(guān)聯(lián)之后就可以用CONTROLLER節(jié)點中的長、寬、高參數(shù)來控制box的尺寸了。這里為了讓box底面始終位于地平面上,我又加了個transorm節(jié)點,將translate的y值表示為bbox表達(dá)式。這里的bbox跟Hip hop半點關(guān)系沒有,而是bounding box的縮寫,意為邊界框。bbox("../box1",D_YMIN)就是box1模型在y方向上的坐標(biāo)最小值,這里也就是box1高度的一半(負(fù)值),往上移動的話前面別忘了加個負(fù)號。當(dāng)然,這一步你不移動也沒問題。

那我是怎樣知道bbox表達(dá)式的寫法呢?一是看教程,二是利用軟件的文本提示。比如我在輸入“bbox(”后就彈出了如下提示。開頭的float bbox (string, float)表示數(shù)據(jù)的類型,該表達(dá)式最終返回的是一個浮點數(shù)(float),括號里面需要有一個字符串(string)和一個浮點數(shù)(float)。然后下面的USAGE是具體解釋,bbox(<surface_node>, <type>)。第一個字符串是節(jié)點,也就是“../”開頭的一串;第二個浮點數(shù)是D_XMIN、DYMIN,D_ZMIN……也就是邊界框相關(guān)的數(shù)值。照著寫的過程中多思考幾遍,不難理解。如果你寫錯了,節(jié)點旁邊會出現(xiàn)紅色的警示符號,這是學(xué)習(xí)Houdini過程中很正常的現(xiàn)象。在不斷解決錯誤的過程中,你的技術(shù)才能得到實質(zhì)性的提高。

接下來是上面兩個電極的創(chuàng)建,這里只需要創(chuàng)建一個,然后往一側(cè)移動至邊緣,用mirror節(jié)點鏡像對稱即可。至于transform應(yīng)該移動多少,有中小學(xué)數(shù)學(xué)水平就可以解決,我就不再詳細(xì)列出了。注意電極的寬度(x方向)是length*ratio。merge之后添加polybevel節(jié)點整體進(jìn)行邊倒角。

稍微復(fù)雜一些的是中間二硫化鉬的創(chuàng)建,這里大致介紹下我的建模思路供大家參考。比較簡單的地方我會一筆帶過。首先從一個三角形開始,用的是circle節(jié)點,類型選擇polygon,半徑(radius)固定為0.5不變,邊數(shù)(division)為3。然后用polyextrude節(jié)點做內(nèi)部插入,inset值剛好為半徑的一半0.25,最后添加fuse節(jié)點融合。

參照【例52】的思路,我要將三個角的點往下移動,然后參照XZ平面做鏡像對稱。所以先要用group節(jié)點將現(xiàn)有的點進(jìn)行編組。這里總共只有四個點,編號為0-3,我分別設(shè)置了兩組,直接用點的編號來設(shè)置。一組是@ptnum?==?0-2,一組是@ptnum?== 3(中心),前者對應(yīng)硫(S)原子,后者對應(yīng)鉬(Mo)原子。ptnum表示點的編號,前面加@是調(diào)用的寫法。==是數(shù)學(xué)中相等的意思。

后面transform的時候只需要標(biāo)明group,就可以只影響組內(nèi)的對象。

然后是鏡像、移動、復(fù)制(參照筆記005中的石墨烯),得到類似蜂窩狀的分布。

最后整體移至中心位置時又用到了bbox表達(dá)式,只是這里的字符串應(yīng)該是copy3節(jié)點("../copy3")了。本例中我用的復(fù)制方法不是很快捷,最后移動位置時會有些偏差,這里translate的x值和z值我分別設(shè)的是-bbox("../copy3",D_XMAX)*0.5+0.125*sqrt(3)和-bbox("../copy3",D_ZMAX)*0.5+0.25,后面加的數(shù)值是基于單元尺寸的微調(diào)。

再次用fuse節(jié)點將位置相同的點融合在一起,然后就可以用copy to points節(jié)點在對應(yīng)的點位置拷貝原子小球了。雖然經(jīng)過了多次復(fù)制和融合,但最初的點的編組仍然保留了下來,所以拷貝時仍可選擇target points為group1或者group2。分別拷貝得到S原子和Mo原子。


至于化學(xué)鍵我原本是想用提取邊的方法來做,但沒搞定。所以用了個比較笨的辦法,先用add節(jié)點創(chuàng)建兩點的連線(兩點的坐標(biāo)按照前面的參數(shù)來),然后旋轉(zhuǎn)復(fù)制三個,之后鏡像、多次復(fù)制得到陣列均用前面一樣的節(jié)點。

最后,將各個部分merge合并,得到最終的模型。

調(diào)整CONTROLLER節(jié)點的參數(shù),檢查下模型的變化是否有問題,以及還有哪些地方可以優(yōu)化。

本次分享到此結(jié)束,感謝各位的閱讀,下回見~