Houdini學(xué)習(xí)筆記019_開始入坑VEX
學(xué)習(xí)Houdini的第七七四十九天,我決定開始VEX的學(xué)習(xí)。
什么是VEX?
VEX是Houdini內(nèi)置的一種高效的表達(dá)式語言,有點類似于C語言。但VEX語言是一種更小的、更具有針對性的語言,僅用于Houdini中。
為什么要學(xué)VEX?
學(xué)習(xí)Houdini并不是非要學(xué)VEX不可。但是學(xué)會VEX后,你可以將Houdini的功能發(fā)揮到極致。
個人認(rèn)為,學(xué)習(xí)VEX至少可帶來以下三個方面的幫助:
更深層次地理解Houdini節(jié)點操作的底層邏輯;
優(yōu)化項目進程,減少走彎路,提高工作效率;
自定義某些軟件中沒有提供的節(jié)點功能。
比如有時候需要多個節(jié)點配合才能實現(xiàn)的功能,一個VEX節(jié)點就搞定了;又或者在沒有思路的時候,VEX往往能提供額外的解決方案。

零基礎(chǔ)學(xué)VEX難不難?
VEX相當(dāng)于一門簡化的編程語言,需要會基本的數(shù)學(xué)運算和邏輯思維。學(xué)會VEX很容易,但想要用得好還得訓(xùn)練自己解決問題的思路。比如現(xiàn)在讓你把樹上的蘋果摘下來,有些人會找一根長竹竿去打,有些人會找梯子上樹,還有些人干脆直接把樹砍了。至于哪種方法簡單高效,因個人掌握的知識量和項目需求而異。
到底難不難呢?套用一句廢話:難者不會,會者不難。
這里我推薦b站上兩個VEX基礎(chǔ)的教程,你自己也可以搜到。一個是島國小哥Junichiro Horikawa的“VEX for Alogorithmic Design”;另一個是Entagma的“VEX101系列教程”。當(dāng)然,你愿意的話也可以跟我的Houdini學(xué)習(xí)筆記系列。
下面開始具體內(nèi)容的學(xué)習(xí)——
VEX代碼編寫相關(guān)的節(jié)點名稱中一般都有“wrangle”這個詞,搜索時可以看到Attribute Wrangle等節(jié)點。

一般情況下,我們會對幾何對象的點進行操作。Run Over默認(rèn)選擇的就是Points,實際上Point Wrangle、Primitive Wrangle、Vertex Wrangle等幾個節(jié)點都和Attribute Wrangle節(jié)點一樣,只是Run Over的方式不同。

VEXpression就是用來輸入代碼語言的,和代碼相關(guān)的基礎(chǔ)知識無非就變量、數(shù)據(jù)類型、函數(shù)、條件語句、循環(huán)語句等等。用這些基礎(chǔ)語言來實現(xiàn)某種特殊的功能,就是我們的最終目的。舉個簡單的例子,比如讓一個平面移動到高度為6的地方,只需要輸入“@P.y = 6;”即可。

這里有兩點需要注意:
VEX中調(diào)用屬性用@符號,@P即坐標(biāo)屬性;
一段語句結(jié)束后要加分號“;”,否則會報錯。
@P.y = 6的意思就是每個點的y坐標(biāo)都變?yōu)?,注意這里是多線程的操作模式,也就是這個語句對每個點都執(zhí)行了一次。最終結(jié)果就是平面整體往上移動到高度為6的地方。
同樣的語句,如果初始對象換成球,你會發(fā)現(xiàn)球在y方向上被壓扁成了一個平面。如果要讓球只是移動而不變形,只需要在=前加個+號,變?yōu)椤?span id="s0sssss00s" class="color-blue-04">@P.y?+= 6;”。+=是縮寫,就相當(dāng)于“@P.y = @P.y + 6;”。

除了現(xiàn)有的屬性外,VEX中也能創(chuàng)建屬性(之前我們用的是Attribute Create節(jié)點)。例如輸入“@index = 1;”,意思就是給點創(chuàng)建index屬性,值為1。你可以在Geometry Spreadsheet窗口看到該屬性。

如果改成“@index?= @ptnum;”的話,就是index直接調(diào)用點的編號來給其賦值。

通常在創(chuàng)建屬性時,會定義屬性的數(shù)據(jù)類型,一般是在@前面加上特定的字母或數(shù)字來表示。下面是不同數(shù)據(jù)類型對應(yīng)的字母或數(shù)字,當(dāng)前面沒有加任何內(nèi)容內(nèi)容時,默認(rèn)為浮點型(float)數(shù)據(jù)。所以前面的“@index”就相當(dāng)于“f@index”。

如果輸入的是“i@index?= @ptnum;”,定義index屬性是整數(shù)類型,那么Geometry Spreadsheet窗口中index數(shù)值都會變成整數(shù)。

回到之前球體移動的例子,如果我要讓移動的高度不是固定的數(shù)值,而是一個可變的量,該怎么做呢?
這時候就涉及到了變量的定義,定義變量的格式為“數(shù)據(jù)類型+變量名”。如“float moveHeight = 6;”,然后讓沿y軸移動的高度值為moveHeight。

看上去好像是多此一舉,但如果我們把變量定義語句改成“float?moveHeight = chf("moveHeight");”,然后點擊下圖中箭頭所指的圖標(biāo),就會在底部創(chuàng)建一個參數(shù)控制滑塊。拖動滑塊就可以調(diào)節(jié)高度的變化值。

講了半天,我們只是實現(xiàn)了Transform節(jié)點中一個簡單的移動功能而已。沒辦法,越基礎(chǔ)的東西往往是越簡單而枯燥的。
最后,簡單提一下VEX中屬性和變量的區(qū)別。變量是當(dāng)前Wrangle節(jié)點中定義的一個用于儲存某類數(shù)據(jù)信息的名稱,只在當(dāng)前語句內(nèi)部發(fā)揮作用。而屬性會添加給節(jié)點對象本身,在后續(xù)的節(jié)點中都可以調(diào)用。
今天的筆記就寫到這里,感謝大家的閱讀,下回見~