Houdini 18.5 リファレンス

エクスプレッションクックブック

エクスプレッションを記述して色々なエフェクトを表現するためのTipsとテクニック。

On this page

概要

Houdiniでは、パラメータやVEXスニペット内にエクスプレッションを使用することで、ちょっとした数学だけで複雑で面白い効果を表現することができます。 このページでは、エクスプレッションに使用するいくつか役立つ数式とテクニックを紹介します。

  • HScriptエクスプレッションの基本は、エクスプレッションを参照してください。VEX言語に関する詳細は、VEXを参照してください。

  • このページに載せているエクスプレッションでは、パラメータの値にアクセスするためのch関数がよく使われています。エクスプレッションで使用できる独自のパラメータをセットアップする方法は、Spareパラメータを参照してください。

  • 将来のバージョンのHoudiniは、HScriptエクスプレッションでローカル変数を修正することができる一方、ユーザがVEXを使ってジオメトリを修正できるように進めていきます。その理由は、VEXの方が高速だからです。

チャンネル索引

タイプ

Hscriptエクスプレッション

VEX

int

ch

chi

float

ch

chf

string

ch

chs

ramp

chramp

chramp

vector

chv

同義と相違

エクスプレッション

VEX

現行フレーム

$FF or @Frame

@Frame

現行時間

$T or @Time

@Time

境界ボックス

$BBX, $BBY, $BBZ

relbbox(0,@P).x, relbbox(0,@P).y, relbbox(0,@P).z

重心

$CEX, $CEY, $CEZ

vector cent = getpointbbox_center(0);
// cent.x, cent.y, cent.z

サイズ

$SIZEX, $SIZEY, $SIZEZ

vector size = getbbox_size(0);
// size.x, size.y, size.z

コーナー

$XMIN, $YMIN, $ZMIN, $XMAX, $YMAX, $ZMAX

vector min; vector max;
getbbox(0, min, max);
// min.x, min.y, min.z, max.x, max.y, max.z

累乗

^

pow

三角関数

ラジアン

radians関数を使って、度をラジアンに変換することができます。

乱数

  • HScriptとVEXでのランダム化のサンプルは、$HH/help/files/RandomExample.hipを開いてください。

エクスプレッション

VEX

rand(seed)

random(seed)

rand(@ptnum), rand($F)

random(@ptnum), random(@Frame)

rand関数に同じシード値を与えると、常に同じ数値を返します。それにより、"ランダムな"値がプレイバック間で繰り返し可能になります。 とはいえ、色々なポイント/パーティクル/オブジェクト/フレームなどが、違ったランダム値を必ず取得するようにするには、そのシード値を変化させなければなりません。

乱数シードの選択

通常ではシード値に現行フレーム番号($F)を使います。しかし:

  • サブフレームプロセスで乱数が必要な場合は、$Fの代わりに浮動小数点フレーム番号$FFを使います。

  • 2つ以上の乱数、例えばランダムなカラーとしてR,G,B値が必要な場合は、各randコールには、$Fを乗算したり加算して異なるシード値、例えばrgb(@Frame, @Frame * 10, @Frame * 100)を設定します。そうしないと、各コールは同じ数値を返すのでカラーがグレーになってしまいます。

  • 乱数の範囲を-XからXにしたいのであれば、rand(seed) * (2 * X) - Xを使用します。

  • 乱数の範囲は0-1です。fit01(n, newmin, newmax)関数を使えば、乱数を異なる範囲にマッピングすることができます。

    fit10関数も同様ですが、そのマッピングが逆です。例えば、fit10(.3, 5, 20) == 15.5

    fit(n, oldmin, oldmax, newmin, newmax)は、任意の数値をある範囲から別の範囲にマッピングすることができる汎用的な形式です。例えば、fit(3,1,4,5,20) == 15

    これらのfit関数は、HScriptエクスプレッション言語とVEXの両方に存在します。

ジオメトリ上の値をランダム化

以下のエクスプレッションは、フレーム毎にすべてのプリミティブのカラーをランダムにします。

HScriptエクスプレッション:

rand(@primnum * @Frame)
rand(@primnum * 10 * @Frame)
rand(@primnum * 100 * @Frame)

VEX:

@Cd.r = random(@primnum * @Frame);
@Cd.g = random(@primnum * 10 * @Frame);
@Cd.r = random(@primnum * 100 * @Frame);

値を周期化

  • HScriptとVEXでの値の周期化のサンプルは、$HH/help/files/ModulusExample.hipを開いてください。

剰余演算であるa % bは、HScriptエクスプレッション、VEX、Python共に同じです。これはabで割った時の余りを返します。 これは、どんどんと増えていく値(例えば、フレーム番号)を指定すると、ある範囲の値を繰り返す値を生成することができるので非常に役に立ちます。

Note

