Houdini JoyOfVex 教程01

原英文系列教程地址:在這裏
文檔翻譯教程:PB_zz

01

houdini 中的 vex 語言,是一種類似於c/c++的強類型語言,執行效率高,具體幫助文檔位於houdini菜單欄help-Contents

在使用vex時,能實時看到你的模型屬性受到影響改變是很重要的。有一個快捷的方法來查看這些屬性變化,按住鍵盤上的alt+]鍵,來使視窗分爲上下兩個,然後按住alt+8鍵來使其中一個窗口變爲spreadsheet窗口。之後,點擊菜單欄上的Build,在下拉菜單中選擇Save Current Desktop,這樣就將當前視圖設置存儲爲默認視圖了。

pointWrangle(點的爭吵?哈哈哈哈)節點可以運行一個vex代碼段來修改點屬性,包括位置
可以在pointWrangle的VEXpression中編寫vex代碼並按 ctrl + enter 運行
首先讓我們來用vex實現最簡單的事情:改變模型的顏色
我們需要知道,在houdini中,@是屬性,@ptnum@numpt是變量,例如@ptnum點序號,@numpt總點數,F幀。
而現在有一個Cd, 它指的是對象的顏色屬性,N指的是法線信息,P是位置,這幾個都是屬性,使用他們的時候前面要加@
於是我們可以這麼寫

@Cd=@N;    或者 @Cd=@P; 將法線信息或位置信息賦值給物體,我們就會讓物體顏色魔幻起來

此時我們可以在pointWrangle前插入一個transform節點來變化(旋轉平移縮放)模型來觀察顏色(位置或法線信息)的變化

Attribute components(屬性成員)

這是我們的第一個簡單的代碼
其實@Cd,@P,@N都是vector,因爲數據類型相同所以他們可以互相賦值,就像c++中的char與char賦值,int給int賦值一樣,實際上,你也可以只想sub-components(子屬性),就比如用@P.x來調用位置中的x信息,就像你在c++中可以將子類賦值給父類,C#也可以這麼做,不過C#要求顯式轉換,而vex的轉換大概看不見嘞
對於子屬性的賦值我們可以這麼寫

@[email protected];  也可以  @[email protected];
除此之外,我們已經知道了Cd是顏色屬性,那麼它自然包含rgb三個子屬性,那麼我們也可以給子屬性賦值
@[email protected];  也可以使用數組形式  @Cd[0][email protected]

此時,vex會爲你做一些隱藏工作,把@P.x或@N.y的float(浮點類型)數值(比如0.2)轉換爲一個vector,來使=等號左右兩邊的數據類型對應。(隱式強制數據類型轉換)

Basic maths(基礎數學運算)

Vex是基於C語言開發的,意味着同樣可以進行一些簡單直接的數學計算。
舉個栗子,我們tab或右鍵新建一個grid(網格平面),然後連接到pointWrangle,vex代碼改成@Cd = @P.x,如果你查看spreadsheet,你會發現,模型有半面的數據都是負值,另一半則爲正值,中心線爲0(如果有點剛好在中心線上的話)。你可以試試下列代碼來改變這些值查看一下效果。

@Cd = @P.x;
@Cd = @P.x + 2;
@Cd = @P.x - 2;
@Cd = @P.x -2 * 0.3;
@Cd = (@P.x-2) * 0.3;
Assigning to components(子屬性相互賦值)

我們還可以對每個子屬性單獨進行賦值:

@Cd.x = @P.x-3 * 1.2;
@Cd.y = @P.z+2;
@Cd.z = @P.y;
第一小節裏也演示過了

如我們開頭舉的例子,@ptnum(point number) 是點的序號,模型上每一個點都有自己的序號,也就是id,並且是從0開始,我們在視圖中點擊scene view 右邊欄的display point number可以在視圖中看到每一個點的序號,並且在Geometry Spreadtree視圖中,我們可以看到每個點的屬性,當然,不僅僅能看到點的屬性

@Cd=@ptnum;

從視圖中可以看到,第一個點是黑色的,剩下的全爲白色的。因爲@Cd顏色的屬性值是從{0,0,0}到{1,1,1},R,G,B每個分量的值都是從0-1(而不是0-255),如{0.2 , 0 ,0.5}。而第一個點的@ptnum值爲0(int整數類型),自動轉換數據之後爲{0,0,0},剩下點的序號值都大於0,自動轉換之後顏色值都等於或超出{1,1,1}(可自行查看spreadsheet),可以說是相當亮眼了(原文’superwhite’),所以只有第一個點黑色,剩下的全白。
而與@ptnum經常一起用的,還有我們之前說到的,@numpt(the total number of pionts),和ptnum很像是不是?它就是模型點總數。我們很容易能想到用ptnum / numpt的用法,不過需要注意這兩個都是int型,他們在做除法運算的時候會捨棄小數,很可惜,如果是float那能做的事情就更多了。比如@Cd=@ptnum/@numpt可以得到漸變色…當然我們強大的houdini怎麼會做不到這一點呢,其實如同C++一樣,我們可以將這兩個int型轉化爲float再運算,我們的操作空間會大很多,方法是強制轉化(casting),就類似這樣

