クリエイティブコーディングにおいて、ノイズ関数は自然界のランダム性や有機的な動きを模倣するための強力なツールです。山や雲、風、海のうねり、あるいは抽象的なビジュアライゼーションに至るまで、その応用範囲は非常に広く、ジェネラティブアートからゲーム開発まで多岐にわたります。

Processingなどに標準搭載されている noise() 関数は、滑らかで連続的な疑似乱数を生成できるため、ビジュアル的に心地よいランダムパターンを簡単に作ることができます。この noise() 関数の内部では、Ken Perlin によって1983年に開発された勾配ノイズ(Gradient noise)「Perlin Noise」が用いられています。

Parlin Noise と Simplex Noise と OpenSimplex Noise 。

Simplex noiseは、1983年にPariln noiseを開発したKen Perlin氏により2001年に発表されました。Simplex noiseは、Perlin noiseの問題点を改善したParlin noiseの改良版と言えるものでしたが、特許による使用制限や次元数の制約、実装の複雑さなどに多くの課題がありました。

これを解決するために、Kurt Spencer氏がオープンソースで使えるSimplex noiseとして、OpenSimplex noiseを開発。OpenSimplex noiseは、Simplex noiseのアイデアを元にしながら、特許の制約を受けないようにクリーンルーム実装されました。

さらに、OpenSimplex noiseは、Perlin noiseやSimplex noiseで見られた「スナップ」(不自然に目立つ格子状のパターン)が発生しにくく、より滑らかで自然なノイズを生成することができます。

記事では、このOpenSimplex NoiseをProcessingに導入し、Perlin Noiseとの比較を通じてその特徴と利点を探っていきます。

1. Perlin Noiseとその特徴

Perlin Noiseは、CG分野における「自然な見た目の乱数生成」を可能にした画期的な手法で、アカデミックにも商業的にも広く使われてきました。Ken Perlinはこの貢献により2001年にアカデミー科学技術賞(Technical Achievement Award)を受賞しています。

Processingにおける noise() 関数は、このPerlin Noiseをベースとしており、通常の乱数 random() のようにバラバラな値を返すのではなく、時間的・空間的に連続した値を生成します。これにより、滑らかなアニメーションや有機的な動きが簡単に作れるのが大きな特徴です。


float n = noise(x * 0.01, y * 0.01);

このようにスケーリングを調整することで、ノイズの細かさをコントロールすることもできます。Perlin Noiseは視覚的に「自然らしさ」を感じさせるため、風景生成、流体の動き、パーティクル表現、ノイズによるドローイングなど、さまざまな作品で使用されています。

ただし、Perlin Noiseには以下のような欠点もあります:

  • 特定の軸方向にアーティファクト(格子状の構造)が出ることがある
  • 高次元(3D以上)では品質が劣化しやすい
  • 特許に関連する制約がかつて存在していた(現在は期限切れ)

2. OpenSimplex Noise

OpenSimplex Noiseは、Kurt Spencerによって2014年に開発されたアルゴリズムです。Perlin Noiseのアーティファクト問題やSimplex Noiseの課題をを解決し、より均一で自然なノイズを生成できることを目的としています。

その主な特徴は以下の通りです:

  • 格子状のアーティファクトが少ない
    Perlin Noiseに見られる軸方向の構造が解消されており、より自然なパターンになります。
  • より均一な空間分布
    OpenSimplexは、点群の配置が等距離に近く、ノイズの出力が均一に見えるため、視覚的な歪みが発生しにくいです。
  • 高次元でも安定した出力
    2Dだけでなく3D・4Dでも滑らかで美しいノイズを生成できます。これは、音響空間や動的ビジュアライゼーションなど多次元データにおいて特に有利です。
  • 特許フリー
    商用利用やソースコードの自由な改変にも適しており、ライセンス的な不安がありません。

3. 実装方法(Processingへの導入)

OpenSimplexNoiseは以下のGithubリポジトリにて公開されており、直接プロジェクトに組み込む事ができます。

https://github.com/KdotJPG/OpenSimplex2/tree/master/java

