April 03, 2015
マンガじゃない Houdini チュートリアル ーーカスタムめ二ューーー
皆さんはHoudiniでKeyをベイクしたいと思ったことはありませんか?
その答えは「やってはいけない!」だ! なぜならHoudiniはプロシージャルなワークフローを構築する為のソフトであってキーフレーミングとは非プロシージャンルな邪道なワークフローだからだ!!!
とは理想を言ってみても、現実的にはそう言う分けにも行かない事もあるわけで
今回はキーベイクのスクリプトをメニューのカスタマイズにより
パラメータ上で右クリックでその操作を行えるようにしてみましょう。

その答えは「やってはいけない!」だ! なぜならHoudiniはプロシージャルなワークフローを構築する為のソフトであってキーフレーミングとは非プロシージャンルな邪道なワークフローだからだ!!!
とは理想を言ってみても、現実的にはそう言う分けにも行かない事もあるわけで
今回はキーベイクのスクリプトをメニューのカスタマイズにより
パラメータ上で右クリックでその操作を行えるようにしてみましょう。
詳しくはヘルプのほうに載ってます。日本語バージョンもあります。
いろいろなメニューカスタマイズの方法が載っていますが、
その中で今回必要なのは PARMmenu.xml ファイルになります。
PARMmenu.xmlはHoudiniのインストール先にもありますがそっちを弄るのは自分を始め素人には
危険なのでお勧めできない。
なのでユーザーの作業ディレクトリ(大抵はユーザーフォルダ、ウィンドウズだとユーザー>ドキュメント)に新規テキストとかでPARMmenu.xmlと言うファイルを新たに作りましょう。

ファイルの内容はヘルプのフォーマットに従って以下のように書きます。
<separatorItem></separatorItem>
はメニュー内にラインを挿入します。別に無くてもよい。
<scriptItem id="key_baker"> </scriptItem>
こいつが作るメニューの本体です。この中に実行するラベルやスクリプトの設定をします。
idは適当で良いが他とかぶらない様に。
<label>Key Baker</label>
メニューに表示されるラベル名です。
<scriptPath>$HOME/houdini14.0/scripts/key_baker.py</scriptPath>
スクリプトの参照先です。 参照先にスクリプトファイルを置いてそれを実行することになります。
<scriptCode> <![CDATA[ ]]> </scriptCode>
これのCDATA[ ]内に直接スクリプトコードを書く方法もあるが
スクリプトを書き帰る度にイチイチHoudiniを立ち上げなおさないといけないので推奨しない。
とりあえずこれだけでメニューは作れます。パラメータを右クリックすると
一番下にKey Bakerがあるはずです。但し参照先にファイルが無いと選んでもエラー 。
とりあえず参照先の$HOME/houdini14.0/scripts/key_baker.pyを作りましょう。
$HOMEは多分ユーザーディレクトリ。
この中にスクリプトを書くわけですが、そのときにそのスクリプトが何処のパラメータ
から実行されたか知る必要があり、それがkwargs["parms"]になります。
とりあえずkey_baker.py内にprint kwargs["parms"]と書いて
適当なパラメータからニューを実行してみましょう。
(<hou.Parm tx in /obj/geo1>,)のような感じでpython shellとかに返されると思います。

ベクターパラメータなどの上で実行すると
(<hou.Parm tx in /obj/geo1>,<hou.Parm ty in /obj/geo1>,<hou.Parm tz in /obj/geo1>,)
いろいろなメニューカスタマイズの方法が載っていますが、
その中で今回必要なのは PARMmenu.xml ファイルになります。
PARMmenu.xmlはHoudiniのインストール先にもありますがそっちを弄るのは自分を始め素人には
危険なのでお勧めできない。
なのでユーザーの作業ディレクトリ(大抵はユーザーフォルダ、ウィンドウズだとユーザー>ドキュメント)に新規テキストとかでPARMmenu.xmlと言うファイルを新たに作りましょう。
ファイルの内容はヘルプのフォーマットに従って以下のように書きます。
<?xml version="1.0" encoding="UTF-8"?> <menuDocument> <menu> <separatorItem></separatorItem> <scriptItem id="key_baker"> <label>Key Baker</label> <scriptPath>$HOME/houdini14.0/scripts/key_baker.py</scriptPath> </scriptItem> </menu> </menuDocument> |
<separatorItem></separatorItem>
はメニュー内にラインを挿入します。別に無くてもよい。
<scriptItem id="key_baker"> </scriptItem>
こいつが作るメニューの本体です。この中に実行するラベルやスクリプトの設定をします。
idは適当で良いが他とかぶらない様に。
<label>Key Baker</label>
メニューに表示されるラベル名です。
<scriptPath>$HOME/houdini14.0/scripts/key_baker.py</scriptPath>
スクリプトの参照先です。 参照先にスクリプトファイルを置いてそれを実行することになります。
<scriptCode> <![CDATA[ ]]> </scriptCode>
これのCDATA[ ]内に直接スクリプトコードを書く方法もあるが
スクリプトを書き帰る度にイチイチHoudiniを立ち上げなおさないといけないので推奨しない。
とりあえずこれだけでメニューは作れます。パラメータを右クリックすると
一番下にKey Bakerがあるはずです。但し参照先にファイルが無いと選んでもエラー 。
とりあえず参照先の$HOME/houdini14.0/scripts/key_baker.pyを作りましょう。
$HOMEは多分ユーザーディレクトリ。
この中にスクリプトを書くわけですが、そのときにそのスクリプトが何処のパラメータ
から実行されたか知る必要があり、それがkwargs["parms"]になります。
とりあえずkey_baker.py内にprint kwargs["parms"]と書いて
適当なパラメータからニューを実行してみましょう。
(<hou.Parm tx in /obj/geo1>,)のような感じでpython shellとかに返されると思います。
ベクターパラメータなどの上で実行すると
(<hou.Parm tx in /obj/geo1>,<hou.Parm ty in /obj/geo1>,<hou.Parm tz in /obj/geo1>,)
と帰ってきます。パラメータが一つだろうが複数だろうがリストで帰ってくるのでループの実行がしやすいです。
とかやるとパラメータの数値が123になるようなメニュースクリプトになります。
なので僕が以前書いたシェルフツールのキーベイク用スクリプトがあるのですが
それを改造して
と書きます。パラメータを選ぶFromListを開かなくて良い分スッキリする。
これで適当なエクスプレッションカーブやキーフレームに実行するとキーをベイクする事が出来ます。

parm = kwargs["parms"]
parm[0].set(123) とかやるとパラメータの数値が123になるようなメニュースクリプトになります。
なので僕が以前書いたシェルフツールのキーベイク用スクリプトがあるのですが
それを改造して
parm = kwargs["parms"] framerange = range(int(hou.expandString('$RFSTART')), int(hou.expandString('$RFEND')) + 1 ) for i in parm: if i.isTimeDependent() == 1: keyVals = {} for kf in framerange: keyVals[kf] = i.evalAtFrame(kf) i.deleteAllKeyframes() for kf in framerange: setKey = hou.Keyframe() setKey.setFrame(kf) setKey.setValue( keyVals[kf] ) i.setKeyframe(setKey) |
これで適当なエクスプレッションカーブやキーフレームに実行するとキーをベイクする事が出来ます。