2010-11-23

python on Nuke

Nukeでのpythonについて。
まずは、簡単なところから・・・

適当にUIを変更してpythonを編集しやすいようにしておく。 フレームの適当なところで右クリックすると、カスタマイズや追加できるwindowが出るので、その中から「Script Editor」を選んで、pythonをいじれるように調整する。




Script Editorは上がOutput(結果等が表示される)で、下がinput(実際にコードを書いて実行するところ)だ。


 また、PreferenceのScript Editorのタブで「echo python commands to output window」にチェックを入れておけば、全てではないがオペレーションがOutputに反映されるので、ある程度参考にはできる。ただmayaとかの同様の機能ほど優秀でないので、その都度リファレンスなどを見ながら欲しいコマンドを探す必要はあるw

準備が整ったところで、とりあえずpythonで適当な操作を・・・

とりあえず、たとえば新規でBlurノードを作ってみる。

nuke.hogehogehoge.....

というような感じで「nuke.」から始まるコマンドでNuke内のコマンドを呼び出せる。
新たにノードを呼び出し作成する場合は「createNode('hoge')」を用いる。Blurノードを呼び出しければ、

 nuke.createNode('Blur')

を実行すれば


こんな感じで output window に結果が表示され、NodeGraphにBlur1という新たなBlurノードが確認できる。

次に、たとえば、ノードのアトリビュートを操作してみる。まずは、 このBlurノードの[size]の値を取得してみる。「nuke.」の後ろに、ノード名を指定してさらに、そのアトリビュート、この場合[size]の値を・・・という感じで、上から順に重ねていく。実際には・・・

nuke.toNode('Blur1').knob('size').value()

となる。通常ではこの頭に「print」などを付けて値をアウトプットさせるということが多いと思う。付けなくてもoutput windowには表示されるが・・・


値を変更したい場合は「setValue()」をもちいて、

 nuke.toNode('Blur1').knob('size').setValue()

とする。実際には、 「setValue()」の括弧の中に数値などを挿入する。

  nuke.toNode('Blur1').knob('size').setValue(3)
 
こんな感じ。すると・・・


こんな感じで値が変更される。

さらに例えば選択しているノードは

nuke.selectedNode()

と書き表され、Blurノードを選択した状態で

sn = nuke.selectedNode()
sn.knob('size').setValue(10)

とやってみると・・・


となり、選択していた「Blur1」ノードのサイズが変更できた。

もちろん

nuke.selectedNode().knob('size').setValue(0)

とすることも可能だ。

複数選択すると、選択したノードがいわゆる「タプル型」で格納されるので、全てには「setValue()」の値が反映されない。
タプル型というのは リスト のようなものを想像してもらえればわかりやすいと思う。そのリストにあげられた、何番目のノードに対してコマンドを実行するのか?ということを宣言してあげないといけない。このあたりはまた次回説明する。

補足; toNode() だとか、selectedNode() または、createNode() ってのが ある って覚えておけば、それで問題ないかと。

ツールについて

AOVを散々押してきたけど、ちょっと考えが変わりつつある。

AOVはファイル管理がとてもしやすい。反面、パスを追加だとか、このパスだけ修正というのが、面倒になる。できないってわけでなく面倒・・・
ただ、面倒か面倒でないかってのは、割と最重要項目ではある。NukeはフォルダをNodeGraphにドラッグアンドドロップしてやれば、中に入ってるものはとりあえず、何でもかんでも読もうとする。ファイル名を後ろから読んで最初の  .(ドット) を見つけるまでを拡張してみなし、さらに、その先に(後ろ読みの)数字があれば連番と判断する。

なので、1フォルダに、数種類の連番ファイルが合ってもなんら問題ない。連番の尺が異なっていても問題ない。これは本当に便利。

AEでもこうならないかなぁ・・・ ってよくよく思う。

今ウチでは、こうやって、何でもかんでも入ってるフォルダを連番ごとにサブフォルダに仕分けするツールを使って、これを何とか解消しているが・・・ まぁNuke方式が便利である。

と、脱線はしたけど、ナンデモカンデモ入ってるフォルダでもNukeは受け付けてくれるので、実はAOVでファイルをまとめなくてもいけたりする・・・ ファイルトラフィックなど考えるとAOVの方が有利でもある気もするが・・・

ただ、ソフトウェアまたがって一つのAOVにまとめることなんてできないんで、結局は、チャンネルごとのファイルをNukeに一気に読み込んで、それらを ShuffleCopy で束ねる方がイロイロと便利な面もある。
で、今はこのツールを作りたいと思っている。 ShuffleCopy を使って自動で束ねるツール。
これができれば、このアイデアでたとえば、3Dソフトウェアからレンダリングボタンを押すと自動的に、Nukeでパスのコンポジットを行ってくれるツールとか。これはあくまで、雛形となるnukescriptの構造ありきだけど・・・

でも、レンダリングボタンをポチって押して、Nukeでビューティーを再構築したコンプ画像が出れば、イロイロと便利だ。ライティングに変更を加えるべきか、たとえば、Gradeノードで修正するべきかをすぐに判断できる・・・ まぁ、単純にNukeを一緒に開いておいて、リロード掛ければいいだけかもしれないけどw

ただ、面倒か面倒じゃないかっていうのは割りと重要で・・・