ノイズ・不規則さ

フラクタルブラウン運動

Fractal Brownian Motion / fBm

大きさの異なるノイズを重ねて細部を増やす。

6 / 10

インタラクティブデモ

デモを準備しています…

フラクタルブラウン運動

ドラッグで視点を回転、Ctrl(⌘)+ スクロールでズーム。タッチ操作は 2 本指です。

ひとことで

周波数を上げ、振幅を下げながら同じノイズを何層も足し合わせる手法です。山並みの大きな起伏に、尾根の凹凸、岩肌のざらつきと、大きさの違う細部が同時に存在する自然物らしさを 1 つの関数で作れます。1 層ごとを音楽になぞらえてオクターブと呼びます。

ゲームでの使いどころ

  • 地形の高さマップ:オープンワールドの山や丘の土台。ここに侵食や川の処理を加えて仕上げるのが定番です。
  • 雲・霧・煙の濃度:ボリュームレンダリングする雲の密度場は、ほぼ必ず fBm(や後述の変種)です。
  • テクスチャのムラ:汚れ、錆、苔の広がり、布の色ムラ。単一のノイズでは出ない「近くで見ても遠くで見ても情報がある」質感になります。
  • カメラシェイク:時間を入力にした数オクターブの fBm は、大きな揺れに細かな振動が乗った自然な揺れになります。

しくみ

基本のノイズ nn に対して、NN オクターブの fBm は次のように定義します。

fBm(p)=∑i=0N−1g i  n ⁣(λi p)\text{fBm}(\mathbf{p}) = \sum_{i=0}^{N-1} g^{\,i}\; n\!\left(\lambda^{i}\,\mathbf{p}\right)
パラメータ意味よく使う値
オクターブ数 NN重ねる層の数4〜8
ラクナリティ λ\lambda1 層ごとの周波数の倍率2.0
ゲイン gg1 層ごとの振幅の倍率0.5

g=0.5g = 0.5 のとき、振幅は 1, 0.5, 0.25, … と半分ずつ小さくなり、細部ほど弱く効きます。これは自然の地形が持つ自己相似性(拡大しても似た起伏が現れる性質)を近似しています。ゲインは Hurst 指数 HH と g=λ−Hg = \lambda^{-H} の関係にあり、HH が大きいほど滑らかな地形、小さいほどざらついた地形になります。

名前の「ブラウン運動」は、このスペクトル(周波数が倍になるとパワーが一定の割合で減る)がブラウン運動の軌跡と似ていることに由来します。ここでの fBm は描画のための重ね合わせであり、粒子のブラウン運動を時間発展させるものではありません。

実装のポイント

  • 層ごとに回転・オフセット:同じ原点のまま周波数だけ上げると、格子点が重なって規則的な模様が出ます。
  • オクターブ数は距離で変える:画面上で 1 画素より細かい層は見えないうえ、ちらつきの原因になります。カメラからの距離や画面上のサイズに応じて層数を減らすと、負荷とエイリアスの両方を抑えられます。
  • 正規化:合計振幅 ∑gi\sum g^i で割っておくと、オクターブ数を変えても全体の高さが変わりません。

つまずきやすい点

  • 重さ:層の数だけノイズを評価するので、8 オクターブならコストも約 8 倍です。地形なら生成時に一度だけ計算してキャッシュします。
  • どこでも同じ粗さ:素の fBm は谷も山頂も同じ粗さになり、「ノイズっぽい」地形になりがちです。谷を滑らかにしたいならリッジノイズのような多重フラクタルや、水食侵食を組み合わせます。
  • ラクナリティがちょうど 2.0:層どうしの格子が一致しやすくなります。2.01 のようにわずかにずらすのも手です。

デモで試すこと

  1. 「オクターブ数」を 1 から順に増やしてください。奥のグラフで新しい波形が追加されるたびに、地形に一段細かい起伏が加わります。
  2. 「ゲイン」を 0.7 付近まで上げると、細かい層が強く残ってザラザラの岩山に、0.3 付近まで下げるとなだらかな丘陵になります。
  3. 黄色い線は z=0z = 0 の断面です。グラフの「合計」の波形と同じ形をしていることを確かめてください。

参考資料

Curl-Noise for Procedural Fluid Flow ↗

分野全体の資料で、この項目を直接扱っているとは限りません。