Houdini 20.0 Pythonスクリプト

Pythonパラメータエクスプレッション

デフォルトのHScriptエクスプレッション言語の代わりに、Pythonでパラメータエクスプレッションを記述することができます。

On this page

パラメータエクスプレッション言語の設定

同じノードに異なる言語(HScriptとPython)のエクスプレッションを混在させることができます。ノードのデフォルト言語と違う言語を使用したパラメータは、ピンクでハイライトされます。

To...Do this

新しいエクスプレッションのデフォルト言語をグローバルに設定する

Edit ▸ Preferences ▸ Scripting を選択して、 Expression Language オプションを設定します。

アニメーションパラメータの言語を変更する

パラメータを右クリックして、 Expression ▸ Change Language to X を選択します。

ほとんどのエクスプレッションは、その2つの言語間では等価ではないので、言語を変更すると、エクスプレッションを変えない限りエラーが起こります。 とはいえ、hou.ch(), hou.bezier(), hou.cubic()などのいくつかのよく使用するエクスプレッション関数は、HScriptと同じ構文を使用するように設計されています。

ローカル変数

  • PythonでHScriptのローカル変数の値にアクセスするには、lvar("name") (hou.lvar())を使用します。例えば、$TXを取得するにはlvar("TX")を使用します。

    hou.lvar()関数は、HScriptのグローバル変数にアクセスすることができません(hou.expandString()を使用してください)。

  • ほとんどのSOPは、反復毎に変化するローカル変数を使用して、プリミティブ/ポイント毎に別々にパラメータエクスプレッションを評価します。lvar()を使用せずにPythonでこれらの類のエクスプレッションを記述するには、pwd().curPoint()pwd().curPrim()を使用して、現在のhou.Pointまたはhou.Primのオブジェクトを操作します。

    例えば、lvar("Cr")の代わりに、curPoint().attribValue("C")[0]を使用することができます。これは長ったらしいですが、柔軟性があり、ローカル変数では利用できないようなポイント/プリミティブの情報にアクセスすることができます。

文字列パラメータエクスプレッション

テキストパラメータにそのまま値を入れると、Houdiniは、その値を 文字列展開 します。 例えば、image$F.picimage1.picに展開します。しかし、エクスプレッションを使用して文字列を生成する場合、Houdiniはその結果を展開 しない ので、そのエクスプレッションに文字列展開と同じ事をする必要があります。 例えば、"image%d.pic" % frame()です。

単一行と複数行のパラメータエクスプレッション

単一行のパラメータエクスプレッションは、Pythonエクスプレッションとして評価されます。

パラメータ内で⌃ Ctrl + Eを使用して複数行エディタを開き、複数行のパラメータエクスプレッションを作成した場合、それは 関数ボディ として評価されるので、 returnを使用しなければなりません

例えば、単一行のエクスプレッションならch("ty") + 2と記述することができます。複数行のパラメータスクリプトは以下のように記述します(returnステートメントの使い方):

if ch("ty") == 0:
    return 0
if ch("ty") < 0:
    return ch("tx")
return ch("tz")

これで、パラメータスクリプトにPythonのフルパワーを使うことができます。 とはいえ、Houdiniは、あなたが想像している以上に頻繁にパラメータを評価する場合があることを意識しておいてください。

Note

hou.pwd()関数は、エクスプレッションを含むノード(つまり、エクスプレッションを評価するノード)を返すのであって、Houdiniの現行ノードを返すわけではありません。 同様に、hou.phm()はエクスプレッションを含むノード定義と関係のあるPythonモジュールを返します。

相対パラメータとノード参照をhou.ch()chhou.evalParm()などの関数内のパラメータエクスプレッションに使用することもできます。

評価されているhou.Parmへアクセスするにはhou.pwd().parm( expandString('$CH') )を使用します。$CHグローバル変数はチャンネル名を返します。

評価コンテキスト

  • Houdiniは、Pythonシェルで使用するグローバルネームスペースとは別のコンテキストで、Pythonパラメータエクスプレッション/スクリプトを実行するので、グローバルPython変数がパラメータエクスプレッションに影響を与えないか(その逆も然り)心配する必要はありません。

    実際にPythonパラメータエクスプレッションからグローバル変数にアクセスしたいのであれば、__main__をインポートすることで、HoudiniのグローバルPythonネームスペースにアクセスすることができます。 例えば、パラメータエクスプレッションでグローバルネームスペースのfoo変数にアクセスするには、__import__("__main__").fooを使用します。

  • Pythonパラメータエクスプレッション/スクリプトでは、HOM関数/クラス名の頭にhou.を付ける必要はなく、また、sessionモジュールのオブジェクトにはhou.sessionを付ける必要はありません。 さらに、Pythonのmathモジュールから一般的な数学関数をコールすることもできます。

    基本的には、以下のインポートを使ってコンテキスト内で実行します:

    from hou import *
    from hou.session import *
    from math import (
        acos, asin, atan, atan2, ceil, cos, cosh, degrees, exp, fabs,
        floor, log, log10, pow, radians, sin, sinh, sqrt, tan, tanh
    )
    
  • hou.expressionGlobals()を使用して、パラメータエクスプレッションのコンテキストを変更することができます。例えば、カスタム関数をすべてのパラメータエクスプレッションで利用可能にすることができます:

    # これは、$HOUDINI_USER_PREF_DIR/pythonX.Ylibs/pythonrc.pyのようなスタートアップスクリプトで使用します。
    
    # clamp関数をパラメータコンテキストに追加します。
    def clamp(value, min, max):
        return (min if value < min else (max if value > max else value))
    hou.expressionGlobals()["clamp"] = clamp
    
    # pi変数をパラメータコンテキストで利用可能にします。
    from math import pi
    hou.expressionGlobals()["pi"] = math.pi
    
  • パラメータエクスプレッションでは、pwd()関数(hou.pwd())は、Houdiniの現行ノードではなく、そのエクスプレッションを含んだノードを返します。 同様に、hou.phm()は、そのエクスプレッションを含んだノードの定義に関連したPythonモジュールを返します。 また、相対パラメータとノード参照をhou.ch()hou.evalParm()などの関数内のパラメータエクスプレッションに使用することもできます。

ベクトルパラメータのエクスプレッション

エクスプレッションはベクトルコンポーネントに対して個々に適用されるので、エクスプレッションにチャンネルのベクトルインデックスを指定する方法が便利です。

vec_id = pwd().parm( expandString('$CH') ).componentIndex()
return vtorigin("/obj/obj1","/obj/obj2")[vec_id]
See also

Pythonスクリプト

はじめよう

次のステップ

リファレンス

  • hou

    Houdiniにアクセスできるサブモジュール、クラス、ファンクションを含んだモジュール。

導師レベル

Python Viewerステート

Pythonビューアハンドル

プラグインタイプ