朱峰社區(qū)首頁 朱峰社區(qū)

搜索資源 注冊|登陸

等待

返回 展開菜單
按功能 按軟件

Houdini基礎(chǔ)

Houdini基礎(chǔ)

包含30節(jié)視頻教程

(本教程houdini技術(shù)已老請購買之后houdini更新課程)Houdini是一款功能強大的3D合成軟件,曾經(jīng)效力于300部以上經(jīng)典電影的特效制作,比如煙火,水等復(fù)雜的后期合成都少不了它。

關(guān)閉

Houdini ch的作用

關(guān)注:1967 留言:0 樓主:﹎ネ斤ネ壽 發(fā)帖時間:21年7月23日

﹎ネ斤ネ壽

普通會員

﹎ネ斤ネ壽

社區(qū)兄弟:4級

關(guān)注2654人

  • 性別

  • 年齡

    22

  • 積分

    109

  • 登陸

    1

  • 發(fā)帖

    2

  • 作品

    1

間隔線

chi,chs,chv,chf,chramp
引言

暑假到了,因為自己進的實驗室主要做的DGP(Digital Geometry Processing,數(shù)字幾何處理),借鑒自己之前通過Substance Designer入門圖像處理領(lǐng)域,通過Unity入門圖形學(xué)渲染領(lǐng)域的經(jīng)驗,打算學(xué)一下自己垂涎已久的Houdini來入門幾何處理。

順便一提,本文中所使用的Houdini版本為Houdini Apprentice 17.5.293。跟的教程是有名的湖邊小屋,手頭有余裕的朋友們可以到gumroad上面購買支持一下這位藝術(shù)家。

建議有意向閱讀此文的讀者選個有空的時候,坐在電腦前再來閱讀本文。原因其一,排版是按PC來排的,手機上不好閱讀;其二,內(nèi)容比較硬核,干貨比較多,需要坐下來慢慢讀。

腳本語言

與SD一樣,Houdini也是基于節(jié)點編程;比SD更強大的地方在于它也支持腳本編程(SD的腳本編程目前還處于非常原始的階段),并且腳本編程的威力非常強大。Houdini所使用的腳本語言有好幾種,就我目前了解到的有如下幾種:

  • 參數(shù)腳本語言(表達式):
    • HScript Expression 傳統(tǒng)的默認腳本語言,主要用來做控制參數(shù)的腳本;
    • Python HOM 新的腳本語言,比Hscript更強大,但是寫起來很啰嗦;
如圖,用戶可以在2種不同參數(shù)表達式之間切換,并且可以同時混合使用它們。
  • 泛用型腳本語言:
    • Vex 高性能的C譜系腳本語言,用來寫自定義的節(jié)點或者Shader。
    • Python HOM 似乎是全能的編程語言,比較復(fù)雜所以還有待進一步探索。
VEX 語言

由于作者目前水平所限,只能談一下自己對VEX和SOP一些粗淺的了解,有不準確或錯誤之處望讀者指正。

幾何對象的層次

Houdini中,SOP處理的是幾何對象(Object)。幾何對象的數(shù)據(jù)在SOP節(jié)點中得到處理,并在SOP網(wǎng)絡(luò)中流動。那么問題來了,應(yīng)該如何處理這些繁雜的數(shù)據(jù)?Houdini將幾何對象(Object)中的幾何數(shù)據(jù)進行了分層。理解這一部分是至關(guān)重要的。

即使讀者沒有系統(tǒng)的圖形學(xué)背景,也應(yīng)當能理解幾何體的組成部分可以拆分為點-線-面;而Houdini中的分類要更復(fù)雜一點:

如圖,幾何數(shù)據(jù)分為四層
  1. Detail 最高層級的數(shù)據(jù),對應(yīng)整個Object;
  2. Primitive 幾何對象中的組成部件,比如一個三角面片,一張NURBS曲面,或Volume;
  3. Point 幾何對象上面的一個點;
  4. Vertex 一個Point可能同時存在于多個相鄰的Primitive上,因此共享同一個Point的 多個primitive會各自存一份對Point的引用,稱為Vertex。
幾種變量類型

類似于圖書館的管理員一樣,VEX中用到的變量也是分等級的;主要分為以下幾種:

  • Attribute 屬性
  • Parameter 參數(shù)
  • variable 變量
屬性 Geometry Attribute

最重要的數(shù)據(jù)類型就數(shù)屬性了,首先,前文提到的每個幾何層級都會把屬于該層的所有對象組織成一張表,比如primitive層的會組織到一張primitive表,point層的所有點會組織成一張點列表;

隨后,每個層級我們都可以為所有屬于該層的對象們定義一些屬性,比如對于Point層,可以為每個點定義位置或者法線屬性;我覺得下圖可以很好地解釋屬性的概念。

如圖,1033到1044號對象的屬性都各自裝在自己的小匣子里面如圖 左邊Geometry Spreadsheet顯示了每個點的位置信息

認真讀的讀者肯定會意識到,那么vex代碼應(yīng)該用在哪種節(jié)點里面,來幫助我們?yōu)樗悬c定義或者修改屬性呢?Houdini有一組非常強大的節(jié)點,專門用來做這類事情;我這里介紹其中用的最多,最有代表性的Attribute Wrangle節(jié)點。""Wrangle"一詞的翻譯是"放牧",就像牛仔管理他們負責的牛群一樣,我們對各個點或者其它對象的屬性進行“放牧”。換句話說,該節(jié)點對輸入數(shù)據(jù)中每一層級(就是上一小節(jié)講到的層級概念)的所有屬性進行處理。

“wrangle”一詞非常形象,原意為放養(yǎng)牛馬等牲畜,因此有個牛仔帽作為標志

