kick the base

Houdiniと、CG技術と、日々のこと。

Houdini: PythonでHExpression付きTransform SOPを生成する

前回(Houdini: Pythonでノード操作してみる。)に引き続きPython製の小さなツールを作っていきます。Houdiniでジオメトリ操作をするときによくやる操作を自動化しましょう。シェルフへのツールの登録方法などは前回の記事を参考にしてください。

作成するツールは下記の3種です。

  • オブジェクトを接地させる
  • オブジェクトを原点に移動させる
  • バウンディングボックスのセンターへピボットを移動

全ツールに共通する挙動は下記の通りです。

  • Transform SOPを生成、選択(複数可)したノードに接続します
  • Transform SOPのチャンネルに任意の値をセットします
  • 安全装置として、ノードを選択していないときは処理を抜けます

本記事を作成するにあたり、Houdini実践ハンドブックWrangle×Pythonに大きなインスパイアをいただきました。

こちらの書籍については後日レビューを絶対書きます!!

また本ツールを作成するにあたり、上記書籍の筆者である蒸留水さんにアドバイスをいただきました。詳しくは後述しますが、ハマった部分だったので大変助かりました。この場を借りてお礼申し上げます。

目次

オブジェクトを接地させる

f:id:kickbase:20170619144118g:plain

仕組みとしては簡単です。TransrateチャンネルのY座標に-$YMINをセットします。$YMIMオブジェクトのバウンディングボックスを参照し、Y軸方向の最小値を返すローカル変数です。その値に-1をかけてあげれば逆方向に移動させることができます。

f:id:kickbase:20170619144322j:plain

コードは下記のとおりです。

オブジェクトを原点に移動させる

f:id:kickbase:20170619143458g:plain

Transrateチャンネルに-$CEX-$CEY-$CEZをセットします。これはオブジェクトの中心座標にそれぞれ-1をかけたものになります。今まで移動してきたものをキャンセルするイメージといえばよいでしょうか。動画にある通り、間にどれだけノードが接続されていてもOKなので便利ですね。

コードは下記のとおりです。

バウンディングボックスのセンターへピボットを移動

f:id:kickbase:20170619143907g:plain

Pivotチャンネルに$CEX$CEY$CEZをセットします。ピボットの座標にオブジェクトの中心座標を代入しているわけです。File SOPなどでインポートしたオブジェクトのピボット位置がずれてしまっている場合などに有効かと思います。

マニピュレータを表示した画像を貼っておきましょう。

これが

f:id:kickbase:20170619143646j:plain

こうなります

f:id:kickbase:20170619143700j:plain

コードは下記のとおりです。

コードの簡単な解説

「オブジェクトを接地させるコード」、touch_down.pyを元に簡単な解説を行います。

  1. 1行目: 現在選択中のノードを取得し、変数selectedNodeに代入します
  2. 3行目: 選択したノード数の判定を行っています。ここではノード数がゼロの時(つまり選択していない時)は処理を抜けるようにしています
  3. 4行目: 選択したノード全てにforループで処理を行います
  4. 5行目: Transform SOPを生成します
  5. 6行目: Transform SOPに選択ノードを接続します
  6. 7行目: ネットワークエディタ上のTransform SOPの位置をいい感じにします
  7. 8行目: Transform SOPの各チャンネルに値をセットします

ここで重要なのは8行目です。実際のコードではコーディング規約であるPEP8により途中で改行を入れていますが、ワンライナーで書くと下記のようになります。

transformNode.parm('ty').setExpression('-$YMIN', language=hou.exprLanguage.Hscript)

このsetExpressionメソッドを知らなかったために泥沼に入っていました。特に第2引数の言語指定がポイントですね。

一連の過程のツイートを貼っておきます。

Pythonの書き方そのものは分かるんですが、HOM(HoudiniのAPI)の勉強が足りないですね。精進精進。

ディスプレイフラグオン、レンダリングフラグオン、ノードの選択まで行いたい方へ

僕の使用法とは異なりますが、Transform SOPを作成後ディスプレイフラグオン、レンダリングフラグオン、ノードの選択まで行いたい方もおられると思います。

参考のためそちらもご紹介しておきます。(touch_down.pyのみ)ポイントは選択ノードがひとつだけのときだけ処理を行うようにしているところです。

10~12行にフラグオン、ノード選択のコードを追加しています。

備考: プリセットを利用する

本ツールを作成しなくても、Houdiniの基本機能であるプリセットを利用することで事前に用意していたチャンネル構成を呼び出すことができます。

f:id:kickbase:20170619143336g:plain

プリセットの作成方法については杉村昌哉さんのHoudiniワークショップで学んだ内容なのでここでは記載しませんが、本当に素晴らしい内容だったのでもし次回開催されるようでしたらぜひ受講したいと思っています。

まとめ

いかがでしょうか。今回作成したツールも前回同様どれも小粒なものですが、非常に多用する操作なので自動化の恩恵を受けることができると思います。

よくやる作業は自動化して、クリエイティブな作業に集中できるとよいですね。