Houdini 21.0 Height Fieldと地形

マンデルブロ集合

娯楽向けの3Dフラクタル。

この例は、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で色分けされています。

Height Fieldと地形

生成

  • 地形の生成

    HoudiniのHeight Fieldを用いた基本的なワークフロー。

  • マップからHeight Fieldを生成

    マップからディテールの細かい地形を生成することができます。

  • 単独の山

    必要な場所にカスタムの丘や山を生成します。

  • レイヤ

    レイヤを積み重ねてマスクを適用することで、よりリアルな表現を高めます。

  • 段丘化(Terracing)

    頂上に近いほど段状の地形を生成します。

  • 歪曲(Distortion)

    地形を形作って自然な見た目にします。

  • 地形のペイント

    アーティストの気分で、ご自身で景観をペイントしましょう。

  • 投影

    任意のジオメトリをHeight Fieldの一部に変換します。

  • パッチ(継ぎ合せ)

    パッチ(継ぎ合せ)とカットアウト(切り抜き)を用いて地形を組み立てます。

  • パターン

    基本的なジオメトリパターンからリアルな地形を生成します。

  • リサンプリング

    地形の解像度を段階的に上げます。

  • 様々な特徴部

    地形を変換、エクスポート、特徴豊かにします。

散布

マスク

  • マスキング

    修正したい領域やディテールを加えたい領域を定義します。

  • ライトマスク

    地形上の日照領域からマスクを作成します。

自然現象

VEX

テクスチャ

Shallow Water Solver(浅水ソルバ)