Wrangle オペレータ
Wrangle オペレータ
Wrangle オペレータを作成するときは、
Attribwrangleノードを作成しclassパラメータを変更することによってそれぞれのオペレータを作成します。
(classパラメータの値)
- 1
- PrimitiveWrangle
- 2
- PointWrangle (デフォールト)
- 3
- VertexWrangle
以下のようにすると変数wはVertexWrangleになります。
obj = hou.node('/obj')
g = obj.createNode('geo')
w = g.createNode('attribwrangle')
w.parm('class').set(3)
VEXの設定
WrangleオペレータにVEXを設定するときは、パラメータsnippetにVEXの式を文字列として与えます。
Wrangleノード.parm('snippet').set('VEXの式')
VEXが複数行にわたったり複雑な式のときは ''' または """ を使った文字列を使用します。
変数 = '''
VEXの式;
'''
Wrangleノード.parm('snippet').set(変数)
Wrangleオペレータの例
高さと色がランダムに変化するグリッドを作成してみます。
def makePointWrangle(g, n, vex):
w = g.createNode('attribwrangle')
w.parm('class').set(2)
w.setInput(0, n)
w.parm('snippet').set(vex)
return w
def makeGrid1():
vex1 = '''
@P.y += noise(@P);
'''
vex2 = '''
@Cd = rand(@ptnum);
'''
obj = hou.node('/obj')
g = obj.createNode('geo')
gr = g.createNode('grid')
w = makePointWrangle(g, gr, vex1)
makePointWrangle(g, w, vex2)
makeGrid1()
スクリプトの解説
- def makePointWrangle(g, n, vex):
- PointWrangleオペレータを作成する関数makePointWrangleの定義です。
引数
- g
- PointWrangleオペレータを作成するgeometryノード
- n
- PointWrangleオペレータの入力に接続するノード
- vex
- PointWrangleオペレータに設定するVEX
- w = g.createNode('attribwrangle')
- AttributeWrangleオペレータを作成し変数wに代入します。
- w.parm('class').set(2)
- classパラメータを2にしてPointWrangleオペレータに変更します。
ただし、これはデフォールトなのでこのコマンドは省略してもかまいません。
- w.setInput(0, n)
- 作成したオペレータの入力に変数nに入っているノードを接続します。
- w.parm('snippet').set(vex)
- 作成したオペレータにVEXを設定します。
- return w
- 作成したオペレータを返します。
- def makeGrid1():
- 頂点ごとに色の変わり変形したグリッドを作成する関数makeGrid1を定義します。
- vex1 = '''
@P.y += noise(@P);
'''
- noise() 関数によって頂点を移動するVEXの定義です。
- vex2 = '''
@Cd = rand(@ptnum);
'''
- rand() 関数によって頂点ごとに色を変えるVEXの定義です。
- obj = hou.node('/obj')
- /objのノードを変数objに入れます
- g = obj.createNode('geo')
- /objの中にgeometryノードを作成し変数gに代入します。
- gr = g.createNode('grid')
- geometryの中にグリッドを作成し変数grに代入します。
- w = makePointWrangle(g, gr, vex1)
- PointWrangleオペレータを作成しグリッドに接続します。
作成されたオペレータは変数wに代入します。
- makePointWrangle(g, w, vex2)
- PointWrangleオペレータを作成し変数wのオペレータに接続します。
作成されたオペレータはこれ以降使わないので変数に入れていません。
- makeGrid1()
- makeGrid1() によってグリッドを作成します。
練習問題
- makeGrid1()のVEXを変更して高さの変化量を変更できるようにしてください。
def makeGrid2(h):
引数hに入れた数値が大きいほど高さの変化量が大きくなるようにします。
(作成例)
makeGrid2(5.5)
(ヒント)
変化量を返るためには、VEXを以下のような式にします。
@P.y += h * noise(@P);
VEXの一部を変更しPythonの変数を挿入するためには、文字列の結合かformat() などの文字列メソッドを使用します。