目次/第03章
03Noise
でこぼこを、なめらかな乱数で作る
value noise & fBm — 値ノイズとフラクタルノイズ
この章の3行まとめ
- 乱数をそのまま並べると砂嵐になります。となりと何の関係もない値だからです。
- 自然の模様は「近いところは似ていて、遠いところは違う」。これを作るのがノイズです。
- 細かさを半分ずつにして重ねる(fBm)と、遠目にはムラ、近くではざらつきが出ます。
乱数をそのまま並べると砂嵐になります。となりのピクセルと何の関係もない値が出るからです。 でも自然の模様は違います。じゃがいもの皮のムラも、すいかの縞も、 近いところは似ていて、遠いところは違う。この性質を作るのがノイズです。
作り方は3行で言える
- 方眼紙の交点にだけ乱数を置く(格子点)
- マスの中の点は、まわり4つの値をなめらかに混ぜて決める
- マス目を細かくしたものを重ねる(オクターブ)
2番目の「なめらかに混ぜる」に t*t*(3-2*t) という式が出てきます。
これは smoothstep と呼ばれる関数で、0から1へ移るときに端で速度が0になります。
ただの直線で混ぜるとマスの境目に折れ線が見えてしまうので、この一手間が要ります。
3番目の重ね合わせが効きます。大きなうねりの上に半分の大きさを半分の強さで、
その上にさらに半分を——と重ねると、遠目には大きなムラ、近づくと細かいざらつきという
自然物そっくりの模様になります。この重ね方をfBm(フラクタルブラウン運動)と言い、
コードでは fbm3() や fbm2u() という名前で出てきます。
実験 — ノイズを重ねる
回数を1のままにすると、ぼんやりした雲にしかなりません。3〜4に上げた瞬間に「素材」に見えます。
つまずきポイント
野菜の表面を1周する模様は、一周してぴったりつながらないと縫い目が出ます。
そのためコードのノイズには「周期版」があります(v2u() の px 引数)。
格子の番号を x % px で折り返して、右端の乱数と左端の乱数を同じにする、という仕掛けです。
やってみよう
- 「重ねる回数」を1のまま、細かさだけ最大にしてみる。素材に見えないことを確かめる。
- 回数を4にして、細かさを6に戻す。どちらが自然に見えるか比べる。
- スイカのパレットで、縞に見える設定を自分で探す。