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_outputmode0の時、Houdiniはこのプログラムを起動してスクリプトの出力をそのプログラムに渡します。

soho_diskfile

soho_outputmode1の時、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

レンダリング

Mantraユーザガイド

基本

ライティング

次のステップ

導師レベル

他のレンダラー