kick the base

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

Houdini: Attribute Wrangleをホットキー1発でつくる方法色々

Attribute Wrangle(Point Wrangle/Primitive Wrangle/etc...)、使ってますか?Houdinistなら作らない日はないんじゃないかと思うほど使用頻度の高いノードですよね。

そう。始まりはこのツイートでした。

ここを起点にさまざまな知見が集まりましたので、感謝と後人のご参考を兼ねてまとめておきます。

目次

pwr

3文字ですがPoint WrangleとPrimitive Wrangleまで絞り込めるのはよいですね。会話でも出ましたがAttribute WrangleはPoint WrangleとPrimitive Wrangle、どちらの性質も持っています(というよりそれらはAttribute Wrangleのオプション違い)のでひとつで事足りるのですが、Point WrangleやPrimitive Wrangleを使用するとノード名でRun Overが明示されるのでよりネットワークの意図が伝わりやすくなります。

atw

Attribute Wrangleに集約する方法です。左手だけで入力できるというのはメリットですね。またよりタイプが少ないaw派もおられました。

ホットキー設定派

こちらが今回のお話のメインです。 作り方としてはシェルフにToolを作成し、Hotkeysタブからホットキーを設定します。

f:id:kickbase:20200219104236j:plain

シェルフにToolを登録する方法については以前書いた記事をご参考ください。

またノードの作成をホットキーに登録する汎用的な方法はUnlimitedEffectWorks (@ijiVFX)さんがまとめてくださっていましたのでご紹介しておきます。

拙作Tools

面白そうなので作ってみました。

01: create_attribute_wrangle.py

シンプルなやつ。

f:id:kickbase:20200219103756g:plain

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

動画をご覧の通り複数ノード選択時の挙動が微妙ですね。その際はまとめてAttribute Wrangleに入力してほしいものです。

02: create_attribute_wrangle_multi.py

01を改良したもの。

f:id:kickbase:20200219104434g:plain

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

Attribute Wrangleの入力上限4つまで勝手に繋いでくれます。またノードの生成位置ですが、選択したノード(群)のポジションを利用し、横方向は平均値を、縦方向は一番下の位置から少し下あたりに置いてます。

上記コードの注意点

ノードを選択していない状態の空振り対策は入っていますが、コンテキストが異なっていてAttribute Wrangleが作れない場所で実行してしまうとエラーが出ます。 回避するためにはコンテキスト判定のコードを入れるか、雑にtryexceptを挟んで上げても良いでしょう。ちょっと大げさなのとコンテキスト違いでの操作は想定しにくいので入れていませんが、一例をあげると下記のような感じでしょうか。

selNodes = hou.selectedNodes()
INPUT_LIMIT = 4

if(selNodes):
    try:
        attribWrangle = selNodes[0].parent().createNode("attribwrangle")
        pos = []

        for i, node in enumerate(selNodes):
            if i < INPUT_LIMIT:
                attribWrangle.setInput(i, node)
                pos.append(node.position())

        posX = sum([x[0] for x in pos])/len(pos)
        posY = min([x[1] for x in pos])
        attribWrangle.setPosition(hou.Vector2(posX, posY-1))
        panel = hou.ui.paneTabOfType(hou.paneTabType.NetworkEditor)
        panel.setCurrentNode(attribWrangle)
    except:
        pass

soptoolutilsを利用する

こちらは初めて知ったのですが、非常に便利なモジュールだったのでご紹介しておきます。

短いコードで実装されていますね!そしてコンテキスト違いでの使用時(例えばobjレベル)にもエラーを吐かず気を利かせた挙動をしてくれます。

f:id:kickbase:20200219105539g:plain

すばらしい。

soptoolutilsについては大翔士 (@d658t) さんが解説してくださいました。勉強になります!

まとめ

ツールを作っておいてアレですが、ぼくは基本デフォルト厨なのでatw派に落ち着きそうですw

しかしHoudiniのシェルフは非常にポータブルなのでツールをガンガン作っても良いですし、思考実験としてこのようなツール・効率化談義は非常に有用かと思います。(soptoolutilsなども今回はじめて教えていただきましたし)

Houdiniは操作速度を競うようなツールではありませんが、日々のストレスが減るのであればもちろん改良すべきです。

Houdini: ホットキーをカスタマイズして快適になった話の記事で設定したCopy parameterPaste Rerative Referencesなどはデフォルトでアサインしていただきたいくらい便利です。

みなさんもカスタマイズとメンテナビリティをバランスよく、快適なHoudiniライフを!