@Cd = float(@ptnum)/@numpt;

轉化的類型將被轉化的數據括起來,是不是很像c++的強制轉換?不過C++能把類型括起來變量不動,vex卻不允許,值得說明的是在@ptnum前加float即可,@numpt前不必再加來進行轉換,當然你要加也可以。因爲浮點型除以整形得到的最終結果是浮點型。

Channels(通道/UI參數)

當使用wrangle節點進行vex編程時,你發現我們之前打的代碼得到的都是一個個自動計算得到確定的值。這個交互上來講不友好啊,要是你想用滑竿之類的進行調節測試呢?大丈夫!Houdini提供了ch函數來實現這個功能。你只要在代碼中輸入ch(‘*’),(*爲你想要的參數名稱),點擊右邊那個圖標爲滑塊與加號的按鈕後,在P參數UI界面上就會出現你想要的參數控制:

@Cd = float(@ptnum)/ch('scale');

滑塊的默認值爲0~1之間,但你可以自己調整輸出超過1或小於0。
可以點開wrangle節點面板上的齒輪按鈕,在下拉菜單點擊Edit Parameter Interface來調整創建的UI,比如設置滑塊min和max值爲0和1以外的數。另外,你也可以在Edit Parameter Interface中先創建UI參數,然後用ch等函數調用。值得一提的是,這很像python中opencv的tracker滑塊,當我一次次調整數值編譯的時候,其實加個滑塊方便太多了

三角函數

當我在使用blender的時候,就一直想用三角函數實現一些騷操作,畢竟sin,cos能夠返回波形變化的數值,這在節點,特效,材質中都是能夠產生很強的表現力的,vex也不例外
這裏我們可以使用sin函數,返回-1~1之間的波形數值,變化週期爲2pi。

@Cd=sin(@ptnum);

你應該還記得之前講的@ptnum是int整形數據,他是0,1,2…這樣進行增加變化的,不帶有小數,所以這個sin變化看起來也不是那麼連續的(看視窗中平面的漸變效果)。所以我們進行以下嘰裏呱啦的各種操作變化,你可以看到不同的效果,自己思考一下。

@Cd = sin(float(@ptnum)/100);
@Cd = sin(float(@ptnum)/ch('scale'));
float foo = float(@ptnum)/ch('scale');    //這裏是定義一個局部變量foo,它的值由後面的式子得到
@Cd = sin(foo);

提醒一點,vex裏的註釋寫法有兩種,和C/C++語言一樣,一種是單行註釋//,一種是多行自由註釋/**/,註釋只是額外說明,並不參與代碼運行。

Variables(變量)

我們之前說過了,在名稱左邊由@符號修飾的是attributes(屬性),他的數據是實實在在存在於模型對象上的,你可以隨時讀取(read)它也可以向它輸入(write)數據,因爲它本來就是默認存在的。

如果你要創造或者計算一些數據,並且暫時存儲在某個東東里,你就可以使用variables(變量)了,在使用wrangle節點寫vex代碼時,你自己創建的變量只存在於當前節點中,它只是一個臨時工,只存在於wrangle這代碼編輯器裏,家裏蹲死宅一個,外面其他節點沒人認得它,毫無存在感,只有家裏人能知道它。如果你要使用一個變量,首先你要定義它的數據類型(int, float, vector等等)和名稱,然後一個=等號,右邊的式子給他賦值。如:

float foo = @P.x/ch('scale');
@Cd = sin(foo);

譯者注:關於屬性和變量。

屬性是物體本身帶有並一直存在的東西,houdini本身有許多默認的常用屬性(COMMON ATTRIBUTES,包括P,N,Cd等),你也可以自定義新屬性。屬性可在spreadsheet面板中查看。打個比方就是,一個蘋果,它的顏色,氣味,硬度等是本身就有的東西,這些是它的屬性,只要這屬性已經是設定好的,就一直客觀存在並且可以在houdini各個節點被調用(當然也可以通過Attribute Delete節點等方式刪除)。更多與屬性相關知識可以去查幫助文檔。

而變量只是你自己在wrangle節點等地方臨時設置來方便寫代碼用的而已,純粹爲你當前編程服務。你寫代碼總得讓人看懂吧,不能寫一大堆數字和符號扔那,所以才用變量這麼個東西,你可以簡單認爲就是個有名字的虛擬容器,把數據往裏丟,等下寫代碼用名字寫,讓人讀起來纔有意義能看懂,實際上計算還是用的那些數據。到了wrangle節點之外,上面和下面的節點是不認識你寫的這些變量的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章