Minecraftの地形生成を考える【2】
前回、一応基本となる地形生成のパーリンノイズについて一応書きましたので、今回はBeta1.8以降のバイオームわけについて。
バイオーム拡大法
バイオームを拡大していく方法です。
ゆえにMinecraftの地形生成は時間がかかります。
簡単な仕組みは
16×16(チャンク)を生成するために、もっと小さいブロックの四角形(例:4×4)を拡大・補完することで無限の生成を可能にしています。
無限といってもint値やlong値には最大が有るわけですから、その最大のなかのちょっとを何回も拡大することで擬似的に無限世界を生成することができるのです。
一番最初は固定シード値によってランダムに点をばらまくだけです。
拡大・補完の仕方
2×2ならば3×3に拡大します。(n x n => (2n – 1) x (2n – 1))
A | B |
C | D |
一番最初の拡大のときは下記のように拡大して補完します
A | A or B | B |
A or C | A, B, C or D | B or D |
C | C or D | D |
この処理の際、シード値を常に座標から計算するなどして一定にしておかないと次のチャンクとの補完結果がずれる場合があります。また隣のチャンクとの差異吸収のために16×16は補完後18×18になるようにしてそこから16×16を取り出すことで次の拡大に影響が出ないようにします。
それ以降の拡大時には大陸や海をちゃんとつなげていくために上下または左右の最頻値をとって補完していきます。
ただし全て異なる場合などは上記同様ランダムに決定していきます
例:
A | B |
A | A |
これを、
A | A | B |
A | A | B |
A | A | A |
これをもう一回拡大すると
A | A | A | B | B |
A | A | A | A | B |
A | A | A | B | B |
A | A | A | A | A |
A | A | A | A | A |
この拡大処理を十分に繰り返し、あるていどの大きさになったところで終了します。
このようにバイオームのあの複雑なバイオームの境界線を生み出すことができるのです。