Noise & irregularity

Ridged Multifractal Noise

リッジノイズ

ノイズの稜線を強調して山脈を作る。

8 / 10

Interactive demo

Preparing the demo…

Ridged Multifractal Noise

Drag to orbit, Ctrl/⌘ + scroll to zoom. Use two fingers on touch screens.

This explanation is currently available in Japanese.

ひとことで

ノイズが 0 を横切る線を尖った尾根に変えて重ねる、山脈づくりのための多重フラクタルノイズです。F. Kenton Musgrave が『Texturing and Modeling』で体系化しました。ふつうの fBm が作る丸い丘ではなく、稜線が連なる険しい山並みや、枝分かれする谷筋のような地形が得られます。

ゲームでの使いどころ

  • 山脈・峡谷のあるオープンワールド:遠景の山並みのシルエットに説得力が出ます。
  • 地形の組み合わせ:平野は fBm、山岳地帯はリッジノイズと、バイオームごとに高さ関数を切り替えてブレンドするのが定番です。
  • 稲妻・血管・ひび:2D でリッジの値を明るさに使うと、枝分かれする光の筋になります。
  • 雪や岩の配置:尾根の鋭さ(曲率)や斜面の傾きを使って、雪を積もらせる場所や岩肌を出す場所を決められます。

しくみ

各オクターブで次の変換をしてから足し合わせます。

si=(1−∣n(λip)∣)ks_i = \big(1 - |n(\lambda^{i}\mathbf{p})|\big)^{k}

∣n∣|n| が 0 になる場所(ノイズの等高線 0)で sis_i は最大の 1 になり、そこから離れると急に下がります。指数 kk(デモの「尾根の鋭さ」)を大きくするほど尾根は細く尖ります。

さらに「多重フラクタル」と呼ばれる理由は、前の層の値で次の層を重み付けする点にあります。

wi+1=clamp(si⋅G,  0,  1),sum+=si⋅wi⋅g iw_{i+1} = \text{clamp}(s_i \cdot G,\; 0,\; 1), \qquad \text{sum} \mathrel{+}= s_i \cdot w_i \cdot g^{\,i}

尾根の上(sis_i が大きい)では次の層の細部がしっかり乗り、谷(sis_i が小さい)では細部が抑えられます。これで「山頂はごつごつ、谷底はなだらか」という、侵食された実際の地形に近い性質が生まれます。素の fBm がどこでも同じ粗さになるのとは対照的です。

実装のポイント

  • オフセット:Musgrave の原式では offset - |n|(offset ≈ 1)を使い、この値で尾根の高さと谷の深さのバランスを調整します。
  • 高さの再マップ:出力は 0.3〜0.8 付近に偏りがちです。海面や平地の割合を決めるために、曲線(べき乗やカーブアセット)で再マップしてから使います。
  • 侵食と組み合わせる:リッジノイズは尾根の形を作るのは得意ですが、谷に堆積した平地は作れません。熱侵食や水食侵食を後段にかけると、急斜面の下に土砂が溜まり自然になります。

つまずきやすい点

  • 尾根が格子に沿う:低周波の層ほど格子の癖が尾根の向きに出ます。層ごとに座標を回転させると改善します。
  • 尖りすぎ:指数を上げすぎると 1 頂点幅の針のような尾根になり、メッシュ解像度によってはギザギザに見えます。地形の頂点間隔と相談して決めます。
  • 重み付けの暴走:重みの係数 GG が大きすぎると細部が全域に乗り、ただのノイズの塊になります。

デモで試すこと

  1. 「ノイズ」を通常の fBmとリッジで切り替えて、山のシルエットを比べてください。黄色の断面線を見ると、リッジでは山頂が V 字に尖っています。
  2. 「尾根の鋭さ」を 1 から 4 まで動かすと、丸みのある山から鋭い岩峰へと変わります。
  3. 「オクターブ数」を 1 にすると、ノイズの 0 等高線がそのまま 1 本の尾根になる様子が分かります。

References

Curl-Noise for Procedural Fluid Flow ↗

A general reference for this subcategory.