この記事は、OUCC(大阪大学コンピュータクラブ)のアドベントカレンダー 12月17日分です。
OUCC Advent Calendar 2019
概要
現在、Unityで地形を自動生成してみたいなーと思ってて、まず、島の形を自動生成しよう!とやっている途中です。
まだまだ未完成ですが、今までの進捗を共有します。
地形の自動生成のアルゴリズムはいろいろあります。パーリンノイズやフラクタルブラウン運動(FBM)ノイズを使ってみたり、ダイヤモンドスクエア法を使ってみたり…
今回はこの記事でも紹介されていたセル・オートマトンの一種であるライフゲームの仕組みを使って自動生成してみたいと思います。
ライフゲーム
ライフゲームとは、碁盤のように格子で仕切られたフィールドがあり、仕切られた1つ1つの部屋(セル)が、以下のルールに従って、世代ごとに誕生、生存、死亡するというものです。
- 死んでいるセルの周り8つのセルのうち、3つ生きたセルが存在すると次の世代で誕生する。
- 生きているセルの周り8つのセルのうち、2つか3つの生きたセルが存在すると、次の世代も生存する。
- 生きているセルの周り8つのセルのうち、1つ以下の生きたセルが存在すると、次の世代で死亡する。
- 生きているセルの周り8つのセルのうち、4つ以上の生きたセルが存在すると、次の世代で死亡する。
このルールを少し変更したものを用いて、地形を作っていきます!
作り方
-
四角形のマップを作り、辺に当たるセルをすべて海(false)とする。
-
辺でないセルはランダムに海と陸(true)を配置する。(ホワイトノイズ)
-
以下のルールで、マップに対してライフゲームを数回実行する。
周り8つのセルのうち、
- x個以上陸が存在すると、そのセルは陸になる。
- y個陸が存在すると、そのセルは現状維持。
- z個以下だと、そのセルは海になる。
このようなルールにすることで、秩序なくばらばらだった陸と海が、陸の多いところ、海の多いところに集まり、現実の島のような地形になります。
結果
まずは、一辺が80マスの正方形のマップを作成し、周り1マスは海、それ以外はランダムに陸、海を配置します。
これに、x=5、y=4、z=3を代入してライフゲームを20回実行した結果が以下です。
だいぶ島らしい形になりましたね!(島が1つとは言っていない)
今後の方針
ライフゲームを用いて島の形を自動生成できました。ですが、80×80なので、ドット絵のようにガッタガタです。単純に80という数字を大きくすると重くなっちゃいますので、この状態から滑らかにすることが必要です。また、ライフゲームを用いた方法では地形の高低が決められないので、今後はそれらを決める方法を考えようと思います。他にも冒頭でしゃべった、ノイズやダイヤモンドスクエア法と組み合わせたやり方もやってみようと思います。
それでは!
バージョン
Unity 2019.2.4f1
参考ページ
Terrain に流す地形データを自動生成
https://ch.nicovideo.jp/tenoji/blomaga/ar1269827