扒一扒houdini中的(de)局部變量與vex變量

發表日(rì)期:5/19/2018 5:09:45 PM    浏覽次數:7509     

很(hěn)多初學者會被houdini中各種變量的(de)寫法搞得暈頭轉向,特别是houdini15之後對(duì)vex的(de)大量使用,很(hěn)多看(kàn)老(lǎo)教材的(de)同學發現(xiàn)局部變量不起作(zuò)用了,被弄得無所适從(cóng)。

這(zhè)裏,小(xiǎo)編就盡所能給大家(jiā)解釋一下(xià),其實這(zhè)裏是兩套系統完成同樣的(de)功能而已。

本文(wén)會部分會收錄在即将出版的(de)houdini書(shū)本中,敬請期待

1attribute create不起作(zuò)用了?

這(zhè)個(gè)是最常見的(de)舊(jiù)版本教程裏的(de)問(wèn)題。添加attribute create節點,創建自(zì)定義屬性var,使用$VAR就可以進行局部變量訪問(wèn),但(dàn)是在houdini15之後就不可以了。

這(zhè)裏最核心的(de)問(wèn)題在于舊(jiù)版本的(de)houdini默認是勾選 local variable把創建的(de)屬性轉化(huà)為(wèi)局部變量,而新版本默認是關閉的(de)。

注意

默認開(kāi)啓後,不輸入任何值,那(nà)麽局部變量就是變量的(de)大寫形式 var→$VAR。當然,你(nǐ)也可以手動輸入你(nǐ)需要的(de)局部變量名字(一般不會這(zhè)樣操作(zuò))。

轉化(huà)為(wèi)局部變量後我們在spreads中查看(kàn)

沒有(yǒu)開(kāi)啓local variable的(de)情況下(xià):隻有(yǒu)在對(duì)應層級多了var這(zhè)個(gè)屬性

開(kāi)啓了local variable的(de)情況下(xià):在detail層級還(hái)會多了一個(gè)把var轉化(huà)為(wèi)局部變量VAR的(de)過程

所以,如果大家(jiā)想按照(zhào)舊(jiù)版教程使用attribute create創建局部變量,那(nà)麽記得勾選這(zhè)個(gè)選項就行了。

2局部變量/全局變量的(de)寫法

一般是$符号+大寫字母,但(dàn)是也有(yǒu)不少特殊的(de)寫法

比如位置 $TX,$TY,$TZ,還(hái)有(yǒu)顔色是$CR,$CB,$CG,這(zhè)些特殊的(de)寫法就需要死記硬背了

除了上(shàng)面常用的(de)局部變量和(hé)全局變量外(wài)(從(cóng)幀開(kāi)始,因為(wèi)這(zhè)些變量不需要任何的(de)局部節點和(hé)屬性都(dōu)可以存在的(de),所以稱為(wèi)全局變量)

還(hái)有(yǒu)比較常用的(de)對(duì)于copy節點中的(de)局部變量

$CY 表示當前拷貝的(de)順序(第幾份)

$NCY 表示拷貝的(de)總數量

3vex變量的(de)寫法

@+變量名字(大部分不需要大寫)

當然,vex中也有(yǒu)部分比較特殊的(de)寫法(比如@Frame需要開(kāi)頭大寫,@P需要縮略大寫)

對(duì)于特殊vex變量的(de)記憶

直接創建vop(pointvop,attribute vop等都(dōu)一樣)進入內(nèi)部,找到geometryvop global節點,裏面就是常用vex變量寫法

也可以通(tōng)過添加houdini16中的(de)point_old節點,都(dōu)使用使用了vex變量(舊(jiù)版本point中使用$TX,$TY,$TZ)

4為(wèi)什麽是vex取代局部變量

1更加直接和(hé)簡潔,比如上(shàng)面定義的(de)var,不需要通(tōng)過轉化(huà)為(wèi)$VAR,可以直接使用@var進行調用

2vex電(diàn)腦運行效率更高(gāo)(速度更快)

