テクスチャの配置を自動でやってくれる便利機能ないかなーといつもの他力本願で海外サイトをいろいろ探していると
http://www.sidefx.com/index.php?option=com_forum&Itemid=172&page=viewtopic&t=22198
とか
http://www.sidefx.com/exchange/info.php?fileid=603&versionid=603
があった!
けど・・・おしい・・・インスタンスじゃなくてSOPNetwork内でやりたい!
あとたまに変形もしたいし、sortで順番もバラバラにしたい!
今回は自分で作るしかないかと腹を決めて作成開始!参考サイトは以下のサイトです
https://nccastaff.bournemouth.ac.uk/jmacey/Python/HoudiniExample/tools_5forloop.html
とりあえずコードはこんな感じで
node = hou.pwd() geo = node.geometry() import glob import os #add 'File'(Name:image_path) from Edit Parameter Interface mappath = hou.parm("image_path").eval() if(os.listdir(mappath)): list = os.listdir(mappath) else: #dummy list = [""] #print(list) mapnum = len(list)-1 #add Attribute textureName = geo.addAttrib(hou.attribType.Prim, "texturename", "") textureNo = geo.addAttrib(hou.attribType.Prim, "textureno", 0) #shop############### if(hou.node("../SHADING_CONTROL_PANEL")==None): shaders = hou.node('../').createNode('shopnet', 'SHADING_CONTROL_PANEL') else: shaders = hou.node("../SHADING_CONTROL_PANEL") ##if use shop #shaders = hou.node("../../../shop") shaders.moveToGoodPosition() delnode = shaders.children() #all delete! for i in delnode: i.destroy() #loop############### j=0 firstloop = 1 for prim in geo.prims(): #attrib############## prim.setAttribValue(textureName, mappath + list[j] ) prim.setAttribValue(textureNo,j) #material############## if(firstloop==1): material = shaders.createNode('material', "shaders"+str(j) , run_init_scripts=False) material.moveToGoodPosition() suboutput = material.createNode('suboutput') v_layered = material.createNode("v_layered") v_layered.parm("map_base").set(mappath + list[j]) #wire suboutput.setFirstInput(v_layered) v_layered.moveToGoodPosition() suboutput.moveToGoodPosition() if(j < mapnum): j+=1 else: j=0 firstloop=0
うーん思ったより長くなってしまった。
あと作業しているときにびっくりしたことがあった。
僕はいつもStringのエリアでattributeとかの変数入れられないとき
無理やり一個前にnullノード作って
`prim(“../null1”, 0, “hoge”, 0)`
とかやるんだけれども、これどうやっても文字型が認識されない!
けどこれは文字型でOK
`points(“../null1”, 0, “hoge”)`
うーん・・・よくわからん・・・
とりあえず今回は数字でattributeに値もっておいて
foreach内でshaders+数字
とすることで処理したので一応問題なし。
以上覚え書きでした。
ファイルは整理整頓したらアップします。