On this page |
概要 ¶
Houdiniでは、パラメータやVEXスニペット内にエクスプレッションを使用することで、ちょっとした数学だけで複雑で面白い効果を表現することができます。 このページでは、エクスプレッションに使用するいくつか役立つ数式とテクニックを紹介します。
-
HScriptエクスプレッションの基本は、エクスプレッションを参照してください。VEX言語に関する詳細は、VEXを参照してください。
-
このページに載せているエクスプレッションでは、パラメータの値にアクセスするための
ch
関数がよく使われています。エクスプレッションで使用できる独自のパラメータをセットアップする方法は、Spareパラメータを参照してください。 -
将来のバージョンのHoudiniは、HScriptエクスプレッションでローカル変数を修正することができる一方、ユーザがVEXを使ってジオメトリを修正できるように進めていきます。その理由は、VEXの方が高速だからです。
チャンネル索引 ¶
同義と相違 ¶
エクスプレッション |
VEX |
|
---|---|---|
現行フレーム |
|
|
現行時間 |
|
|
境界ボックス |
|
|
重心 |
|
vector cent = getpointbbox_center(0); // cent.x, cent.y, cent.z |
サイズ |
|
vector size = getbbox_size(0); // size.x, size.y, size.z |
コーナー |
|
vector min; vector max; getbbox(0, min, max); // min.x, min.y, min.z, max.x, max.y, max.z |
累乗 |
|
|
三角関数 |
度 |
ラジアン radians関数を使って、度をラジアンに変換することができます。 |
乱数 ¶
-
HScriptとVEXでのランダム化のサンプルは、
$HH/help/files/RandomExample.hip
を開いてください。
エクスプレッション |
VEX |
---|---|
|
|
|
|
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共に同じです。これはa
をb
で割った時の余りを返します。
これは、どんどんと増えていく値(例えば、フレーム番号)を指定すると、ある範囲の値を繰り返す値を生成することができるので非常に役に立ちます。
Note
剰余演算子を浮動小数点の値に使用すると、予期しない結果を招く可能性があります。例えば、3.14 % 1
は0.14
を返し、34.999 % 5
は4.999
を返します。
例:
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
---|---|---|---|---|---|---|---|
|
0 |
1 |
2 |
0 |
1 |
2 |
0 |
波紋 ¶
-
HScriptとVEXでの波紋のサンプルは、
$HH/help/files/RippleExample.hip
を開いてください。
数学的に放射状の波紋を取得するには、サーフェスの中心から点までの距離をサイン関数に使用して、ポイントの位置の高さを変更します。
Position Y |
|
---|
これをアニメーションさせるには、時間ベースの変数をエクスプレッションに追加します:
Position Y |
|
---|
円弧、円、螺旋 ¶
-
HScriptとVEXでの円弧のサンプルは、
$HH/help/files/ArcExamples.hip
を開いてください。
sin
とcos
の関数を使うことで、円弧または円の経路上の位置を生成することができます。
Position X |
|
---|---|
Position Z |
|
(これは、面白い効果を作成するのに役立ちますが、Circle SOPで円弧や円を作成することで同様の効果を表現できることがよくあります。例えば、多角形の円を作成し、その円のポイントにアイテムをコピーすることで、アイテムを円状に配置することができます。)
XYZの3軸のうち2つの軸方向にsin
とcos
を使用して3次元的に位置を上げていくことで、螺旋を作成することができます。
X |
|
---|---|
Y |
|
Z |
|
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
波を“上”または“下”に移動させます。
他の波形 ¶
ジオメトリ変形 ¶
-
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 |
|
---|
Y方向に 先細 させるには:
Pos X |
|
---|---|
Pos Z |
|
HScriptでY方向に 押し潰し と 引き伸ばし をさせるには:
Scale X |
|
---|---|
Scale Y |
|
Scale Z |
|
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 |
|
---|---|
Pos Z |
|
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 |
|
---|---|
Pos Z |
|
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 |
|
---|---|
Pos Y |
|
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")));