剰余演算子を浮動小数点の値に使用すると、予期しない結果を招く可能性があります。例えば、3.14 % 10.14を返し、34.999 % 54.999を返します。

例:

$F

0

1

2

3

4

5

6

$F % 3

0

1

2

0

1

2

0

波紋

  • HScriptとVEXでの波紋のサンプルは、$HH/help/files/RippleExample.hipを開いてください。

数学的に放射状の波紋を取得するには、サーフェスの中心から点までの距離をサイン関数に使用して、ポイントの位置の高さを変更します。

Position Y

sin(sqrt(($BBX - 0.5) ^ 2 + ($BBZ - 0.5) ^ 2) * 1080)

これをアニメーションさせるには、時間ベースの変数をエクスプレッションに追加します:

Position Y

sin(sqrt(($BBX - 0.5) ^ 2 + ($BBZ - 0.5) ^ 2) * 720 + $F*4)

円弧、円、螺旋

  • HScriptとVEXでの円弧のサンプルは、$HH/help/files/ArcExamples.hipを開いてください。

sincosの関数を使うことで、円弧または円の経路上の位置を生成することができます。

Position X

cos(@ptnum * 2)

Position Z

sin(@ptnum * 2)

(これは、面白い効果を作成するのに役立ちますが、Circle SOPで円弧や円を作成することで同様の効果を表現できることがよくあります。例えば、多角形の円を作成し、その円のポイントにアイテムをコピーすることで、アイテムを円状に配置することができます。)

XYZの3軸のうち2つの軸方向にsincosを使用して3次元的に位置を上げていくことで、螺旋を作成することができます。

X

cos(@ptnum * freq) * amplitudeX + offsetX

Y

@ptnum * amplitudeY

Z

sin(@ptnum * freq) * amplitudeZ + offsetZ

VEXによる対数螺旋

  • このサンプルを試したいのであれば、$HH/help/files/logSpiral.hipを開いてください。

このサンプルでは、チャンネル参照を使用して、パラメータから値を取得しています。

// ポイント法線を露出させます。
@N = @N;

// 自然対数
float e = 2.718281828;

// 対数螺旋のポイント位置を計算します。
@P.x = chf("a") * pow(e, chf("b") * @ptnum * .001) * sin(@ptnum);
@P.z = chf("a") * pow(e, chf("b") * @ptnum * .001) * cos(@ptnum);

// 各インスタンスのだいたいのサイズを計算します。
@pscale = chf("sc") * chf("a") * pow(e, chf("b") * @ptnum * .001);

// ポイント位置に基づいてカラーテーブルを索引します。
@Cd = chramp("color_spectrum", @ptnum/(@numpt-1.0));

波形

  • HScriptとVEXでの波形のサンプルは、$HH/help/files/WaveFormExamples.hipを開いてください。

波形は、数学的に繰り返す配置、サイズ、モーションを生成するのに非常に役に立ちます。

ステップ関数

ステップ関数は、連続的な入力を受け取り、それを離散ステップの出力に変換します。

floor(@P.x * freq) * amplitude

サイン波

  • HScriptとVEXでのサイン波のサンプルは、$HH/help/files/SinFunctionExample.hipを開いてください。

sin(とcos)関数は、すべての種類の形状の作成に役立ちます。基本のsin関数を使用することで、直線やサーフェスを振動波に変換することができます。

幾何学的なサイン波の一般形式:

sin ( @P.x * frequency ) * amplitude + offset

波動に関しては、このエクスプレッションを使用することができます:

sin ( @Time * frequency ) * amplitude + offset

…意味:

@P.x

波の基準値: 波のジオメトリをアニメーションさせるなら、代わりに(@P.x + @Frame)を設定します。

frequency

波の数を制御します。これを境界ボックスの位置の$BBXに設定すると、直線の終わりに近づくほど周波数が高くなる波を作成することができます。

amplitude

波の高さを制御します。これを境界ボックスの位置の$BBXに設定すると、直線の終わりに近づくほど波を平坦にすることができ、現行フレームの@Frameに設定すると、アニメーションが進むほど波が大きくなります。

offset

波を"上"または"下"に移動させます。

他の波形

矩形波 は、2つの値の間を交互に繰り返します:

abs(floor(@P.x * freq + offset) % 2 * amplitude))

ノコギリ波 は、値を増加させてからリセットします:

@P.x - floor(@P.x)

三角波 は、線形的に上下に跳ね返ります:

abs(@P.x * freq % amplitude - 0.5 * amplitude)

ジオメトリ変形

  • HScriptとVEXでの変形のサンプルは、$HH/help/files/Deformation_Examples.hipを開いてください。

Point SOPでHScriptエクスプレッションを、またはAttribute Wrangle SOPでVEXを使用してポイントの位置を修正することで、 Shear(傾斜)、Taper(先細)、Twist(捻じれ)、Squash(押し潰し)、Bend(曲げ)などのジオメトリ変形をすることができます。

