[Houdini] HOMメモ

仕事ですこーーーーしだけHOMを使ったスクリプトを書いたので、その際に残したメモを置いておきます。

  1. HOMでは基本的に必要なもの全てがオブジェクトになっている。
  2. ノードは言うまでもなく、パラメータなども全てオブジェクトになっている。ナイス!!!

  3. パスからノードオブジェクトの作成
  4. hou.node(‘path_to_the_node’)
    hou.node(‘/obj/geo1/subnet1/copy1’) みたいな感じで使います。
    Nodeオブジェクトなくしては何も始まらない・・・!!!

  5. hou.node()は、hou.Nodeではなく、そのサブクラスのインスタンスを返す。(全部が全部そうかはわからない)
  6. SOPの場合hou.SopNodeなどになる。なので、使える関数が微妙に異なる。
    例えば上記の例だとgeometry()は、hou.SopNodeの関数となるので、SOP以外では使えない、など。

  7. ノードの絶対パス
  8. node.path()

  9. ノードの名前
  10. node.name()

  11. ノードオブジェクトからプリミティブを取得
  12. prims = node.geometry().prims()
    ※hou.SopNodeのみ

  13. MELのgetAttr的な表現(アトリビュートではなくノードのチャンネルに対して)
  14. node.parm(‘parameter_name’).eval()
    ※evalにはevalAsIntやevalAsFloatなどもあり、より厳密なデータの取得が可能だが、型が異なると使えない。
    (たとえばintをfloatで受け取ることなどは不可)
    node.evalParm(‘parameter_name’) という方法もある。

  15. MELのsetAttr的な表現(アトリビュートではなくノードのチャンネルに対して)
  16. node.parm(‘parameter_name’).set(value)

  17. connectAttr的な表現
  18. node.setInput(0, input_node)
    ※この場合nodeは、コネクトされる側のノードオブジェクトとなる

  19. 親ノードの取得
  20. node.parent()

  21. スクリプトの実行に便利そうな記述
  22. execfile(hou.findFile(‘script_file_name.py’))
    適切なパスに置けばいちいちフルパス書かなくても実行出来る!っぽい。

  23. ノードの作成
  24. new_node = parent_node.createNode(‘node_type’)
    ※階層問題に気をつける。たとえば新しいgeometryノードを/objに作る際は、
    hou.node(‘/obj’).createNode(‘geo’) のような記述になる。
    つまり、親階層になるノードオブジェクトから実行する感じ。
    ただ、node.createOutputNode()のように、同一階層のあるノードから作成することも可能。
    適宜使い分けると良いかも。

  25. ↑に関連してnode.createNode()を実行すると位置はぶっ飛ぶ
  26. →node.createNode()からノードを作成すると、明後日の方向にノードが作成される。
    node.createOutputNode()などを使用すると、指定したノードの直下に作成される模様。
    今回はnode.createNode()を多用したが、node.createOutputNode()を使用した方が本当はきれいに行くのかも?

  27. ノードタイプ、パラメータタイプの見分け方
  28. どちらも基本的には全て小文字。ノードタイプは、通常通りTABキーで作成した際の英字部分がそのノードのノードタイプ名となる模様。
    geometryと思いきやgeoだったりするので、これは一度作成して、それの名前を見てみると良いかも。
    パラメータタイプは、ParametersPaneで、パラメータ名の上にマウスカーソルを置いてしばらく動かさないと確認可能。

  29. ノードのスクリプト化
  30. node.asCode()
    上記でそのノードの作成をスクリプト化出来る。
    基本的にはノードの作成、およびパラメータのセット、場所の決定などだが、
    よくわからない記述というか知らない関数などがチラホラ見えるので、場合によっては参考になる?

  31. アトリビュート(値)の取得
  32. node.geometry().attribValue(‘attribute_name’)
    →例えばprimとpointで名前かぶったりしたらどうなるんだろ?

  33. アトリビュートオブジェクトの取得
  34. attr = node.geometry().findGlobalAttrib(‘attribute_name’)
    →上記はdetailタイプのアトリビュートオブジェクトの取得。
    他にもfindPointAttrib, findPrimAttrib, findVertexAttribがある。

  35. アトリビュートオブジェクトを一括で取得
  36. attrs = node.geometry().pointAttribs()
    →hou.Attribオブジェクトのタプルが返ってくる。global, prim, vertexも当然ある。

  37. subunetを介して、inputを結ぶ
  38. subnet = node.createNode(‘subnet’)
    subnet_inside_node = subnet.createNode(‘null’)
    inputs = subnet.indirectInputs()
    subnet_inside_node.setInput(0, inputs[0])

    →subnetに必ずしも何かがささっている必要はない模様。

  39. Expressionとして値をセット
  40. node.parm(‘parm_name’).setExpression(‘$TX’)
    →文字列を要求するところに`opinputpath(“.”, 0)`みたいな値を入れる場合は文字列としての扱いになるので、要注意。
    値(数値?)を要求する場合のみsetExpressionを使用すると思われる。

  41. ディスプレイ、レンダリングフラグの設定
  42. node.setDisplayFlag(True)
    node.setRenderFlag(True)

     
    間違ってたらご指摘ください宜しくお願いします。

    何故スクリプトを書いたか、という話に関してはまたそのうち。
    結構ややこしい問題なのであれこれ書かないと説明できないです。
    気分が向いたらやります。

「[Houdini] HOMメモ」への2件のフィードバック

  1. おぉー すばらしい。これは為になる。

  2. >sugimuraさん
    どもですー。
    こういう地道な活動が後々効いてきたりしますからね、メモは大事だなーと思います。
    参考になったら幸いです:D

コメントを残す

メールアドレスが公開されることはありません。