ひとことで
急すぎる斜面の土が崩れ落ち、崖の下にたまる様子をまねて、地形をなだらかにする方法です。各マスを周りと比べて、「これ以上急だと崩れる」という角度(安息角)を超えていたら、超えた分の土を低い隣へ移します。何度もくり返すと、崖の角が崩れ、ふもとには一定の傾きの土砂の斜面(崖錐)ができます。
ゲームでの使いどころ
- 地形の自動生成の仕上げ:ノイズや段差で作った地形は、尖りすぎたり、ありえない急斜面が残ったりします。熱・崩落侵食をかけると、自然な崖と斜面の組み合わせになります。
- 水食侵食とセットで:水食侵食が谷を刻み、熱・崩落侵食が崖を崩す、という 2 つを交互にかけるのが地形ツールの定番です。
- 砂や土の山:掘ったり積んだりできるゲームで、盛った土が円錐状に崩れて広がる、砂山が崩れる、といった表現に使えます(安息角を守る処理は「砂のシミュレーション」の基本です)。
- 歩ける地形にする:キャラクターが登れる傾きの上限に合わせて安息角を設定すると、歩ける斜面と崖の区別がはっきりします。
しくみ
名前の「熱」は、昼夜の温度差で岩がひび割れて崩れる風化作用に由来しますが、計算の中身は単純です。
- 安息角を高さの差に直す:隣のマスまでの距離 に対して、崩れずにいられる高さの差は です( が安息角。乾いた砂で約 30〜35°)。斜めの隣は距離が 倍なので、許される差も 倍にします。
- 超過分を調べる:各マスについて、8 近傍それぞれとの高さの差から を引いた「超過分」を求めます。正の超過がある隣だけが崩れる先です。
- 土を移す:一番大きな超過分の一部(例えば半分 × 係数)をそのマスから取り、超過分の大きさに比例して低い隣へ配ります。
は隣 への超過分です。全部一度に動かさず半分程度にするのは、動かしすぎて逆向きに急になり、行ったり来たりするのを防ぐためです。
- 全マスの変化を足してから反映する:移動量を別の配列に集めておき、全マスを調べ終わってから高さに足します。調べながら書き換えると、計算順によって崩れ方が偏ります。
これをくり返すと、どの斜面も安息角以下になった所で変化が止まります。土の量は保存されるので、崖から崩れた分だけふもとが盛り上がります。
実装のポイント
- 高さの単位に注意:高さマップの値が 0〜1 で、表示時に何倍かしている場合は、安息角から求めた も同じ倍率で割ってそろえます。
- GPU で計算する:各マスは隣しか見ないので、セルオートマトンと同じ形で並列に計算できます。「出ていく量」と「入ってくる量」を 2 つのパスに分け、ピンポンバッファで読み書きを分けます。
- 岩と土を分ける:地層を「岩(崩れにくい、安息角が大きい)」と「土砂(崩れやすい)」の 2 層で持つと、岩の崖の下に土砂の斜面が付く、という実際の地形に近い形になります。
つまずきやすい点
- 全体が平らになりすぎる:安息角を小さくしすぎると、山全体がなだらかな丘になってしまいます。岩の層を残す、回数を制限する、などで個性を残します。
- 格子の向きが出る:4 近傍だけで計算すると、崩れた斜面がひし形の模様になります。8 近傍を使い、斜めの距離を考慮します。
- 回数が多く必要:崖の高さが大きいほど、崩れ終わるまでの反復回数が増えます。係数を上げすぎると不安定になるので、GPU で回数を稼ぐか、低い解像度で崩してから細かくします。
デモで試すこと
- 最初の段々の崖は、赤い所が安息角より急な斜面です。「崩落を進める」がオンだと、赤い所から土が崩れ、ふもとに一定の傾きの斜面ができていきます。
- 崩れが止まったら、「安息角」を小さくしてみてください。再び赤い所が現れ、さらになだらかになります。大きくすると、急な崖のまま残ります。
- 地形をクリックすると、その場所に土が盛られます。盛った土が円錐状に崩れて広がる様子は、砂山と同じです。
- 「色」を「削れた所 / たまった所」にすると、崖の上端が削れ、崖下に土がたまっていることが分かります。