3vex更加統一,比如之前的(de)位置 @P顔色是@Cd,如果要訪問(wèn)裏面的(de)分量通(tōng)道(dào),使用點格式,比如@P.x,@Cd.r(@Cd.x也是可以的(de))。并且vex除了在sop和(hé)shader中廣泛使用,在dop中的(de)粒子(zǐ)也是非常常用的(de),可以貫穿整個(gè)houdini,實現(xiàn)統一。

4vex除了調用變量,更多的(de)是一些表達式和(hé)函數的(de)調用,使用wrangle節點可以完成絕大部分節點的(de)功能。創建變量非常方便

在houdini中,越來(lái)越多的(de)節點除了局部變量外(wài)也支持vex變量(除了一些比較舊(jiù)的(de)節點)并且有(yǒu)很(hěn)多新的(de)節點隻支持vex變量,所以這(zhè)小(xiǎo)編建議(yì)大家(jiā)盡量使用vex變量(即使看(kàn)到舊(jiù)教材中做法,試着使用vex變量來(lái)實現(xiàn))

5是不是局部變量/全局變量就沒用了?

這(zhè)倒不是,特别是全局變量還(hái)是非常有(yǒu)用的(de)

比如$T,$FF,$HIP,$OS等代表時(shí)間(jiān),工(gōng)程文(wén)件(jiàn)路(lù)徑,節點名字,在控制紊亂變化(huà),輸出路(lù)徑中等都(dōu)非常有(yǒu)用。

某些節點的(de)局部變量比如copy中的(de)$CY和(hé)$NCY也是比較常用。

6如何創建屬性

創建屬性的(de)方法有(yǒu)非常多,這(zhè)裏主要講解最常用的(de)attributecreate和(hé)wrangle節點

attributecreate 注意四個(gè)部分

1name 名字

2class 層級

3type 數據類型

4賦值

當然,這(zhè)裏還(hái)有(yǒu)是否需要轉化(huà)為(wèi)局部變量和(hé)size就是裏面的(de)元素多少需要注意

對(duì)于wrangle中創建屬性同樣需要上(shàng)面的(de)幾個(gè)元素

run over 代表選擇層級,f表示浮點類型,@rot變量名字是rot,賦值是1.0,還(hái)有(yǒu)分号結尾

常用的(de)vex的(de)數據類型有(yǒu)

i整形

f浮點

s字符

v矢量

marix 矩陣

......

7如何把變量轉化(huà)為(wèi)局部變量/全局變量

創建全局變量

除了默認已有(yǒu)的(de)全局變量,我們可以通(tōng)過Edit/ aliases and variable 别名和(hé)變量中進行設定

在這(zhè)裏添加了一個(gè)$MYNAME局部字符變量,用來(lái)存儲我的(de)名字carldrifter

大家(jiā)還(hái)可以存儲自(zì)己常用的(de)工(gōng)程文(wén)件(jiàn)路(lù)徑或者數值等。

把已有(yǒu)的(de)屬性轉化(huà)局部變量方法

方法一 attribute create的(de)方法,勾選local vairable進行轉化(huà),注意輸入同樣的(de)名字,激活local variable,并且關閉write value 創建值(否者會覆原來(lái)的(de)值)

方法二 wrangle中轉化(huà)局部變量的(de)方法

使用函數addvariablename(輸入端口,原來(lái)名字,後來(lái)名字)

方法三 在vop中轉化(huà)成局部變量的(de)方法 add attribute節點

舊(jiù)版教程中使用add attribute節點進行輸出輸出自(zì)定義屬性,現(xiàn)在使用的(de)是bind export節點,而add attribute節點僅保留轉化(huà)為(wèi)局部變量的(de)功能。

上(shàng)一篇:深信數字有(yǒu)限公司與中科(kē)院先進技(jì)術研究院神經工(gōng)程所簽約《人(rén)體(tǐ)康複協作(zuò)機(jī)器(qì)人(rén)原理(lǐ)演示三維動畫(huà)》
下(xià)一篇:unity3d中腳本生(shēng)命周期(MonoBehaviour lifecycle)