やさいのつくりかた.

目次/第03章

03Noise

でこぼこを、なめらかな乱数で作る

value noise & fBm — 値ノイズとフラクタルノイズ

この章の3行まとめ
  • 乱数をそのまま並べると砂嵐になります。となりと何の関係もない値だからです。
  • 自然の模様は「近いところは似ていて、遠いところは違う」。これを作るのがノイズです。
  • 細かさを半分ずつにして重ねる(fBm)と、遠目にはムラ、近くではざらつきが出ます。

乱数をそのまま並べると砂嵐になります。となりのピクセルと何の関係もない値が出るからです。 でも自然の模様は違います。じゃがいもの皮のムラも、すいかの縞も、 近いところは似ていて、遠いところは違う。この性質を作るのがノイズです。

作り方は3行で言える

  1. 方眼紙の交点にだけ乱数を置く(格子点)
  2. マスの中の点は、まわり4つの値をなめらかに混ぜて決める
  3. マス目を細かくしたものを重ねる(オクターブ)

2番目の「なめらかに混ぜる」に t*t*(3-2*t) という式が出てきます。 これは smoothstep と呼ばれる関数で、0から1へ移るときに端で速度が0になります。 ただの直線で混ぜるとマスの境目に折れ線が見えてしまうので、この一手間が要ります。

3番目の重ね合わせが効きます。大きなうねりの上に半分の大きさを半分の強さで、 その上にさらに半分を——と重ねると、遠目には大きなムラ、近づくと細かいざらつきという 自然物そっくりの模様になります。この重ね方をfBm(フラクタルブラウン運動)と言い、 コードでは fbm3() や fbm2u() という名前で出てきます。

実験 — ノイズを重ねる

回数を1のままにすると、ぼんやりした雲にしかなりません。3〜4に上げた瞬間に「素材」に見えます。

つまずきポイント

野菜の表面を1周する模様は、一周してぴったりつながらないと縫い目が出ます。 そのためコードのノイズには「周期版」があります(v2u() の px 引数)。 格子の番号を x % px で折り返して、右端の乱数と左端の乱数を同じにする、という仕掛けです。

やってみよう
  1. 「重ねる回数」を1のまま、細かさだけ最大にしてみる。素材に見えないことを確かめる。
  2. 回数を4にして、細かさを6に戻す。どちらが自然に見えるか比べる。
  3. スイカのパレットで、縞に見える設定を自分で探す。