NukeとPythonの連携。 | 世界的日曜WEBプログラマー日記

世界的日曜WEBプログラマー日記

一年後に世界的なWEBサービスを運営するにはどうすればいいのか書いていく(予定)

Nukeというハリウッドも使う合成ソフトウェアがある。Pythonをスクリプト言語として採用しているのと、Linuxをプラットフォームとしてサポートしているので、サーバーサイドとして色々なことで使えそうだ。

例えばナイスなロジックを第三者に書いてもらって、Pythonを使ってそのNukeファイルを呼び出しうて随時画像に適用する、なんてことが出来る。

例えば以下のような処理をNukeで定義。



上記ロジックはsimpleblur.nkとしてSaveしておく。

さて、上記ロジックを
1. food_picture.jpgに適用
2. 追加のブラー処理も加えたい。
3. out.jpgで出力(Saveしたい)

という場合、次のように書けばいい。

import nuke, sys

def make_connect( _from, _to ):
_to.setInput(0, _from)

def my_blur( _from, _to ):
b1 = nuke.nodes.Blur( size = 20)
b2 = nuke.nodes.Blur( size = 30)
b3 = nuke.nodes.Blur( size = 40)
l = [ _from, b1, b2, b3, _to ]
prev = l[ 0 ]
for n in l:
make_connect( prev, n )
prev = n

def main():
# load nuke script.
nuke.scriptOpen( sys.argv[ 1 ] )

input_file = nuke.nodes.Read(file="/home/maishoku/Desktop/food_picture.jpg")
output_file = nuke.nodes.Write(file="/home/maishoku/Desktop/out.png")

_input = nuke.toNode( 'ColorCorrect1' )
_output = nuke.toNode( 'Output1' )

make_connect( input_file, _input )
# ----- what you want in this script
my_blur( _input, _output )
# -----
make_connect( _output, output_file )

nuke.render( output_file, 1, 1 )
print "hello world"

if __name__ == '__main__':
main()


あとは、次のように実行すれば良い。
$ ./Nuke7.0v9/Nuke7.0 -t nuketest.py simpleblur.nk


読み込みファイル、出力画像ファイルはソースコード内でベタ書きでかいたけど、Pythonだからsys.argv[2], sys.argv[3]などでファイルパスを指定すればいい。
なんて素晴らしいんだ!

Nukeの考え方としてはパイプのように次々と処理をつなげていく事。
setInputという関数がつなげていく処理を示している。特定のノードを選択肢たい場合は、nuke.toNodeで指定する。

まぁ、ともかくNukeはPythonが使えていい!
Mayaとかそのソフトだけしか使えないような言語(MELスクリプト)とか覚える気がまったくしない。。

株式会社OctOpt
コンピューターサイエンス会社OctOptの技術公式ブログ
等々力 康弘
@rocky_house