この例は、HoudiniのHeight Fieldを用いて非常に洗練された表現が可能であることを示すものです。 いわゆるマンデルブロ集合についてご存知かもしれません。 この名称の由来は、ポーランド・フランス・アメリカ出身の数学者である Benoit B. Mandelbrot 氏に由来します。 マンデルブロ集合は、複素数に基づいた自己相似的なフラクタルです。 マンデルブロ集合の象徴的な要素は、林檎を彷彿させる黒い領域です。 “林檎”周辺の構造は識別しやすくするため色分けされています。 自己相似性とは、フラクタルに“潜り込む”ことでより詳細な構造を明らかにできる一方で、常に非常に似たパターンが見られることを意味します。 この詳細度は反復回数によって決まります。
Height FieldとVEXを用いることで、フラクタルパターンを高さ情報に変換し、マンデルブロ風の地形を生成することができます。 以下に説明を省略したスクリプトを載せています。 フラクタル全般および マンデルブロ集合 に関する情報はインターネット上に豊富に存在します。
// パラメータ定義 int maxiter = chi("iterations"); float scale = 1 / chf("scale"); float offset_x = chf("offset_x"); float offset_z = chf("offset_z"); float escape_threshold = chf("escape_threshold"); float amplifier = chf("amplifier"); float core_height = chf("core_height"); // メインルーチンの'mandelset' function float mandelset(float x0, y0; int imax; float escape) { float x = 0; float y = 0; float xnew, ynew; int i; for (i = 0; i < imax; i++) { xnew = x * x - y * y + x0; ynew = 2 * x * y + y0; if (xnew * xnew + ynew * ynew > escape) { return float(i) / float(imax); // 正規化された反復深さ } x = xnew; y = ynew; } return -1.0; // マンデルブロ集合内のポイント } // マンデルブロ集合の計算 float value = mandelset(@P.x * scale - offset_x, @P.z * scale - offset_z, maxiter, escape_threshold); if (value >= 0) { @height = value * amplifier; @height += sin(value * 10) * 0.1; // Bands } else { @height = core_height; }
パラメータ ¶
このスクリプトは比較的簡潔ですが、フラクタルをカスタマイズするための複数のパラメータを提供します。下記の表の最後の数値は、“標準的な”マンデルブロ集合を生成する例示値です。Heightfield Wrangle SOP
| パラメータ | 説明 | 値 |
|---|---|---|
| Iterations | フラクタルの“解像度”。値が大きいほど計算時間が長くなりますが、より詳細な構造が得られます。なお、可視構造の量はHeight Fieldのグリッドサイズにも依存します。 |
200
|
| Scale |
マンデルブロ集合のサイズ。フラクタル構造が確認できるのは通常では100以上の値が必要です。
|
300
|
| Offset X/Z |
マンデルブロ集合の正規化された位置。正規化とは、オフセット値が0から1の範囲に収まることを意味します。0.5の値は中心点を意味します。
|
0.5 / 0
|
| Escape Threshold | ポイントがマンデルブロ集合の一部と見なされなくなる条件を決定します。このパラメータは、フラクタル周囲の縞模様効果を生成します。値を高くすると詳細が増しますが、計算時間が長くなります。 |
800
|
| Amplifier | 林檎型の領域外にある構造のスケール係数。高い値は典型的なスパイクを生成します。 |
75
|
| Core Height | 林檎型の領域の高さ(単位はメートル)。 |
100
|
上記の値を使用すると、下記の画像が得られます。
高さ情報は、HeightField Visualize SOPで色分けされています。