Help us understand the problem. What is going on with this article?

世界地図ぽい何かの自動生成をしてみたぜ!(陸マスク編)

自動生成の世界地図を作りたい。(前書き)

個人的に作りたいゲームがあるので、その材料として作りたいなぁ。と思い。作りました。
まだ、2Dゲーか3Dゲーか決めてませんが、出来たらいいなっ!

前提条件

・一般プレイヤーのパソコンで使えるだけ、生成処理を出来るだけ処理は軽くする。
・2Dでも3Dでも利用できる。
・標高、湿度、温度、川&湖の情報を含んだ地形データ。

生成される世界地図イメージの最終地点

エースコ〇バットの地図という感じです。
(絵は著作権的に問題あるので、ググって)
感触としては、現実の地球に近い感じ仮想地図という感じです。

基本的な仕組み

現在の状況

1.陸ノイズを作る
マップ自動生成の基本のPerlinNoise先生です。私は、Siv3Dの機能を使いました。
特質した話はないので、本稿ではツッコみません。
2.陸マスクを作る
本稿のメイン話。

今後の予定

3.海底マスクを作る
4.川&湖データを作る
5.適当にバイオームを決める

陸マスクを作ろう!

失敗した案

以下の内容は、やってみたけど失敗した案となります。

1.丸または楕円でマスクを掛ける。

これは、海外の方がサイトで紹介していた「Procedural Island Generation」をそのまま実装して見た。
このサイトでマスク後の画像があるが、正しく如何にも「丸でマスクしました!」という感が凄くて却下しました。
(実装して見てみるまで、この結果に気づかなかった。後でサイト見直して愕然とした。どう見ても文章や画像をちゃんと見てない読んでないアホである。)

2.複数の四角でマスクを掛ける。

これは、自分で考えて「なんか四角をいっぱい置けば、島や大陸が簡単に作れるじゃあねぇ!」という甘い考えで、作った。
乱数でサイズ決定、乱数で配置決定していたため、左右に偏ることが多く。そのため、分散値や中央値で制限を入れて生成してみたが、はっきり言って、島や世界地図に見えないので却下だったが…友人1号に褒められたので、ウキウキして、台形に取り組むのであった。

con_NG.PNG

3.複数の台形でマスクを掛ける。

2番を改善するための案。個人的には「なかなか、いいじゃあないの!excellent!」と思った…思った…。

con_NG.PNG

友人2号に見せたら、「水の動きを考えると、この突起や窪みがおかしく全く島などには見えない、それぽっく見せたいなら、大陸移動やら考えたプログラム書け!」と超批判されてしまう。
内心、「そんな無茶な…」と思いつつ、多角形に手を出すのであった。

6頂点以上、8頂点以下の多角形でマスクを掛ける

↓動画です。
****

多角形を生成したら上の画像みたいに中々の男前になったので、いいのではないかと思います。友人2号からお許しも出ました、やったぜ。
やり方しては下記のとおりである。

1.頂点数を決める。
 頂点数は、6から8がベスト。
 ・値が低いほど、1つの島もしくは小数の島が生成。
 ・値が高いほど、多くの島かつ四角ポイ(キャンバスの形)配置。

2.頂点を決める。
 頂点の位置を決める際には、キャンバスの中かつマスク画像をぼかした際に図形が外側に出ない位置に置く。
 2頂点目の場合は、異常に1頂点目から離れないように、図形を構成する上で各頂点が必要とするだろう面積を考慮した上で、1頂点目から2頂点目の位置を制限する。
 3頂点目以降は、自己交叉多角形にならないように、以前決定した頂点たちが構成する線に新たにできるであろう線が交差することがないようにする。また、鋭利な角度にならないようにやや角度制限を付ける。
※ おすすめの制限は、最小は25度、最大は制限なし。なお、角度はマイナス角度を考慮するためで絶対値で判断する。
 更に、1頂点が取得した面積があまりにも大きすぎないよう(1頂点で全体の面積の50%以上を占めてしまうような事象対策)に、新たに付ける頂点が作る面積と、均等に各頂点に面積を割り振った場合の面積が異常に乖離しないようにする。
※ おすすめの許容面積範囲は、均等に各頂点に面積を割り振った場合の面積が、プラスマイナス30%程度。

成功した案

10頂点以上、12頂点以下の多角形でマスクを掛ける

 「6頂点以上、8頂点以下の多角形でマスクを掛ける」では、一見でとてもよくできているように見えたが、実際に目標イメージの大陸図と見比べたところ、頂点数が明らかに足りない状態であった。大陸としては、頂点はこの程度が最適だと思われる。
 ただし、小さめの陸をイメージに考えている場合では、「6頂点以上、8頂点以下の多角形でマスクを掛ける」のほうが、納得を得やすいかもしれない。

noise78.png

陸を使ってワールドマップ

失敗した案

キャンバス分割案

資料2_NG.PNG

 ダンジョン自動生成によく利用されるものを使ってみたが、全く世界地図に見れないものが出来上がった。問題点は、キャンバスを小さく区切った中に、1の大陸を作るプログラムを使って陸を作ってしまったからである。どうしても、小さくかつ明らかに四角で区切ったように見えてしまう。

考察2.PNG
 この画像は、実は1の大陸を作るプログラムの失敗3の「台形で作る大陸」で作成したマップを上下反転したもの。偶然、印刷して上下ひっくり返したものである。
 全体の陸の重心が上の方にあり、3つから4つほどの陸が左右に散らばっている、バランスよく大きなサイズの図形同士が近距離に存在している。(ついでに、地球の大陸配置に似ている。)この構成を見た時に、安心でき理想の世界地図と感じた。このような考えは、固定概念に囚われているとも思ったりしたが…。

成功した案

乱数で適当に置く案

 だめ。全くもってダメ…と言いたいが、これ以上の案が思い使いませんでした。
 今回は、単純に乱数で置くだけでなく、図形を中央へ寄せる処理を追加し終了とします。

単純に乱数で図形がかぶらない程度に置いただけの場合

↓動画です。
****

乱数で置いてから、図形を中央へ寄せる場合

↓動画です。
****

適当に海と陸の境目を決める

今回は、254から0のうち、78で区切りました。
ちなみにちょっと値を高くすると、友人には「地元住民が使うような詳細な地図に感じられた」
値を低くすると「デフォルメされた子供向け地図に感じられた」という感想があったので、用途別に設定しなおしてもいいのかも

考察?問題点?

世界地図とは何なのか

 世界地図として作成する処理を作る際に発生した問題として、全く改善案が思いつかなかった点がある。作っていると、なぜ世界地図と認識できるのか、なぜ陸を置くだけでは安心できないのかと思い始めてしまい、ハムスター🐹のように回し車を回し続けている気分になった。
 結論としては、ユーザーに陸を配置させるか、乱数で生成した画像の中で選択するかして、統計的になぜ地球人は地図であると感じられるのかと、調査する必要があるかと考えています。誰か、そういうの感じの資料をご存じでしたら教えてください…。

感想

初期の大陸図を見て褒めてくれた友人1号、中盤から後半の地図を見て超批判してくれた友人2号に感謝!
なお、ソースコードは、全部完成したら載せる予定です…

*** 参考資料 ***

「Procedural Island Generation」
https://shanee.io/blog/2015/09/25/procedural-island-generation/
「Polygonal Map Generation for Games」
http://www-cs-students.stanford.edu/~amitp/game-programming/polygon-map-generation/

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした