Houdini JoyOfVex 教程06

06

Point wrangle vs prim wrangle(point wrangle節點與prim wrangle節點)
將顏色先變爲全黑,然後讓R紅色值與點距離關聯:

float d = length(@P);
d *= ch('scale');
@Cd = 0;
@Cd.r = sin(d);

在wrangle節點的Run Over下拉菜單中,我們將Points改爲Primitives:
你能看到平面上的顏色邊緣顯得更銳利了,就像8bit像素遊戲一樣的風格。同時,你也能注意到,@Cd屬性從spreadsheet面板上消失了!但是不要慌!先喝杯熱水壓壓驚,點擊spreadsheet面板上的primitives按鈕,你會發現我們調皮的@Cd顏色屬性跑到這旮旯來了。

你的小腦瓜現在肯定在想,爲啥顏色看起來更銳利了呢?讓爲師來告訴你其中的奧妙吧。因爲點(points)是處於面(primitives,primitives不一定指面,但是這裏是指面)上的,一個點可被多個面共享,顏色在面與面之間會自動混合,產生漸變。但是如果我們直接給面着色的話,一個一個面就是單一的顏色,沒有那種混合的效果了。
譯者注:關於Points,Verts和Prims的區別與聯繫,詳見此教程:https://www.bilibili.com/read/cv761219

那我們把應用類型改爲面之後,我們改變@P屬性會是啥效果呢?

float d = length(@P);
d *= ch('scale');
@P.y = sin(d);

來回切換點和麪模式試試,似乎面模式下,這些代碼並不起作用。是噠,它只對點有效。你如果夠細心的話,之前看spreadsheet面板的時候就應該注意到了,@P位置屬性始終停留在Points面板下,不離不棄,不像@Cd一樣,背信棄義,說跑就跑,投奔他人麾下。所以面是不能擁有@P屬性的,代碼在其上運行自然沒啥效果。

譯者注:見http://www.sidefx.com/docs/houdini/model/attributes.html的COMMON ATTRIBUTES下的列表。有些屬性只能在某一個或兩個層級上使用,比如這裏P只能存在於point層級上,uv只能存在於vertex或者point上,primitive上是不行的。

等等…看到這你可能已經想到了,爲啥之前@ptnum和@Time這些屬性能用呢?它們也沒寫在Points面板下面啊…這是因爲它們是僞屬性(pseudo-attributes)。Vex有一些像這樣的只讀(read-only)屬性。

譯者注:這段感覺作者寫的有點迷- -…你只要知道houdini中有points,vertices,primitives,detail這4個不同層級,每個層級都能擁有自己的屬性就行了。它們都能在spreadsheet面板上查看。

How to know about attributes like ptnum, P, N numpt etc(從哪得知這些屬性呢)

有個簡單的查找方法,你可以新建一個vop節點,點進去看看。哇,是不是P, V, Cd, N, ptnum等等屬性都在這裏,是噠,這些都是houdini中的常用屬性,這些屬性有其具體的意義,比如Cd就代表顏色值,會體現在模型顏色上。具體的你也可以打開幫助文檔自己查。

譯者注:VOP就是Vex OPerations,VEX編輯模組。

Other modes on a wrangle, vertex and detail(wrangle節點Run Over下的其它層級,vertex和detail)
類似primitives層級,vertex頂點層級就是讓代碼作用在每個頂點上。vertex模式基本只用在uvs上,很少用在其他地方。
那麼detail層級是個啥玩意呢?簡單來說,它意味着“只運行一次”(‘run once’)。在很多情況下這是很方便的,比如說你要計算一個物體的邊界框(bounding box),或者在某處設置一個文字變量,你就可以使用這種模式。後面章節我們還會介紹到這貨。

你也可以把屬性設置在這個detail下,點擊spreadsheet面板的detail按鈕來查看這些數據。

譯者注:還記得我們第一章提過vex是SIMD的嗎,它支持多線程和並行運算。簡單來說,你在點層級寫下代碼,實際上是在所有點上同時執行你的代碼,這也是vex語言速度快的重要原因之一。當然,像@ptnum這些屬性,在第一個點上它的值就被識別爲0,第二個上面就是1,第三個是2,也就是spreadsheet面板上每個點擁有的單獨的屬性值。所以你的代碼是跑了好多遍的(有多少個點就執行多少次)。vertex和prim層級同理。而detail層級上代碼只執行一次。

Moving beyond P N Cd ptnum(不止是P,N,Cd,ptnum,讓我們自定義屬性)

我們目前寫的所有demo最終都是改變位置或顏色的值來產生視覺效果。如果你只是想把一些數據給存儲起來呢?比如你可能想存儲每個點到原點的距離,然後等會在另一個wrangle節點用到它?
譯者注:還記得我們第一章提到屬性和變量的區別嗎?屬性的好處是數據一直存在着,能被你接下來的操作調用。所以我們可以用屬性來存東西。

理所當然地,你可以創造你自己的屬性,只要在它前面加上@符號修飾即可:

float d = length(@P);
@mydistance = d;

事實上,我們基本不像這樣使用局部變量來過渡,因爲你完全可以直接給你的屬性賦值並且讀取它啊:

@d = length(@P);
@d *= ch('scale');
@Cd = 0;
@Cd.r = sin(@d);

譯者注:實際上,自定義屬性和定義變量一樣,要在名字前加數據類型的,不加就是默認float類型。 比如string @words[],或者i@myinteger(一般用這種寫法,這個i代表int)

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