M.1 Randomness and Noise
乱数とノイズは有機的な表現を実現するためには必要不可欠である. 以下,補足情報.
RandomとPerlinノイズ
random一様分布(っぽいやつ)から乱数を生成するが,Perlin noiseはよりゆるやかに変化するようなノイズを生成する.つまり,変化が飛び飛びの完全なランダム性を再現したい場合はrandom()を使用し,自然界によく見られる地形のようにゆるやかなランダム性を再現したい場合はnoise()を使用することが望ましい.
Perlin noiseの代表的な応用例:地形,雲,火などの自然現象のCG.ゲームにおけるステージの自動生成など.
Perlin noiseで山を生成したCG.
Random vs Perlin Noiseのイメージ.
パーリンノイズ(英: Perlin noise)とは、コンピュータグラフィックスのリアリティを増すために使われるテクスチャ作成技法。擬似乱数的な見た目であるが、同時に細部のスケール感が一定である。このため制御が容易であり、各種スケールのパーリンノイズを数式に入力することで多彩なテクスチャを表現できる。パーリンノイズによるテクスチャは、CGIで自然な外観を物に与えるためによく使われる。 Ken Perlin が Mathematical Applications Group, Inc. で勤務しているときに開発した。彼はこの業績により、1997年、映画芸術科学アカデミーからアカデミー科学技術賞(Technical Achivement)を受賞した。 パーリンノイズは (x,y,z) または (x,y,z,time) の関数として実装され、事前に計算された勾配に従って内挿を行い、時間的/空間的に擬似乱数的に変化する値を生成する。Ken Perlin は2002年に実装を改善し、より自然に見えるようにした。 パーリンノイズは、コンピュータグラフィックスで炎や煙や雲を表現するのによく使われている。また、メモリ使用量が少ないため、メモリ容量が小さい場面でのテクスチャ生成にも使われ、パソコンゲームでのリアルタイムCG生成時にGPU上で使われることが増えている。(Wikipediaより)
参考) MinecraftなどはPerlinノイズを使って地形を生成している. http://qiita.com/y_li/items/e058bfc2ff8051008679
Improving Noise by Ken Perlin ()Media Research Laboratory, Dept. of Computer Science, New York University) [email protected] http://mrl.nyu.edu/~perlin/paper445.pdf
Ken Perlin's Website http://mrl.nyu.edu/~perlin/
ランダムウォーク vs Perlinウォーク
float x, y, x y0;
float angle;
int drawMode = 1;
void setup() {
size(800, 800);
smooth();
background(255);
strokeWeight(2);
stroke(200, 45, 40, 100);
x = width/2;
y = height/2;
x0 = x;
y0 = y;
}
void draw() {
float stepSize = 4;
if (drawMode == 1) {
x += random(-stepSize, stepSize);
y += random(-stepSize, stepSize);
} else {
float noiseX = x;
float noiseY = y;
angle = noise(noiseX, noiseY)*10;
//println(cos(angle));
x += cos(angle)*stepSize;
y += sin(angle)*stepSize;
}
line(x0, y0, x, y);
if (x < 0) x = width;
if (x > width) x = 0;
if (y < 0) y = height;
if (y > height) y = 0;
x0 = x;
y0 = y;
}
void keyReleased() {
if (key == '1') {
drawMode = 1;
stroke(200, 45, 40, 100);
}
if (key == '2') {
drawMode = 2;
stroke(0, 43, 154, 100);
}
}
事例:トルネコの大冒険 不思議のダンジョン
遊ぶ度にダンジョンのマップが変わる.何らかのランダムアルゴリズムが組み込まれていると考えられる. (調査中)
M.1 乱数とノイズのまとめ
- 飛び飛びのランダムノイズは一様乱数を発生するrandom()を使う.
- ゆるやかでオーガニックなPerlinノイズを発生するランダムはnoise()を使う.