前言
Houdini內置了Python腳本和相應的編輯器, 很多時候想靈活的制作各種Houdini工具, 基本是必須用到?Python。Houdini官方的python提供了非常完善的接口, 比如可以創建各種節點,連接各種節點,遍歷節點各種數據,遍歷節點參數等等。
Houdini Python官方資料
Python scripting (sidefx.com)
hou.node (sidefx.com)
非常全面羅列了Houdini Python各種接口。 這篇文章主講hou模塊的基本使用
HoudiniPython編寫工具
Python Shell運行控制臺
方便用戶做Python開發
Houdini里的各種節點和節點參數都可以直接從編輯器拖拽到Python shell里生成獲取對象腳本
houdini
Python SourceEditor
相比python shell, 方便寫多行python代碼,結果也是輸出python shell,也支持節點路徑拖拽到Editor里
Houdini Python具體使用和概念介紹
節點基本類型
Houdini的節點基礎類型為OpNode, 子類型分為ObjNode, SopNode, LopNode等.
這節主講ObjNode, SopNode
hou.OpNode (sidefx.com)
hou.ObjNode (sidefx.com)
hou.SopNode (sidefx.com)
節點操作
獲取節點
hou.node('/obj/geo1/null1')
獲取節點類型, 節點類型名和節點名等
hou.node('/obj/geo1/null1').type()
hou.node('/obj/geo1/null1').type().name()
hou.node('/obj/geo1/null1').name()
?創建節點
hou.node('/obj/geo1').createNode("box")
hou.node('/obj/geo1').createNode('attribwrangle', "ttt")
這里傳的"attribwrangle"為具體節點的類型名, 也就是node.type().name()
CD到某個節點路徑下
作用等同于cmd的cd
hou.cd("/obj")
hou.node("geo1")
獲取直接的子節點
hou.node('/obj').children()
節點參數
節點參數類型(hou.ParmTuple和hou.Parm)
hou.Parm指最簡單參數元素,比如int, float, bool.
而多個(包含1個)hou.Parm一起組成了hou.ParmTuple, 比如float2, int2, color等等.
節點獲取某個參數Parm
hou.parm('/obj/geo1/subnet1/Count')
hou.parmTuple('/obj/geo1/subnet1/Pos2')
hou.parmTuple('/obj/geo1/subnet1/Pos2')[0]
節點獲取所有parm,parm_name, parmTemplate,parmTemplate的類型
hou.Parm (sidefx.com)
hou.ParmTemplate (sidefx.com)
hou.parmTemplateType (sidefx.com)
hou.node('/obj/geo1/subnet1').parms()
很顯然數組實例化出來的"a1", "a2", 文件夾Fold0, 向量的單元素也成為了parm.
import hou
params = hou.node('/obj/geo1/subnet1').parms()
for parm in params:print(parm.name()) # 名字print("param is array instance: ", parm.isMultiParmInstance()) # 參數是否是數組的實例parm_template = parm.parmTemplate() print(parm_template) # 參數模版print(parm_template.type()) # 參數模版類型print("\n")
節點獲取所有parm_tuple, parmTemplate
import hou
parm_tuples = hou.node('/obj/geo1/Test1').parmTuples()
for parm_tuple in parm_tuples:print(parm_tuple)parmTemplate = parm_tuple.parmTemplate()# 篩選數組的實例if not parm_tuple.isMultiParmInstance():print(parmTemplate)# 如果此元素為數組,獲取子元素模版if parmTemplate.type() == hou.parmTemplateType.Folder:print("child element template:")print(parmTemplate.parmTemplates())print("\n")
節點設置值和獲取值
設置參數值
hou.parm('/obj/geo1/Test1/ArrayName').set(3)
hou.parm('/obj/geo1/Test1/a3').set(1)
hou.parmTuple('/obj/geo1/Test1/Color').set((6, 6, 6))
hou.parm('/obj/geo1/Test1/Button').pressButton()
獲取參數值
hou.parmTuple('/obj/geo1/Test1/Color').eval()
hou.parm('/obj/geo1/Test1/a1').eval()
hou.parmTuple('/obj/geo1/Test1/Pos3')[0].eval()
hou.parm('/obj/geo1/Test1/ArrayName').eval()
同類型參數的區分
下面是典型例子,在Houdini中參數的區分不能僅僅用parmTemplateType和parmTupleSize去區分,像Color和float3很明顯需要look或者naming schene等信息作為區分.
節點輸入輸出相關
獲取輸入節點,輸出節點,輸入輸出連接信息
hou.node('/obj/geo1/Test1').outputs()
hou.node('/obj/geo1/Test1').inputs()
hou.node('/obj/geo1/Test1').inputConnections()
hou.node('/obj/geo1/Test1').outputConnections()
設置節點相連
box_node = hou.node('/obj/geo1/box1')
test_node = hou.node('/obj/geo1/Test1')
null2node = hou.node('/obj/geo1/null2')test_node.setInput(2, box_node)
null2node.setInput(0, test_node)
null2node.createOutputNode("box", "box_test")