3.1 2種類のOpenSimplexNoise

現在、Processingで使用可能なjavaバージョンでは、OpenSimplexから更に改良されたOpenSimplex2OpenSimplex2Sの2種類あります。

この2種類の違いは、OpenSimplex2 は「より高速でシンプルなグラデーション生成」にフォーカスしたバージョン、OpenSimplex2S は「旧OpenSimplexのスムージング思想を引き継ぎつつも、より滑らかに設計」されたバージョンとなります。

特徴OpenSimplex2OpenSimplex2S
ノイズの種類“raw” variant“smoothed” variant
アウトプットよりシャープでコントラストが強いより滑らかで自然な変化
用途例地形のラフネス表現、マスク用途雲、煙、波、自然ノイズなど
スピードやや高速やや遅い(とはいえ十分高速)
設計目的パフォーマンスと単純性滑らかさと品質の両立

OpenSimplex2 はノイズとして直接視覚化するにはあまり向かないことが多い(特に2Dでは目に優しくない)ため、通常のアート用途や Processing での可視化には OpenSimplex2S を使います。

ProcessingはJavaベースの環境であるため、Javaで書かれたOpenSimplex2のコードは比較的スムーズに取り込むことができます。以下の手順で実装を進めます。

3.2 OpenSimplex2Sの取得

まず、以下のリポジトリからOpenSimplex2SのJava実装をダウンロードします。

https://github.com/KdotJPG/OpenSimplex2/blob/master/java/OpenSimplex2S.java

これをProcessingのスケッチフォルダにコピーし、スケッチ内で tab として追加します。
※ 新規タブとして制作する場合、ファイル名に拡張子( .java )を忘れずつけます。

3.3 Processingでの使用方法


long seed = 12345;

void setup() {
  size(1024, 360);
  background(255);
  noLoop();
}

void draw() {
  background(0);
  noFill();
  stroke(255);
  float xoff = 0;
  beginShape();
  for (int x = 0; x < width; x++) {
    //float y = noise(xoff) * height; //ParinNoise
    float y = map((float)OpenSimplex2S.noise2(seed, xoff, 0), -1, 1, 0, 1) * height; //OpenSimplexNoise2S
    vertex(x, y);
    xoff += 0.01;
  }
  endShape();

  line(0, height / 2, width, height / 2);
}

上記例は1次元におけるノイズグラフです。OpenSimplex2には1次元ノイズ関数がないので、2次元を1次元として使用しています。

以前のOpenSimplexは、クラスとしてインスタンス化する必要がありましたが、OpenSimplex2.java は、一般的なクラスとは違い「ユーティリティクラス」として設計されており、インスタンス化せずにstatic メソッドを直接使うことを前提にしています。

Processingでは OpenSimplex2.noise2(seed,x, y) のように、直接ノイズを取得する事ができます。しかし、doubleは使用できないためfloatにキャストする必要があります。

また、返される値の範囲が −1〜1のため、Processingのnoise()のように0〜1で使用する場合はマッピングを行います。

4. Perlin NoiseとOpenSimplex2Sの比較

グラフでの比較

横軸を時間(またはX座標)、縦軸をnoise()の値としてグラフ状に描画。

Parlin Noise

OpenSimplex Noise2

三次元での比較

3D比較ではProcessingの公式サイトにあるNoise 3D Examplesを使用し、Z軸の値にノイズを当てています。

Parlin Noise

OpenSimplex Noise2

4.1 視覚的な違い

Perlin Noiseは軸方向に沿った模様がうっすらと現れることがあり、特に高周波成分やズームインした時に顕著になります。一方、OpenSimplex Noiseはこうした格子状の構造が抑えられ、より自然な乱れを感じさせる分布となります。

4.2 アーティファクトの発生傾向

Perlin Noiseでは、ノイズのグラデーションが局所的に揃ってしまうことで、人工的な印象を受けることがあります。OpenSimplexは勾配のばらつきが均等で、視覚的な「クセ」が少ないのが利点です。