Note

Twist SOPを使った方が 非常に 簡単に一般的な変形を行なうことができます。 しかし、その単純な変形に対してカスタマイズや作り込みが必要であれば、それらのエクスプレッションを使用することができます。

VEXで$BBXに相当するのはrelbox(@P).xであることを忘れないで下さい。

X方向に 傾斜 させるには:

Pos X

@P.x + $BBY * ch("strength")

Y方向に 先細 させるには:

Pos X

@P.x * (ch("strength") ^ $BBY)

Pos Z

@P.z * (ch("strength") ^ $BBY)

HScriptでY方向に 押し潰し引き伸ばし をさせるには:

Scale X

1 / sqrt(ch("sy"))

Scale Y

ch("strength")

Scale Z

1 / sqrt(ch("sy"))

VEX:

v@scale = @scale;
@scale.x = set( 1/sqrt(ch("strength")));
@scale.y = ch("strength");
@scale.z = set(1/sqrt(ch("strength")));
@P.x *= @scale.x;
@P.y *= @scale.y;
@P.z *= @scale.z;

HScriptでY方向に 捻じれ させるには(ある軸でsin、他の軸でcosを使用):

Pos X

(@P.x - $CEX) * cos( ch("strength") * ($BBY - 0.5)) - (@P.z - $CEZ) * sin(ch("strength")) * ($BBY - 0.5)) + $CEX

Pos Z

(@P.x - $CEX) * cos( ch("strength") * ($BBY - 0.5)) - (@P.z - $CEZ) * cos(ch("strength")) * ($BBY - 0.5)) + $CEX

VEX:

v@min = {0.0, 0.0, 0.0};
v@max = {0.0, 0.0, 0.0};
getpointbbox(0, @min, @max);
v@cent = (@max + @min) / 2.0;
f@twistX = cos(radians(chf("strength")) * (relbbox(@P).y - 0.5));
f@twistZ = sin(radians(chf("strength")) * (relbbox(@P).y - 0.5));
@P.x = (@P.x - @cent.x) * @twistX - (@P.z - @cent.z) * @twistZ + @centroid.x;
@P.z = (@P.x - @centroid.x) * @twistZ + (@P.z - @centroid.z) * @twistX + @centroid.z;

HScriptでY方向に 膨張と収縮 させるには:

Pos X

@P.x + (sin($BBY * 180) * (1 / ch("strength"))) - 1) * ($BBX - 0.5)

Pos Z

@P.z + (sin($BBY * 180) * (1 / ch("strength"))) - 1) * ($BBZ - 0.5)

VEX:

float PI = 3.1415926535897932384;
@P.x += (sin(relbbox(@P).y * PI) * (1.0 / chf("bulge_factor")) - 1.0) *(relbbox(@P).x - 0.5);
@P.z += (sin(relbbox(@P).y * PI) * (1.0 / chf("bulge_factor")) - 1.0) *(relbbox(@P).z - 0.5);

HScriptでY方向に 曲げ させるには:

Pos X

@P.x * cos($BBY * ch("strength")) - @P.y * sin($BBY * ch("strength"))

Pos Y

@P.x * sin($BBY * ch("strength")) + @P.y * cos($BBY * ch("strength"))

VEX:

@P.x *= cos(radians(relbbox(@P).y * ch("strength"))) - @P.y * sin(radians(relbbox(@P).y * ch("bend_factor")));
@P.y *= sin(radians(relbbox(@P).y * ch("strength"))) + @P.y * cos(radians(relbbox(@P).y * ch("bend_factor")));

リファレンス

ユーザインターフェース

  • メニュー

    メインメニュー内のそれぞれの項目について説明します。

  • ビューア

    ビューアペインタイプ。

  • ペイン

    色々なペインのオプションを説明します。

  • ウィンドウ

    色々なユーザインターフェースウィンドウのオプションを説明します。

プログラミング

  • エクスプレッション関数

    エクスプレッション関数は、パラメータの値を計算することができます。

  • エクスプレッションクックブック

    エクスプレッションを記述して色々なエフェクトを表現するためのTipsとテクニック。

  • Pythonスクリプト

    PythonとHoudini Object Modelを使用してHoudiniのスクリプトを記述する方法。

  • VEX

    VEXはシェーダの記述などのHoudiniのほとんどの場所で使われているハイパフォーマンスなエクスプレッション言語です。

  • HScriptコマンド

    HScriptはHoudiniのレガシースクリプト言語です。

コマンドライン

導師レベル

プラグインのインストール

  • Houdiniパッケージ

    プラグイン、ツール、アドオンが異なる環境変数定義ファイルを複数作成して、それらを組み合わせる方法。

Houdini Engine