Procedural generation

Island Falloff / Distance Mask

島の減衰マスク

境界からの距離で島の外形を整える。

7 / 10

Interactive demo

Preparing the demo…

Island Falloff / Distance Mask

Drag to orbit, Ctrl/⌘ + scroll to zoom. Use two fingers on touch screens.

This explanation is currently available in Japanese.

ひとことで

ノイズで作った地形の高さに、中心から離れるほど小さくなる値(減衰マスク)を掛けたり引いたりして、マップの端が必ず海になるように整える方法です。ノイズだけの地形は、マップの端で陸地が途中で切れてしまいますが、マスクを使えば「海に囲まれた島」になります。海岸線はノイズの凸凹を残すので、円や四角のままにはならず、入り江や岬のある自然な形になります。

ゲームでの使いどころ

  • 島のマップ:サバイバルゲームや探索ゲームの、海に囲まれた島のマップを自動で作る。
  • マップの端の処理:大陸の一部を切り取ったようなマップでも、端を海・山脈・崖などにして、自然に「行けない」ことを伝える。
  • 地形の大まかな形の指定:デザイナーが描いた大まかな形(マスク画像)とノイズを組み合わせ、狙った形の大陸を作る。
  • 地形以外にも:森の分布を中心に集める、敵の出現を中心ほど強くするなど、「中心からの距離で量を変える」処理全般に使える。

しくみ

マップの座標を中心 0、端 ±1 に正規化した (u,v)(u, v) で、中心からの「距離」dd を決めます。距離の測り方で島の形が変わります。

d円=u2+v2,d四角=max⁡(∣u∣,∣v∣),d角丸=(u4+v4)1/4d_{\text{円}} = \sqrt{u^2 + v^2},\qquad d_{\text{四角}} = \max(|u|, |v|),\qquad d_{\text{角丸}} = (u^4 + v^4)^{1/4}

この距離から、中心で 1、端で 0 になるマスク mm を作ります。下がり始める距離 r0r_0 と、下がり方のカーブ pp で形を調整します。

m=(1−smoothstep⁡(r0,1,d))pm = \big(1 - \operatorname{smoothstep}(r_0, 1, d)\big)^p

最後に、ノイズの高さ nn をマスクで下げます。

h=n−(1−m) sh = n - (1 - m)\,s

ss はマスクの強さです。掛け算 h=n⋅mh = n \cdot m を使う方法もありますが、引き算の方が、中心付近の地形の凸凹をそのまま残せます。

ゆがめた円:距離を測る前に、座標をノイズで少しずらすと(座標のゆがみ)、島の輪郭そのものが崩れ、より自然な形になります。

実装のポイント

  • マスクは画像にもできる:距離の式の代わりに、デザイナーが描いた白黒の画像をマスクにすれば、好きな形の大陸を作れます。
  • 海面を決める:高さがある値(海面)より低い所を海にします。マスクの強さと海面の高さで、陸地の割合を調整します。
  • 仕上げに侵食:マスクだけの山は形が単純になりがちです。仕上げに水食侵食をかけると、谷や川筋のある地形になります。
  • 複数の島:マスクを「いくつかの中心からの距離の最小値」にすれば、群島を作れます。

つまずきやすい点

  • 完全な円・四角になる:ノイズが弱すぎたり、マスクが強すぎたりすると、海岸線が円や四角のままになり、人工的に見えます。ノイズの振幅と下がり始める距離のバランスを取ります。
  • 中心が高くなりすぎる:掛け算のマスクでは、中心の高さがノイズで決まり、端に向かって単調に下がるだけのつまらない形になりがちです。
  • 端に陸が残る:マスクが弱いと、端にも陸地が残ります。デモの「マップの端にかかった陸地」が 0 になるよう調整します。

デモで試すこと

  1. 「マスクの強さ」を 0 にすると、陸地がマップの端で途切れ、大陸の一部を切り取ったように見えます。数値の「マップの端にかかった陸地」が増えます。
  2. 右下の断面図で、灰色のノイズから赤いマスクの分だけ引き下げて、緑の結果になっていることを確かめてください。青い点線が海面です。
  3. 「距離の測り方」を変えると、同じノイズでも島の大まかな形が変わります。「ノイズでゆがめた円」が最も自然です。
  4. 「マスクを地形に重ねて表示」で、赤く塗られた所ほど高さが大きく引き下げられています。

References

WaveFunctionCollapse ↗

A general reference for this subcategory.