—— 微資訊 · 微課程 —— 利用零碎時(shí)間,走上超神之路! 從其他三維軟件轉(zhuǎn)到houdini的用戶(hù)往往會(huì)被下面詞匯所嚇倒,特別是沒(méi)有編程基礎(chǔ)的同學(xué): 屬性(attribute)和數(shù)據(jù)(data),當(dāng)然還有參數(shù)(parameter)變量(variable)局部變量(local vairable)和全局變量(global variable)等。特別是houdini還支持houdini表達(dá)式expression,hscript,python,vex和C++等語(yǔ)言,各種語(yǔ)言使用方法又不一樣,新舊版本houdini變化有比較大,讓人無(wú)所適從。 這些名詞到底指代什么,很可能需要從計(jì)算機(jī)發(fā)展和一些內(nèi)部原理解釋?zhuān)贿^(guò)我們是學(xué)習(xí)如何使用houdini(當(dāng)然,如果你要從事底層開(kāi)發(fā)可以深入研究的話,歡迎去研究里面的差別),所以對(duì)我來(lái)說(shuō),幾乎是一樣的。 昨天文章中,有熱心的同學(xué)指正了小編的錯(cuò)誤,具體如下 1局部變量是map,翻譯為映射或者適配,小編說(shuō)成是轉(zhuǎn)換(至于大家是否更好理解就不得而知了) 2vex中應(yīng)該是屬性,而不是變量。(不過(guò)這個(gè)其實(shí)有點(diǎn)混淆了概念) 首先感謝這位同學(xué)的留言,如果還有其他問(wèn)題歡迎大家指正,在后面的文章我會(huì)繼續(xù)更新的。但是還是會(huì)堅(jiān)持這樣寫(xiě),主要原因有二: 第一,作為對(duì)于剛?cè)腴T(mén)還對(duì)變量,屬性之類(lèi)不太理解的同學(xué),直接解釋里面核心差異無(wú)異于聽(tīng)天書(shū),解釋了反而讓大家更暈乎。有點(diǎn)類(lèi)似與聽(tīng)程序員講了一堆程序語(yǔ)言,最后你只希望對(duì)方說(shuō)人話。 第二,其實(shí)在最終的使用上是非常類(lèi)似的,當(dāng)然,如果都能夠非常熟練地使用, 希望更上一層樓,可以再去追究其差異。有句話說(shuō)得好:聽(tīng)了很多道理,卻依然過(guò)不好這一生。我們定義各種名詞,各種規(guī)則最終是為了用而不是為了記憶。 今天我們就來(lái)做個(gè)整體的介紹 概述 上面分了三行,這樣分的原因如下 1屬性和數(shù)據(jù)實(shí)際上是同樣的東西,也是houdini定義的客觀存在的東西。 2你要對(duì)屬性/數(shù)據(jù)進(jìn)行創(chuàng)建,訪問(wèn),修改或者刪除,而已通過(guò)參數(shù)/表達(dá)式/hscript/vexvop/pthon進(jìn)行操作。 3節(jié)點(diǎn)可以用來(lái)操控屬性,實(shí)際上也就是對(duì)第二點(diǎn)工具的可視化編程/封裝 4部變量和全局變量是相對(duì)于編程語(yǔ)言而言的概念,也就是在expression,Hscript,vex/vop和python。所以不存在局部屬性和全局屬性一說(shuō)。 總結(jié),屬性和數(shù)據(jù)為對(duì)象,而參數(shù),表達(dá)式,Hsript,vex,pythton使我們?nèi)绾尾倏貙?duì)象的工具/方法。昨天小編介紹的就是在工具/方法中的 表達(dá)式VS vex語(yǔ)言的兩種方法,也是大家最常見(jiàn)和改動(dòng)比較大的地方。 屬性attribute,數(shù)據(jù)與參數(shù)和表達(dá)式,vex等關(guān)系 當(dāng)使用add節(jié)點(diǎn)創(chuàng)建一個(gè)點(diǎn),那么這個(gè)點(diǎn)就具備了一個(gè)默認(rèn)的屬性:位置,反過(guò)來(lái)說(shuō),沒(méi)有不存在位置屬性的點(diǎn),沒(méi)有位置就不會(huì)有這個(gè)點(diǎn)。 這時(shí)候你要移動(dòng)這個(gè)點(diǎn),在maya或者3dsmax的做法通常就是選擇點(diǎn),然后選擇移動(dòng)工具向y軸正方向移動(dòng)一個(gè)單位(PS:maya的多邊形點(diǎn)是不能單獨(dú)存在的,可以假設(shè)為box上的一個(gè)點(diǎn))。 在houdini中你有多種方式實(shí)現(xiàn) 1實(shí)際上,你可以直接在屬性面板中直接把P[y]的值修改為1.0,只是這樣修改不直觀,對(duì)于多個(gè)點(diǎn)的操作太麻煩,所以houdini為我們提供一下工具。 2直接add的point參數(shù)上輸入0,1,0 使用參數(shù)的方法,雖然這個(gè)看起來(lái)和第一個(gè)方法是一樣的,不過(guò)對(duì)于復(fù)雜的變化比如旋轉(zhuǎn)和縮放等就更加人性化操作了。 我們?cè)趨?shù)面板上能查看每個(gè)節(jié)點(diǎn)的參數(shù)(每個(gè)節(jié)點(diǎn)都有自己的參數(shù)編輯面板) 3選擇點(diǎn),添加edit節(jié)點(diǎn)/transform節(jié)點(diǎn)進(jìn)行向上移動(dòng)一個(gè)單位 使用手動(dòng)或者transform 節(jié)點(diǎn) 4添加point_old節(jié)點(diǎn),在表達(dá)式輸入@P.y+1 使用了vex語(yǔ)言 直接使用vex語(yǔ)言控制 5使用attributecreate創(chuàng)建一個(gè)局部變量$VAR,設(shè)置值為1,然后在point_old上使用$TX+$VAR 使用表達(dá)式和局部變量 6 當(dāng)然你也可以使用vex定義個(gè)var屬性,然后疊加上到@P.y上 使用vex創(chuàng)建屬性然后疊加計(jì)算 其實(shí)感覺(jué)用了各種方法進(jìn)行操作,最終結(jié)果都是讓屬性P在y軸上+1的值,視圖上點(diǎn)上升了一個(gè)單位。 數(shù)據(jù) 在dop動(dòng)力學(xué)中,見(jiàn)到更多的是data數(shù)據(jù),比如添加force力,是一個(gè)數(shù)據(jù),添加了constraint約束也是一個(gè)數(shù)據(jù),包括solver也是一個(gè)數(shù)據(jù),我們通過(guò)添加各種數(shù)據(jù)影響著動(dòng)力學(xué)中的解算行為。 我們創(chuàng)建一個(gè)簡(jiǎn)單的flip流體解算,在geometry spreadsheet中你會(huì)發(fā)布局和sop中完全不一樣 其實(shí)當(dāng)我們選擇geometry的時(shí)候,熟悉的視圖又回來(lái)了。這個(gè)可以理解為動(dòng)力學(xué)中,我們給物體添加了很多的data數(shù)據(jù),只是這些數(shù)據(jù)不存在點(diǎn)/面層級(jí)里面,比如gravity,都所有點(diǎn)/面都一樣的效果,所以直接在geometry外部作為一個(gè)整體數(shù)據(jù)影響所有的點(diǎn),類(lèi)似存放與在detail中的的局部變量。 如果這時(shí)候我給flipsolver中添加了pop force節(jié)點(diǎn),這里個(gè)節(jié)點(diǎn)使得物體上每個(gè)點(diǎn)受到的力都可以不一樣,這樣在geometry中會(huì)添加force這個(gè)屬性(自然也會(huì)生成v速度這個(gè)屬性)。 從這個(gè)意義上說(shuō),動(dòng)力學(xué)data中的數(shù)據(jù)包含了屬性attribute。 屬性和數(shù)據(jù)總結(jié) 簡(jiǎn)單地說(shuō),存儲(chǔ)在物體層級(jí)上的(point,vertex,primitive和detail上)對(duì)象的可以被當(dāng)做屬性。反過(guò)來(lái)說(shuō),屬性必須依附在幾何體上的。 而數(shù)據(jù)無(wú)需依附在幾何體上,在dop中被解算器識(shí)別。 但是從本質(zhì)上說(shuō),并沒(méi)有什么不同,其實(shí)都是一些houdini識(shí)別的值,用來(lái)呈現(xiàn)不同的效果/實(shí)現(xiàn)功能。比如Cd屬性可以高數(shù)houdini顯示/渲染特定的顏色,v代表速度,可以被mantra識(shí)別計(jì)算運(yùn)動(dòng)模糊等等。 屬性的特點(diǎn) 屬性 通??梢杂米兞?的形式寫(xiě)入表達(dá)式,例如變量$TX 表示屬性P[x]。 一些屬性可以自動(dòng)被渲染引擎、動(dòng)力學(xué)引擎或其他內(nèi)置的節(jié)點(diǎn)識(shí)別并應(yīng)用,比如顏色Cd會(huì)被mantra surface材質(zhì)識(shí)別,N和up會(huì)被copy SOP識(shí)別等等。 用戶(hù)可以自定義任意數(shù)量的屬性,即使他們不會(huì)被任何內(nèi)置節(jié)點(diǎn)識(shí)別,你也可以在表達(dá)式、腳本、VOP等地方使用。自定義的屬性也可以被適配為局部變量 并非所有參數(shù)都支持本地變量,如VOP SOP,Color SOP等都不支持。 下面我們來(lái)討論一下操控屬性的方法 這里所說(shuō)的操控包括 創(chuàng)建,訪問(wèn),修改或者刪除等操作。 參數(shù) parameter 剛才我們第一個(gè)案例中就是用add節(jié)點(diǎn),直接修改points的位置參數(shù),讓其y軸位移一個(gè)單位。這個(gè)就是使用參數(shù)對(duì)屬性P的修改。但是,這里要說(shuō)明的是,并不是參數(shù)面板中的所有參數(shù)都是屬性,比如添加transform節(jié)點(diǎn),調(diào)整ty也可以讓屬性P.y向上移動(dòng)??雌饋?lái)是一一對(duì)應(yīng)。但是transform節(jié)點(diǎn)還有rotate,scale和pivot等參數(shù),他們實(shí)際上也是控制點(diǎn)的P屬性 我們新建一個(gè)小球sphere,轉(zhuǎn)化為polygon多邊形,添加transform節(jié)點(diǎn),調(diào)整rotate或者scale,實(shí)際上看到是屬性P的值在變化。 從這里可以看出,參數(shù)面板中參數(shù)很多是為了方便我們?nèi)说闹庇^思維和設(shè)計(jì)出來(lái)的,實(shí)際上對(duì)于houdini來(lái)說(shuō),都是調(diào)整同一個(gè)屬性。比如scale,實(shí)際上就是讓點(diǎn)沿著法線運(yùn)動(dòng),實(shí)際上修改的還是點(diǎn)的位置屬性。這也說(shuō)明,參數(shù)是我們操控屬性的一個(gè)工具而已。 houdini expression和Hscript 這個(gè)是houdini原生的表達(dá)式和編程語(yǔ)言,有點(diǎn)類(lèi)似與maya的表達(dá)式和mel的關(guān)系。說(shuō)得簡(jiǎn)單一點(diǎn),表達(dá)式就是hscript的簡(jiǎn)潔版,可以直接在參數(shù)通道中使用的一兩句簡(jiǎn)單的函數(shù)。而如果需要使用復(fù)雜的代碼,那么就要使用的Hscript。 vex和vop vex是類(lèi)似與C/C++的一門(mén)語(yǔ)言,最開(kāi)始是應(yīng)用在shader材質(zhì)編寫(xiě)中。特點(diǎn)是運(yùn)行效率非常高,書(shū)寫(xiě)也比較簡(jiǎn)潔。vop是vex的可視化編程。也就是vex代碼的功能都可以使用vop中的節(jié)點(diǎn)的實(shí)現(xiàn),并且對(duì)于某些特殊的功能,比如noise和pattern等使用vop更加方便。 python 主要用于UI和某些節(jié)點(diǎn)的創(chuàng)建,對(duì)于制作各種快捷工具設(shè)置也非常方便。 上面的expression,Hscript,vex和vop,python都屬于編程的范疇,對(duì)于expression表達(dá)式這種不能?chē)?yán)格意義上說(shuō)是編程語(yǔ)言。而這里就會(huì)有變量的說(shuō)法,而這個(gè)變量可以用于定義屬性,訪問(wèn)屬性,和修改屬性等。 局部變量VS全局變量 這里僅僅存在在上述編程概念,不會(huì)有局部屬性和全局屬性的說(shuō)法。 對(duì)于expression表達(dá)式 局部變量比如 $TX,$CR之類(lèi)的必須在某個(gè)特定節(jié)點(diǎn)/對(duì)象上才會(huì)存在(同理,在物體上也需要有對(duì)應(yīng)的屬性,比如P和Cd屬性)。而$FF,$T,和$PI 等存在于軟件中,不管是否有節(jié)點(diǎn)/對(duì)象都可以存在,可以稱(chēng)為環(huán)境變量或者是全局變量。 對(duì)于vex來(lái)說(shuō),也是同樣道理,可以通過(guò)vex創(chuàng)建屬性,但是對(duì)于vex這門(mén)語(yǔ)言來(lái)說(shuō)其實(shí)還是使用局部變量對(duì)其訪問(wèn),比如@P.x和@Cd.r;對(duì)于@Time和@Frame等存在于軟件中的可以稱(chēng)為全局變量。 但是,對(duì)于vex語(yǔ)言來(lái)說(shuō)還有另外一種“局部變量”,這個(gè)中定義是不生成屬性的變量,僅僅在自身代碼段中使用,這個(gè)概念更加偏向與代碼原生的局部與全局的概念,與上面說(shuō)的不是一個(gè)范疇的東西。 vex中創(chuàng)建局部變量 當(dāng)如,除了全局變量,vex還可以創(chuàng)建局部變量,這個(gè)就有點(diǎn)類(lèi)似與編程中的全局與局部的概念了。其實(shí)和屬性不是一個(gè)范疇的東西。 比如下面代碼中 float a=1.0;這里我們定義了一個(gè)局部變量,注意于定義屬性的差異,f→float,并且沒(méi)有@符號(hào) 那么這個(gè)a并不是屬性,所以也不會(huì)在geometry spreadsheet中找到,同時(shí)只能在本節(jié)點(diǎn)代碼中使用,并不能被外部節(jié)點(diǎn)調(diào)用。 組 組也是屬性的一種,這個(gè)大家可以嘗試一下在個(gè)點(diǎn)分組,會(huì)在geometryspreadsheet中看到對(duì)應(yīng)的屬性。下面分別使用group節(jié)點(diǎn)和wrangle節(jié)點(diǎn)創(chuàng)建同樣的組: group方式,輸入group name為left,然后在basegroup中基于屬性P.x的位置進(jìn)行分組。 在wrangle中是寫(xiě)法是 @group_組的名字,=號(hào)右邊輸入分組成立的條件。 在geometryspreadsheet中可以都看到 group:left這個(gè)特殊的屬性,數(shù)據(jù)類(lèi)型為布爾類(lèi)型 0代表不在組里,1代表在組里。 總結(jié) 上面說(shuō)了一大堆,對(duì)于初學(xué)者來(lái)說(shuō)可能會(huì)有點(diǎn)繞,到最后可能都不敢怎么用了。那么下面來(lái)做一個(gè)總結(jié)。 1屬性(數(shù)據(jù))可以說(shuō)是一樣的東西(要具體細(xì)分看上面). 2屬性的操作可以直接修改,更多是通過(guò)參數(shù),expression表達(dá)式,Hscript,vex語(yǔ)言,python,只是形式上和方法上不同,或者說(shuō)是不同系統(tǒng),但是可以實(shí)現(xiàn)同樣的效果。記住,核心就是對(duì)屬性的調(diào)用與控制。 3在houdini的世界里面,屬性可以說(shuō)是客觀存在的對(duì)象,對(duì)于這些對(duì)象的操作我們使用第二點(diǎn)說(shuō)的工具,并且通過(guò)變量進(jìn)行創(chuàng)建,訪問(wèn),修改和刪除。 4在編程體系中談到變量,分為局部變量和全局變量。 希望在討論這些之后不會(huì)讓大家暈乎,總之一句話。定義這些詞匯和定義都是為了方便我們?nèi)ナ褂?,如果無(wú)法全面掌握這些,那么用就是了~ 獲得教程的方法: 如果大家對(duì)哪些知識(shí)點(diǎn)不是特別清楚的可以在文章后面留言,小編會(huì)把自己知道的整理成微課程幫大家解答。 |
|
來(lái)自: cghunter > 《待分類(lèi)》