On this page |
概要 ¶
Houdiniは現在ではSOHO(Scripted Output of Houdini Objects) Pythonバインディングを通してレンダラーと通信します。レンダラーすべてが、パラメータ定義と評価のために、同じプロセスを使います。MantraとRenderMan出力ドライバは現在では単にPythonスクリプトのフロントエンド(ユーザインターフェース)で、デジタルアセットになっています。各レンダラーにはそれ独自のパラメータ定義とバインディングをPythonマッピングによって追加することができます。
SOHOには主に2つメリットがあります:
-
別のレンダラー用に新しくレンダー出力ノードを定義するのが簡単です。SOHOには、レンダラー固有のファイルフォーマットを出力するのに必要な情報をHoudiniに問い合わせるインターフェースがあります。
-
新しくレンダーノードを作成して
soho_program
パラメータ(以下参照)をカスタマイズすることでレンダー出力の生成をカスタマイズすることができます。いくつかのケースで、これは、ライト、カメラ、レンダーノードにレンダリングプロパティを追加するよりも便利で柔軟性があります。
SOHOインターフェースは、ジオメトリ、オブジェクトトランスフォーム、レンダリングプロパティをレンダラーに送信するために使います。それぞれサポートされているレンダラーには事前定義済みのレンダリングプロパティ一式があります。オブジェクトにそれらのプロパティのどれかをユーザパラメータとしてもっていれば、その値がレンダラーに送信されます。
“Edit Rendering Parameters”インターフェースを使ってオブジェクト(マテリアル)に追加可能な事前定義済みレンダリングパラメータ一式があります。これらのパラメータはHoudiniインターフェースからレンダラーのプロパティの1対1のマッピングに対応しています。
SOHOは、シェーダとレンダリングプロパティを処理するマテリアルワークフローを新しく作ります。詳細は、マテリアル、プロパティの上書きのヘルプを参照してください。
SOHOレンダラープロパティのデフォルト値はターゲットのレンダラーのデフォルト値に対応します。プロパティの値がデフォルト値のままであれば、プロパティは通常はレンダラーの入力ストリームに書き出しません。
Note
デフォルト値を変更することは、お勧めしません。その理由は、SOHOとレンダラーがもはや同じ値にならなくなるからです。
どのように動作するのか ¶
Mantraレンダー出力デジタルアセットのType Propertiesを見ると、soho_program
というパラメータが不可視になっているのがわかります。このパラメータにはHoudiniが出力ファイルを書き出すPythonスクリプトが含まれています(Mantraドライバの場合、IFDファイル)。
Pythonスクリプトには以下のようなコードが含まれています:
value = obj.getDefaultedFloat('vm_displacebound', 0.0)
(またはプロパティのバッチ評価)SOHOプログラムがこのようなパラメータを評価すると、プロパティの継承順を適用します。つまり、より具体的に定義したプロパティ(例えば、シェーダ上で定義)はより幅広く定義したプロパティ(例えば、出力ドライバノード上で定義)よりも優先順位が高いです。
SOHOのAPIと実装は$HFS/houdini/soho
のPythonスクリプトフォルダにあります。
SOHOの生成プロセスを制御するには、次のパラメータを使うことができます。
soho_program
実行するPythonスクリプト。このスクリプトには、import soho
を記述することでSOHO APIを使ってHoudiniからデータを取得することができます。
soho_outputmode
スクリプトの表示する出力の扱い方。
0
soho_pipecmd
パラメータ(以下参照)で参照されるパイプコマンドに出力を送信します。スクリプトの出力を他のコマンドに渡したいときは、このモードを使います(例えば、他のスクリプトやレンダラー自身)。
1
soho_diskfile
パラメータ(以下参照)で参照されるファイルに出力します。スクリプトの出力をファイルに書き出したいときは、このモードを使います。
2
stdout
で何も特別なことはしません。Houdini側ではなくスクリプト側でどうやって、どこに出力するのか決めたいのであれば、このモードを使います。
soho_pipecmd
soho_outputmode
が0
の時、Houdiniはこのプログラムを起動してスクリプトの出力をそのプログラムに渡します。
soho_diskfile
soho_outputmode
が1
の時、Houdiniはスクリプトの出力をこのファイルに出力します。
soho_compression
スクリプトファイルを記述した時に使用する圧縮タイプ。指定可能な値:
none
圧縮なし。
ext
soho_diskfile
のファイル拡張子を使用して、圧縮タイプを判断します。ファイル拡張子が.sc
なら、BLOSC圧縮が使用されます。ファイル拡張子が.gz
なら、gzip圧縮が使用されます。
soho_force_compression
パラメータを設定しない限りは、圧縮は、ディスクファイルに書き出した時にだけ実行されます。
soho_force_compression
たとえパイプへ書き出す時でも、強制的にsoho_compression
プロパティの評価をします。
soho_foreground
trueなら、スクリプトが完了するまでHoudiniをブロックします。これは、複数フレームをレンダリングするときに、自動的にフレームすべてが同期してレンダリングされてしまうのを防止します。
soho_initsim
trueなら、Houdiniはシミュレーションノードを初期化します。これは、パーティクルすべてとダイナミクスネットワークが最初のフレームから現在のフレームまでクッキングを開始するようにします。
これは、どのフレームをレンダリングするのか制御しているときに使います(以下のsoho_multiframe
を参照)。フレーム30をレンダリングしてからフレーム31をレンダリングするなら、simを初期化したくありません(その結果、フレーム1から30まで再シミュレーションします)。一方で最初にフレーム31をレンダリングしているなら、フレーム31のシミュレーションの状態を適切にセットアップするためにsimを初期化したいでしょう。
soho_multiframe
オフ(デフォルト)の時、Houdiniはフレーム毎に別々にスクリプトを実行します。このパラメータをオンにすると、スクリプトは1度だけ実行され、スクリプトはフレーム範囲そのもののレンダリングの役割を担います。
soho_previewsupport
オフ(デフォルト)の時、 Render to MPlay ボタンを隠します。
利用可能なプロパティすべてを表示する方法 ¶
レンダリングプロパティに関する情報は、レンダリングプロパティのドキュメントを参照してください。
Mantraが知っているプロパティのリストを出力するには、ray_show
コマンドを使用します。これは出力するプロパティのカテゴリを引数として受け取ります。
echo ray_show device | mantra echo ray_show global | mantra echo ray_show object | mantra echo ray_show light | mantra echo ray_show image | mantra echo ray_show fog | mantra
コールバック ¶
SOHOはコールバックファンクションをサポートしています。または上級ユーザがレンダープロセスの低レベルパーツを修正、置換できるように フック します。
(Houdiniの以前のバージョンでは、SOHOの機能を変更する手段として“monkey patch”SOHOファンクションが可能でした。しかし、コールバックは、よりすっきりとして将来性のあるメソッドです。)
ドキュメントは、$HFS/houdini/soho/IFDhooks.py
や$HFS/houdini/soho/RIBhooks.py
を参照してください。
サンプルのフックファイル:
''' IFDuserhooks.py IFDhooksの機能について説明した簡単な例 ''' import traceback from IFDapi import * def pre_lockObjects(parmlist, objparms, now, camera): ''' SOHOがオブジェクトをロックする前にコールされます。 これにより、SOHOから見えるオブジェクトを変更することができます。''' ray_comment('IFD Hook - rendering from camera: %s' % repr(camera)) return False def pre_render(camlist, now, objlist, lightlist, spacelist, foglist, fromlight, forphoton, cubemap, photoncam): '''画像がレンダリングされる前にコールされます。''' ray_comment('IFD Hook - Render at time: %g %s' % (now, repr(camlist))) return False '''このファイル内のフックのリスト。''' _HOOKS = { 'pre_lockObjects' : pre_lockObjects, 'pre_render' : pre_render, } def call(name='', *args, **kwargs): '''コールバック関数をフックします。''' method = _HOOKS.get(name, None) if method: try: if method(*args, **kwargs): return True else: return False except Exception, err: ray_comment('Hook Error[%s]: %s %s' % (name, __file__, str(err))) ray_comment('Traceback:\n# %s\n' % '\n#'.join(traceback.format_exc().split('\n'))) return False
See also |