特徴Perlin NoiseOpenSimplex Noise
滑らかさ
グリッドの影響△(出やすい)◎(ほぼ無し)
高次元対応
実装のしやすさ◎(標準)◯(外部追加)

4.3 パフォーマンス

描画パフォーマンスに関しては、Perlin Noise(noise())の方がネイティブに最適化されているため高速です。一方、OpenSimplexはJavaコードとして実装されているため若干処理コストは高めですが、実用上問題ないレベルです。重たいリアルタイムアニメーションには向かない場面もあるため、用途に応じた使い分けが重要です。

4.4 ProcessingのPrlinNose noise()とOpenSimplex2Sの違い

特徴Processingの noise(x)OpenSimplex2S の noise2(seed, x, y)
次元指定引数数で自動判定(1〜3D)メソッド名で次元指定(例:noise2)
シードの指定内部で自動明示的に seed を指定する必要あり
floatfloat(ただし内部計算は double)
値の範囲0.0〜1.0-1.0〜1.0

5. 応用例

OpenSimplex Noiseは、Processing上でも以下のようなシーンで非常に有効です。

5.1 フィールド表現(地形・風)

ノイズ値を標高や風速として扱うことで、より自然な地形生成が可能になります。


float z = 0;
void draw() {
  background(0);
  for (int x = 0; x < width; x += 10) {
    for (int y = 0; y < height; y += 10) {
      float n = (float) OpenSimplex2S.noise3_ImproveXZ(seed, x * 0.01, y * 0.01, z);
      ellipse(x, y, 10 * (n * 0.5 + 0.5), 10 * (n * 0.5 + 0.5));
    }
  }
  z += 0.01;
}

5.2 フラクタルノイズ(Octavesの重ねがけ)

より複雑なパターンを生むために、複数のノイズを異なるスケールで重ねる「フラクタルノイズ」もOpenSimplexと相性が良いです。


float fractalNoise(float x, float y, int octaves, float lacunarity, float gain) {
  float sum = 0;
  float amplitude = 1;
  float frequency = 1;
  for (int i = 0; i < octaves; i++) {
    sum += (float)OpenSimplex2S.noise2(seed, x * frequency, y * frequency) * amplitude;
    amplitude *= gain;
    frequency *= lacunarity;
  }
  return sum;
}

OpenSimplex Noise

OpenSimplex Noiseは、Perlin Noiseの自然さはそのままに、より均一で歪みの少ない表現を可能にする高品質なノイズ関数です。特にノイズによる空間表現や高次元ビジュアライゼーションでは、その滑らかさと安定性が大きな強みになります。

Processing上でも手軽に導入できるため、noise() とは別の選択肢になり、視覚的な美しさだけでなく、パターンの新鮮さや表現の幅が大きく広がります。

Recommended Book for Digital arts

book-generative_design

Generative Design / Processingで切り拓く、デザインの新たな地平
-Harmut Bohnacker, Benedikt Groß, Julia Laub

2012年に出版されたGenerative Designの日本語版、プログラミングによる視覚表現の解説本。Generative Designのオリジナルライブラリを利用することで、ビギナーにも優しいプログラムコードと解説でジェネラティブデザインが楽しめます。たくさんの美しい作品例と解説により、インスピレーションやリソースとして役立つだけでなく、プログラマーでない人にとっても新しいデザイン体験を与えてくれます。

ーーーーー
► 『Generative Design / Processingで切り拓く、デザインの新たな地平』(Harmut Bohnacker, Benedikt Groß, Julia Laub)

BGD_SOUNDS on bandcamp

BGD_SOUNDSでは、bandcamp上にて、安価で利用できる膨大な著作権フリーのサウンドライブラリーを目指して日々様々な音源ライブラリーを増やしています。音源のほとんどは、192kHzの32bitの高音質にて録音。音楽制作や映像制作など用途に合わせて利用可能です。また、Sound visualization Penplot artも定期的に販売しています。

BGD_CLUB(月額サブスクリプション)も低価格から始めており、すべてのライブラリーにアクセスし自由にダウンロードすることも可能です。

Link / BGD_SOUNDS on bandcamp