Houdini節點分類與引數翻譯
前言
眾所周知Houdini是一款很強大的三維軟體,在很多影視大片裡都能見到它的身影。官方SideFX把它定位在3D Procedural Software for Film,TV,&Gamedev,其實Houdini本身的程式節點流與眾多整合的CV功能早已超出了電影、電視、遊戲領域範疇,就如UE4一樣也不僅僅只是一款遊戲製作工具。這一點官方SideFX已經認識到了,但是具體什麼原因沒有果斷轉型升級,我們也不清楚。就個人觀點來看,如果SideFX再不拓展領域,開放開源的話,很可能會被UE5、Blender甚至Nuke等軟體把流媒體、科研教育、AI等新興市場給瓜分掉,從而讓自己徹底淪落為一個外掛公司。
其實從Houdini17。5開始,PDG的Top流以及CSV和Python3的格式開放,包括最近18。5對實時動補的大力支援,這些看似對傳統特效製作沒什麼大提升的功能,其實是Houdini對新型市場的嘗試與跟進,也是如今的發展趨勢。對我個人而言,Houdini是一個很好的三維資料模擬與生成工具,對三維資料分析與處理有非常大的幫助。現在比較火的CV領域,有matplotlib和OpenCV,都是業界不成文的標準,雖然兩者都有三維計算效果,但是專業視覺化的三維資料軟體全球還沒一個大的統一。當然要成為這種軟體前提必須是開源開放的,Blender或者UE5可能有機會,Houdini我不知道。(吐槽完畢)
為什麼講節點分類
用過Houdini的朋友都知道,每當Houdini跨0。5的版本升級後,都會有較大的改動,大家也經常吐槽Houdini每次更新後就得重學一遍。其實Houdini本身的設計架構決定了它的每次新功能嵌入都將會是一次大換血。因為Houdini所有模組之間的資料都是相通的,而且是以節點流的形式相連,這就好比人的經絡,資料就如血液一般在其中有序迴圈,當新增一項功能,打個比方要給人加上一對翅膀,你整個骨骼與經絡都得重新換一套,形成迴圈系統,以保證大腦的血液能流入翅膀。而Maya,Max的功能主要以外掛的形式來增加,相當於給人穿衣服,每加一個功能就多穿一件衣服,穿多穿少不會影響整個人的身材,所以FumeFX裡的資料不能直接作用在Yeti上。
Houdini這套迴圈閉合的經絡系統,它的好處就是資料流通性,壞處也正是因為它資料一體化不好區分,容易導致眉毛鬍子一把抓,不知從哪斷到哪。Houdini是一個節點流軟體,要使用Houdini模擬三維資料之前,必須得了解它的功能模組與節點構成。這是入門Houdini的第一步,很多人認為Houdini難學,其實第一步就邁錯了方向,導致後面越學越懵逼。
Houdini的模組與節點型別
說到Houdini的模組有哪些,節點有哪些,估計有很多人都回答上來,包括一些老手。因為隨著Houdini版本與功能的升級,它本身的模組與節點型別也在發生變化,所以它並非一成不變的。
Houdini18。5的功能模組
功能模組
上圖就是Houdini的功能模組,我發現有很多人經常將模組功能與節點型別、節點功能混在一起來劃分和描述Houdini。其實這是不科學的,也是比較混亂的。舉個例子,SOP是幹什麼的,這個問題估計每個使用Houdini的人都會問到。然而在功能模組裡我們並沒看見SOP,甚至我們把Houdini所有節點找一遍,除了個叫Sop network的根本就沒看見Sop。從一些老師口中或者網上查尋得到的答案往往是surface operator,What?表面操作?那這又是什麼意思?更加矇蔽。所以說僅從字義功能上去描述Houdini,是根本描述不通的,就像用“魯棒性”去描述演算法一樣,不僅會讓人覺得懵逼甚至還略帶一絲好笑。 那為什麼直白的字義就無法描述Houdini各模組功能呢?正是因為Houdini的功能在不斷拓展,現有的功能已經超出了最原先的含義。surface operator是Houdini很早很早之前的版本所使用的功能描述,當時的功能估計也就停留在對物體的基本屬性、形狀上的一些操作,有點類似Maya物體的Shape,當然這也是我的個人推斷,畢竟Houdini的那些老版本我也沒用過。
Houdini官方是按節點型別而非模組的方式來劃分描述的。在幫助首頁裡就有:
官方幫助頁節點分類
對比上面兩張圖,可以發現這不是一一對應的關係,即模組分類 !=節點分類。但是乍看一眼,兩者貌似又有重合的地方,這也是第一個讓人比較迷惑的地方。而且我們還是不清楚SOP是幹什麼的。
第二個讓人迷惑的地方就是:官方幫助裡的節點分類其實本身並不是完整的。不是說官方節點分類不完整,而是說幫助文件裡所顯示的節點分類不完整。甚至因為歷史遺留原因導致一些節點型別的名稱與其底層程式碼類上的名稱是沒有一一對應的。Houdini真實的節點型別如下圖所示(這裡使用Houdini18。5版本):
Houdini18。5節點分類
其實從節點型別上去學Houdini那將會是最輕鬆的方式,而且能隨著Houdini的功能拓展而進行增量學習。尤其對於開發人員來說,能更好的理解各個模組之間的聯絡。話雖如此,但本來模組分類與官方幫助頁的分類已經夠繞了,現在又多了一些,會不會更復雜了?沒有,很簡單。我們只需要從節點層級上就能識別出節點型別,Houdini自身就是這麼來劃分的,而且每種節點型別從其外觀上就有一定的特徵。
認清Houdini節點型別
在之前,我們先用一個小指令碼來獲取我們所選擇的節點型別與節點型別名稱。
import
hou
sn
=
hou
。
selectedNodes
()
for
n
in
sn
:
(
n
。
type
(),
n
。
type
()
。
name
())
各節點型別功能
1。Director
字面上意思是導演,其實就是唯一的root根節點hou。node(“/”),在該節點下才會有ch,obj,img等功能模組節點。該節點是沒有實體節點形狀的,從程式角度理解就是每個工程的節點根路徑。
2。Manager
管理節點,也就是各模組節點,能包含其他節點的容器節點。跟Director一樣,它們也是沒有具體節點形狀的。但比Director要直觀一點的地方就是,你可以認為節點面板裡的每個分頁就是它們。
Houdini中的Manager節點有:
hou。node(“/ch”)
hou。node(“/img”)
hou。node(“/mat”)
hou。node(“/obj”)
hou。node(“/out”)
hou。node(“/shop”)
hou。node(“/stage”)
hou。node(“/tasks”)
3。Chop
資料通道節點,針對Houdini所有資料通道處理的節點,可以實現資料圖形化。所有chop network下的第一層節點都是Chop型別。注意是 “所有”、“第一層”。下面圖2中,即使裡面有chopnet2,sopnet2這些網路容器,但是它們都是Chop型別,列印這2個節點的型別與型別名稱,如下:
所謂“第一層”即當前網路層級,在圖2sopnet1裡面的節點,就不是Chop節點型別了。
圖1
圖2
4。ChopNet
所有帶Net結尾的節點型別都是該類節點的網路容器節點。所謂網路容器節點,就是可以包含很多其他節點的節點,且該容器裡建立的所有節點都是同一類節點。這裡的ChopNet就是在/ch下建立的Chop network網路容器節點,有且僅有這麼一個。
注意,在其他模組節點下建立的Chop network就不是ChopNet型別,參考Chop中的圖2
5。Cop2
合成類節點,Houdini針對影象合成處理的節點,功能類似Nuke。凡是Img network網路容器節點下建立的節點,都是Cop2節點。合成節點很好辨識,一般都帶縮圖的。
6。CopNet
在/img下建立的Img network網路容器節點,僅這麼一個。
7。Object
物體節點,在/obj下建立的所有節點以及Object network網路容器節點裡建立的節點都是Object節點型別,下圖都是Object節點。注意Object network網路容器節點本身的型別則取決於它的父節點。
8。Sop
終於來了Sop。Object節點裡除去所有是network網路容器的第一層節點,都是Sop節點,因為network網路容器節點裡建立的都是它本身獨特型別而非Sop型別,所以要除去。這也是官方對Sop的定義,雖然幫助文件上的描述也不全面,但這是唯一正確描述Sop的方式。因為Sop節點和功能太多,尤其Houdini17。5過後,Sop的功能界限越來越模糊,比如一些Sop節點本身會帶有動力學解算,所以是無法從節點功能上去描述劃分它的,而所有模組節點即Manager節點裡建立的也不是Sop節點,所以也不能從模組上去描述它,只能以節點型別去描述。
下圖是geo1裡的節點,都是Sop節點。
9。Dop
動力學節點,Houdini專門處理動力學解算的節點。所有Dop network網路容器節點裡的第一層節點都是Dop節點。
10。Driver
渲染、輸出節點。這個其實就是官方幫助頁上說的ROP節點,以前可能只是為了渲染Render所以叫ROP,其真實節點型別名稱叫Driver,可以理解為驅動程式,就是帶複雜計算過程的節點。不難理解,因為Houdini現在的運算與輸出已經不僅僅是渲染的內容了,比如CSV還有其他USD格式的輸出,等等這些都超出了渲染範疇,所以用Driver更合理。所有/out以及Rop network網路容器節點下建立的第一層節點都是Driver節點。
11。Lop
為USD流程操作的節點。所有/stage與LOP network網路容器節點下建立的第一層節點都是Lop節點,/stage是manager節點。同樣,LOP network網路節點型別取決於它的父節點。
12。Shop
材質shader節點。也是歷史遺留下的節點,現在基本成為了外部渲染外掛的材質存放根據地。所有/shop與Shop network網路容器節點下建立的第一層節點都是Shop節點。Shop network節點型別取決於它的父節點。
13。Top
任務流節點,Houdini17。5新增的強大功能,PDG就是其主要核心功能,能進行多執行緒,多變數批次計算,可以認為是平行宇宙吧。所有/tasks與Top network下建立的第一層節點都是Top節點。Top network網路容器節點型別取決於它的父節點。
14。TopNet
在/tasks裡建立的Top network網路容器節點,也是唯一一個。
15。VopNet型別
這也是Houdini歷史遺留下的網路容器節點,用來計算vex的地方,也是視覺化程式設計的地方。注意,在Vop network裡建立的所有節點都是VopNet節點,不是Vop節點。
16。Vop
vex程式執行節點,這裡的V是vex的意思,vex是houdini自身軟體的語言,是仿著C++的閹割版C,為提升軟體計算效率用的。官方幫助頁裡說它是Shader Nodes這也是讓人迷惑的地方。因為以前vex就是主要執行shader的,而現在vex的功能已經被Houdini拓展到了全域性。也有人會把V理解為view當做視覺化程式設計來理解,其實算是歪打正著吧,畢竟Houdini是為藝術家而不是程式設計師設計的一款軟體,其大部分程式功能確實是可以透過視覺化程式設計節點進行實現的,就現階段而言,要識別Vop節點透過判斷它是不是視覺化程式設計節點確實是一種非常直觀又準確的辦法。
所有/mat以及Vop network,Mat network網路容器節點裡建立的第一層節點都是Vop節點。所以Attribute VOP與Mat network裡的節點其實都是Vop節點。Vop節點有個很明顯的一個檢視特徵就是橫向節點流,如下圖
到此,Houdini18。5的所有節點型別都講完了。所以“為什麼ROP network與/out一樣,/stage與LOP network一樣”,這類由於Houdini將節點功能與模組功能混在一起的風騷迷惑操作,大家應該理解了吧。
獲取Houdini的各類節點
知道Houdini的節點型別,是玩Houdini的基本前提。Houdini本身還是一款應用工具軟體,我們既不能無視它的功能也不能神化它的存在,它和其他DCC軟體其實跟電腦裡的計算器還有手機裡的小程式一樣,需要的時候就用,能解決一些問題就可以了,認清你想要的,你才不會迷惑。
Houdini18。5裡每種節點型別下有多少個節點,到底哪類節點重要一些呢?我統計了一下。
結果可以看出Vop最多,Sop其次,然後是Dop,這三個佔了絕大部分。怎麼獲取所有節點呢?方式如下:
import hou
node_types=hou。nodeTypeCategories() #獲取節點各型別
all_nodes=[]
counts={}
for nc,nt in node_types。items():
all_types=nt。nodeTypes() #獲取各大類下的所有節點(字典)
all_node_names=list(all_types。keys()) #所有節點名稱
counts[nc]=len(all_node_names)
for name in all_node_names:
all_nodes。append(name)
print(counts)
print(len(all_nodes))
需要注意的是Director與Manager節點型別無法透過node。Types()來獲取,它返回的是空{},很神奇。
Houdini節點引數翻譯
先上個效果圖
怎麼實現的呢?
思路是:
1。先獲取所有節點型別
2。再獲取每個型別下的所有節點
3。然後獲取每個節點的引數名稱,引數標籤
4。將所有標籤翻譯為中文
5。將資料存入工具架
6。透過工具架對選中節點進行復制,替換新複製出的節點上的所有引數標籤,得到翻譯後的節點。
主要指令碼操作如下:
收集節點引數資訊get_data。py
import numpy as np
import pandas as pd
node_types=hou。nodeTypeCategories() #返回的一個字典
‘’‘
{’Chop‘: eTypeCategory for CopNet>, ’Director‘: or Driver>, ’Lop‘: ‘: r TopNet>, ’Vop‘: ’‘’ all_nodes=[] #所有節點名稱 parm_names =[] data_list=[] for nc,nt in node_types。items(): #nc為Categories各大類名稱,nt為各大類的指令碼型別 node_types=nt。nodeTypes() #獲取各大類下的所有節點(字典) node_names=list(node_types。keys()) #該節點型別下所有節點名稱 for name in node_names: all_nodes。append(name) # 記錄所有節點 node=hou。nodeType(nt,name) plg=node。parmTemplateGroup() f_parms=[p for p in plg。entries()] #獲取每個最高層級引數 i_parms=[u for u in plg。entriesWithoutFolders()] #獲取非目錄引數 f_parms。extend(i_parms) parms=list(set(f_parms)) for i in parms: p_name =i。name() #引數名稱 p_label=i。label() if i。label() else p_name #當不存在標籤時,就用引數名稱 if p_name not in parm_names: parm_names。append(p_name) per_list=[p_name,p_label,name,nc] data_list。append(per_list) print(‘all_nodes:’,len(all_nodes)) print(‘parm_names:’,len(parm_names)) data=np。array(data_list) df=pd。DataFrame(data,columns=[‘parm_name’,‘parm_label’,‘nodename’,‘category’]) save_path=os。path。join(hou。getenv(‘HIP’),‘node_info。csv’) df。to_csv(save_path) 輸出的節點資料node_info。csv 結構如下 節點翻譯 translate_node。py translate_node。py 工具地址: gitee:https://gitee。com/cgai/chinese-corpus-of-houdini。git 百度雲:https://pan。baidu。com/s/1O4wVF4rOWfg5zRV6JpcifQ 提取碼:t1iu 這個功能其實就是將節點上的引數翻譯一遍,實現也不難,對製作與學習基本上也什麼用,我做這個的主要原因是因為我一直沒有找到CG專業術語的中文語料。Houdini是一個可控性很強的DCC軟體,如果只是針對專業人員來操作,那麼所有DCC軟體用其本身的英語是最好的,但,假如不是呢?或者說如果我們要對DCC軟體進行外部的互動式操作,比如手勢、聲控、語音這些,這個時候我們會發現,還得需要一套標準的專業語料,否則根本就不好識別命令意圖。所以我把Houdini18。5裡的所有節點的引數名稱以及引數標籤都導成一個csv,然後用百度翻譯介面把所有標籤機翻為中文,存為一個大Json也放在gitee裡,機翻的肯定有很多不對,我稍微修改了幾個,個人能力有限,還希望有興趣的朋友來一起完善。哈哈,加油。