ひとことで
雨粒が山肌を流れ下りながら土を削り、運び、流れが緩んだ所に落とす様子をまねて、地形に谷筋や扇状地を刻む方法です。fBm などのノイズで作った地形は、どこを見ても同じような凹凸になりがちですが、水食侵食をかけると、枝分かれした谷、尾根、ふもとの平地といった「水が作った地形」らしさが一気に出ます。
ゲームでの使いどころ
- 地形の自動生成:オープンワールドや手続き生成のマップで、ノイズの地形に侵食をかけてリアルな山並みにします。World Machine、Gaea、Houdini などの地形ツールの中心機能です。
- 川や湖の配置の手がかり:たくさんの雨粒が通った道は川の候補になり、土がたまった平地は湖や集落の候補になります。
- テクスチャの塗り分け:削れた所は岩肌、たまった所は砂や土、というように、侵食の結果をそのまま地面の色や植生(バイオームマップ)に使えます。
- ゲーム中の変化:頻度は低いですが、雨で地形が変わるシミュレーション系のゲームにも使われます。
しくみ
ここでは、雨粒を 1 粒ずつ動かす方法(パーティクル式、Hans Theobald Beyer の手法として知られる)を説明します。
- 雨粒を置く:地形のランダムな位置に、水の量 1、速さ 1、運んでいる土 0 の雨粒を置きます。
- 下り坂へ進む:その位置の勾配(高さの傾き)を周りの 4 点から求め、下り方向へ 1 マス進みます。前の向きを少し残す(慣性)と、雨粒がまっすぐ進みやすくなります。
- 運べる土の量を求める:速く、水が多く、急に下るほど多く運べます。
は進んだ前後の高さの差(下りなら負)、 は速さ、 は水の量です。
- 削るか、落とすか:
- 運んでいる土が より少なければ、余裕の一部だけ地面を削って持ち上げます。ただし、下った高さより深くは削りません(くぼみを掘りすぎないため)。
- 多ければ、超えた分の一部を元の位置に落とします。上り坂に差しかかった場合は、くぼみを埋めるように落とします。
- 速さと水を更新する:下った分だけ速くなり()、水は少しずつ蒸発します。水がなくなるか、地図の外に出るか、決まった歩数を超えたら終わりです。
これを何万粒もくり返すと、雨粒がよく通る道ほど深く削れ、さらに多くの雨粒が集まるようになります。この「正のフィードバック」で、枝分かれした谷が育っていきます。
実装のポイント
- 削るときは筆のように広げる:1 点だけ削ると、針で刺したような細い穴が並びます。半径 2〜4 マスの円に、中心ほど重くなるよう分けて削ります。
- 落とすときは 4 点に分ける:雨粒は格子の間にいるので、双線形補間の重みで 4 つの格子点に分けて落とします。
- 何粒流すか:格子のマス数と同じくらいの粒数から効果が見え始めます。多すぎると山全体が削られて平らになってしまうので、見た目で止めどころを決めます。
- GPU で並列に:雨粒同士はほぼ独立なので、GPU で数十万粒を同時に動かせます(同じマスへの書き込みが重なる点は、多少の誤差として許容することが多いです)。格子全体で水と土の流れを解く浅水波モデルベースの方法も GPU 向きです。
つまずきやすい点
- やりすぎて平らになる:地図の外へ流れ出た雨粒は土を持ち去るので、流しすぎると全体が低くなっていきます。回数を制限するか、地図の端で土を落とさせます。
- 小さな穴やトゲ:削る量や落とす量が大きすぎると、1 マスだけの穴や突起ができます。筆の半径を広げ、1 回の量を小さくします。
- 侵食だけでは崖が残る:水食侵食は谷を刻みますが、切り立った崖はそのまま残りがちです。熱・崩落侵食を交互にかけると、崖が崩れて自然な斜面になります。
デモで試すこと
- 「雨粒の通り道」の青い線は、最新の雨粒がたどった経路です。斜面を下り、谷に集まっていく様子を見てください。
- 雨を降らせ続けると、山肌に枝分かれした谷筋が刻まれていきます。止まったら「色」を「削れた所 / たまった所」にすると、赤い谷筋と、ふもとに広がる青い堆積地がはっきり見えます。
- 「元の地形に戻す」を押し、「削る強さ」を上げてからやり直すと、谷が深く鋭くなります。
- 「慣性」を上げると、雨粒が曲がりにくくなり、谷がまっすぐで太くなります。