ノイズ・不規則さ

シンプレックスノイズ

Simplex Noise

単体格子による滑らかな多次元ノイズを作る。

3 / 10

インタラクティブデモ

デモを準備しています…

シンプレックスノイズ

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

ひとことで

Ken Perlin が 2001 年に発表した、パーリンノイズの改良版です。空間を正方形ではなく単体(2D では三角形、3D では四面体)に分割し、点を囲む n+1n+1 個の頂点だけから値を計算します。次元が高くなっても計算量が増えにくく、軸方向の癖も少ないため、時間を 1 次元加えた 3D・4D ノイズを多用するリアルタイム表現で重宝されます。

ゲームでの使いどころ

  • 時間変化するエフェクト:2D テクスチャ座標 + 時間 = 3D ノイズ。溶岩、雲の流れ、魔法陣のゆらぎを継ぎ目なくアニメーションできます。
  • 3D の物体表面:球の表面座標をそのまま 3D ノイズに入れると、UV の継ぎ目や極の歪みなしに惑星や岩を作れます。
  • ループする煙:4D ノイズで時間を円周上に取ると、ぴったりループする素材が作れます(次元が多いほど simplex の利点が大きくなります)。
  • GPU パーティクル:カールノイズの下地としても、微分の計算が安い simplex 版がよく使われます。

しくみ

2D の場合、まず座標を斜めに引き伸ばすスキュー変換で三角格子を正方格子に写します。

s=(x+y) F2,F2=3−12,(i,j)=(⌊x+s⌋,  ⌊y+s⌋)s = (x + y)\,F_2, \quad F_2 = \frac{\sqrt{3} - 1}{2}, \qquad (i, j) = (\lfloor x + s \rfloor,\; \lfloor y + s \rfloor)

写した先の正方形のうち、x0>y0x_0 > y_0 なら下側、そうでなければ上側の三角形が点を含む単体です。これで囲む 3 頂点が決まります。

各頂点 ci\mathbf{c}_i の寄与は、パーリンノイズと同じく勾配との内積ですが、補間の代わりに放射状の減衰を掛けて足し合わせます。

noise(p)=∑i=0nmax⁡ ⁣(0,  r2−∣di∣2)4 (gi⋅di),di=p−ci\text{noise}(\mathbf{p}) = \sum_{i=0}^{n} \max\!\big(0,\; r^2 - |\mathbf{d}_i|^2\big)^4 \,(\mathbf{g}_i \cdot \mathbf{d}_i), \qquad \mathbf{d}_i = \mathbf{p} - \mathbf{c}_i
次元パーリン(正方格子の隅)シンプレックス(単体の頂点)
2D43
3D84
4D165

補間が不要で、各頂点の寄与を独立に足すだけなので、解析的な微分も簡単に得られます。

実装のポイント

  • 実装は既存のものを使う:GLSL なら Ashima Arts / Stefan Gustavson の snoise(MIT)、CPU なら Stefan Gustavson の解説付き実装や FastNoise Lite などが定番です。自作する場合も、単体の選び方とスキュー係数を間違えやすいので既存コードとの比較テストを用意します。
  • 出力範囲:一般的な実装は約 −1∼1-1 \sim 1 にスケールされています。パーリンノイズと混ぜて使うときは振幅をそろえます。
  • 時間の入れ方:snoise(vec3(uv * scale, time * speed)) のように、時間は空間とは別の軸として入れます。空間座標に足すと「模様が流れる」だけになり、「形が変化する」表現になりません。

つまずきやすい点

  • 特許の話:3D 以上の simplex noise には長く米国特許(US 6,867,776)がありましたが、2022 年に失効しています。古い資料で「OpenSimplex を使え」と書かれているのはこのためです。
  • パーリンより常に速いとは限らない:2D ではハッシュと分岐のコストで差がほとんど出ないこともあります。利点が大きいのは 3D・4D です。
  • 見た目が少し違う:三角格子なので、パーリンノイズとは模様の粒の形が異なります。既存アセットをそのまま置き換えるとバランスが変わる点に注意します。

デモで試すこと

  1. 面の上にポインターを置くと、その点の値を決める格子点が赤く表示されます。シンプレックスでは 3 個、パーリンでは 4 個です。
  2. 「高さの倍率」を 0 にして格子の形だけを比べてください。三角形の格子は向きの偏りが小さく、模様の方向性も弱くなります。
  3. 右下の数値は次元ごとの参照点数です。3D・4D で差が一気に広がることが、時間軸を足したアニメーションで simplex が好まれる理由です。

参考資料

Curl-Noise for Procedural Fluid Flow ↗

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