Water, terrain & plants

Thermal Erosion

熱・崩落侵食

斜面の土砂を動かして崖下に堆積させる。

9 / 10

Interactive demo

Preparing the demo…

Thermal Erosion

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

This explanation is currently available in Japanese.

ひとことで

急すぎる斜面の土が崩れ落ち、崖の下にたまる様子をまねて、地形をなだらかにする方法です。各マスを周りと比べて、「これ以上急だと崩れる」という角度(安息角)を超えていたら、超えた分の土を低い隣へ移します。何度もくり返すと、崖の角が崩れ、ふもとには一定の傾きの土砂の斜面(崖錐)ができます。

ゲームでの使いどころ

  • 地形の自動生成の仕上げ:ノイズや段差で作った地形は、尖りすぎたり、ありえない急斜面が残ったりします。熱・崩落侵食をかけると、自然な崖と斜面の組み合わせになります。
  • 水食侵食とセットで:水食侵食が谷を刻み、熱・崩落侵食が崖を崩す、という 2 つを交互にかけるのが地形ツールの定番です。
  • 砂や土の山:掘ったり積んだりできるゲームで、盛った土が円錐状に崩れて広がる、砂山が崩れる、といった表現に使えます(安息角を守る処理は「砂のシミュレーション」の基本です)。
  • 歩ける地形にする:キャラクターが登れる傾きの上限に合わせて安息角を設定すると、歩ける斜面と崖の区別がはっきりします。

しくみ

名前の「熱」は、昼夜の温度差で岩がひび割れて崩れる風化作用に由来しますが、計算の中身は単純です。

  1. 安息角を高さの差に直す:隣のマスまでの距離 ℓ\ell に対して、崩れずにいられる高さの差は T=ℓtan⁡θT = \ell \tan\theta です(θ\theta が安息角。乾いた砂で約 30〜35°)。斜めの隣は距離が 2\sqrt 2 倍なので、許される差も 2\sqrt 2 倍にします。
  2. 超過分を調べる:各マスについて、8 近傍それぞれとの高さの差から TT を引いた「超過分」を求めます。正の超過がある隣だけが崩れる先です。
  3. 土を移す:一番大きな超過分の一部(例えば半分 × 係数)をそのマスから取り、超過分の大きさに比例して低い隣へ配ります。
Δh移す=c⋅max⁡jdj2,Δhj=Δh移す⋅dj∑kdk\Delta h_{\text{移す}} = c \cdot \frac{\max_j d_j}{2}, \qquad \Delta h_j = \Delta h_{\text{移す}} \cdot \frac{d_j}{\sum_k d_k}

djd_j は隣 jj への超過分です。全部一度に動かさず半分程度にするのは、動かしすぎて逆向きに急になり、行ったり来たりするのを防ぐためです。

  1. 全マスの変化を足してから反映する:移動量を別の配列に集めておき、全マスを調べ終わってから高さに足します。調べながら書き換えると、計算順によって崩れ方が偏ります。

これをくり返すと、どの斜面も安息角以下になった所で変化が止まります。土の量は保存されるので、崖から崩れた分だけふもとが盛り上がります。

実装のポイント

  • 高さの単位に注意:高さマップの値が 0〜1 で、表示時に何倍かしている場合は、安息角から求めた TT も同じ倍率で割ってそろえます。
  • GPU で計算する:各マスは隣しか見ないので、セルオートマトンと同じ形で並列に計算できます。「出ていく量」と「入ってくる量」を 2 つのパスに分け、ピンポンバッファで読み書きを分けます。
  • 岩と土を分ける:地層を「岩(崩れにくい、安息角が大きい)」と「土砂(崩れやすい)」の 2 層で持つと、岩の崖の下に土砂の斜面が付く、という実際の地形に近い形になります。

つまずきやすい点

  • 全体が平らになりすぎる:安息角を小さくしすぎると、山全体がなだらかな丘になってしまいます。岩の層を残す、回数を制限する、などで個性を残します。
  • 格子の向きが出る:4 近傍だけで計算すると、崩れた斜面がひし形の模様になります。8 近傍を使い、斜めの距離を考慮します。
  • 回数が多く必要:崖の高さが大きいほど、崩れ終わるまでの反復回数が増えます。係数を上げすぎると不安定になるので、GPU で回数を稼ぐか、低い解像度で崩してから細かくします。

デモで試すこと

  1. 最初の段々の崖は、赤い所が安息角より急な斜面です。「崩落を進める」がオンだと、赤い所から土が崩れ、ふもとに一定の傾きの斜面ができていきます。
  2. 崩れが止まったら、「安息角」を小さくしてみてください。再び赤い所が現れ、さらになだらかになります。大きくすると、急な崖のまま残ります。
  3. 地形をクリックすると、その場所に土が盛られます。盛った土が円錐状に崩れて広がる様子は、砂山と同じです。
  4. 「色」を「削れた所 / たまった所」にすると、崖の上端が削れ、崖下に土がたまっていることが分かります。

References

GPU Gems — Effective Water Simulation ↗

A general reference for this subcategory.