關(guān)于Atrribute的操作比較繁雜,但總結(jié)起來大致就是增刪查改四種操作;

  • 刪除屬性
    找了很久,VEX中好像沒有刪除屬性的函數(shù),不過有一個節(jié)點可以用來做這件事:Attribute Delete
  • 讀取/修改屬性
    使用已經(jīng)定義的同層級屬性的方式為:@變量名。比較特殊的情況下,Attribute Wrangle節(jié)點可能有多個輸入(從左到右,序號為0~3,沒有編程經(jīng)驗的同學(xué)注意,從0開始。热缥蚁胍玫诙䝼輸入數(shù)據(jù)的點層級位置屬性@P,那么以下3種方式都能獲取到數(shù)據(jù)。 值得注意的有2點。
    第一,SideFX官方的講座中提到,在性能上來說,使用方法(3)是最好的,應(yīng)當盡可能使用它;但(3)也是有局限的,如圖:
如圖,Attribute Wrangle節(jié)點接受2個輸入


第二,如果你使用的屬性是非浮點數(shù)類型的,比如vector型的向量,第二種方式必須記得在@之前寫上屬性數(shù)據(jù)類型的簡寫,否則編譯器會默認為浮點數(shù)。具體各種變量類型和簡寫的對應(yīng)見下圖:

前面提到的是相同層級的屬性讀取,不同層級之間的屬性讀取則可以使用point(...), prim(...), detail(...)函數(shù)完成,具體用法我就寫在下面了。

  • 增加屬性 在VEX中定義屬性的方式為:數(shù)據(jù)類型 @變量名;舉個例子,我想給所有點定義一個叫做myval的浮點數(shù)屬性,然后對這個屬性加一,那么就在Attribute Wrangle中選定要處理的層次為點,

然后在代碼編輯器中輸入  即可。值得注意的一點,在定義一個
新的屬性時,等號右邊(即我們賦予該屬性的初始值)必須是常量,也就是說只能是具體的數(shù)值, 不能包含任何函數(shù)或運算。例如下面一段代碼是有效的:

但是如果寫成這樣就會報錯:

屬性在整個節(jié)點網(wǎng)絡(luò)中,一旦你創(chuàng)建了,在人為手動刪除它之前,就是一直存在并且全局都可見的(就是任何時候,只有你想要就可以讀。。因此屬性是非常消耗空間和性能的,應(yīng)當盡可能節(jié)約使用,如果預(yù)計將來再也不需要這個屬性時,就應(yīng)當使用Attribute Delete刪除掉。

變量 Variable

那么,一些VEX代碼中的變量,如果它們只會在該節(jié)點的代碼里面用到,那么就沒有必要設(shè)置為屬性了,我們稱之為局部變量,就是它只屬于所在的這個節(jié)點,節(jié)點算完之后就把它所占用的空間釋放了,生不帶來,死不帶去。

局部變量的定義很簡單,和一般的C語言定義方式一致。這里就不再累述。值得注意的是,當你想要用包含變量的一組值來定義一個局部變量時,應(yīng)當使用函數(shù)set(...),比如下面這段代碼

編譯器會報錯:“Syntax error, unexpected identifier, expecting '}'.”初學(xué)者肯定會丈二和尚摸不著頭腦,錯在哪了呢?原因就在于賦值的式子里包含了變量@y,而{ a, b, c }僅當a,b,c為常量(具體的數(shù)字)時才有效,我們這里應(yīng)當使用函數(shù)set:

參數(shù) Parameter

除了前面提到的2種數(shù)據(jù)類型之外,還有一個非常重要的,就是paramteter(參數(shù)),參數(shù)一般出現(xiàn)在節(jié)點的paramter窗口,我們可以通過參數(shù)這些對節(jié)點進行調(diào)整。官方網(wǎng)站上比較有用的文檔:創(chuàng)建參數(shù),右擊你要粘貼到的那個參數(shù),選擇"Paste relative reference"。

同一節(jié)點內(nèi),同一節(jié)點網(wǎng)絡(luò)內(nèi)不同節(jié)點,不同節(jié)點網(wǎng)絡(luò)
  • 在窗口上,手動創(chuàng)建參數(shù);
    流程見下圖,注意在"Parameter Description"一欄,我們新創(chuàng)建的變量有2個名稱:Name和Label,Name是參數(shù)“真正”的名字,我們在使用ch("參數(shù)名")或者VEX內(nèi)引用該參數(shù)時,都用的是Name,注意,Name不能包含空格;
    但是Label可以包含空格,作為參數(shù)在用戶界面上顯示的名稱。
  • 在Wrangle節(jié)點里,用VEX代碼創(chuàng)建窗口上的參數(shù);
    使用chi, chf, chv, chs函數(shù)在VEX中定義,隨后在界面上點擊一個按鈕即可,如圖。或者還可以用chramp來定義一個ramp,非常方便。
  • 在Wrangle節(jié)點里,用VEX代碼讀取窗口上的參數(shù);
    同上,使用chi, chf, chv, chs即可。
  • 在窗口上,讀取VEX代碼創(chuàng)建的屬性作為參數(shù)使用;
    這個話題比較復(fù)雜,因為是不能直接用@屬性名的,現(xiàn)在我還不是很確定,所以以后再來補上吧。。。

贊0 踩0

未知用戶

2005-2025 朱峰社區(qū) 版權(quán)所有 遼ICP備2021001865號-1
2005-2025 ZhuFeng Community All Rights Reserved

VIP

朱峰社區(qū)微信公眾號

回頂部

1.復(fù)制文本發(fā)給您的QQ好友或群、微信等;好友點擊鏈接以后,轉(zhuǎn)發(fā)就成功了。 2.如朋友點擊您的鏈接,您需要需刷新一下才行;同一個好友僅能點擊一次。
購買VIP,觀看所有收費教程。