Logo
Menu

ByProduct - 副産物

IT FukuSanButsu Blog

社内インフラエンジニアの自宅からはじまるIT
自宅のPCに向き合いながら気づいたことや個人的な知見をまとめています

2022/01/10 ゲーム 9107 Views

【マイクラ】ブロックを1つも触らずにMinecraftで現実世界を再現する

お疲れ様です。
しらせです。

皆さま新年いかがお過ごしでしょうか。

私は読書をしたり出かけたりゲームをしたり、コロナ禍でも充実した年始を過ごしています。

コロナ禍で好きなところにも行けず、外に出る機会も減ってしまいました。

そんな中どうしても遠くの地の雰囲気を感じたい。

そう思うことないでしょうか?

Googleマップなんかを見ても何か物足りないし旅行関連の動画を見ても満たされない。

昨年はそんなモヤモヤを抱えながら1つやりたいことを考えていました。

「マインクラフトで日本の町を再現したい」

Webで調べれば腐るほど出てくるような枯れたネタですね。

マインクラフトのクリエイティブモードでいろんな町を再現して雰囲気を味わってみたい!

日本列島を縮尺で再現したいわけではなく、実際の町1つ1つを実寸大でマインクラフトの世界で再現したいんです!

ということでやってみたレポートです。

もくじ

構想

やりたいことは決まっています。

「マインクラフトの世界に日本の町を実寸大で再現したい。」

それだけです。

ただ1点だけ条件を付けました。

「ブロックを1つも触らない。」

です。

マインクラフトといえば自由に建築ができるところが醍醐味ですが、今回は1つもブロックを触らずに作ってみたいんです。

人力で作るほどたくさんの友達が居るわけでもない(泣)し、何か月や何年もかけてやりたくもない。

現実世界を自動でそのままマイクラに持ってきたい!

それだけです。

日本列島を再現した!とか、富士山を再現した!とか、1/100とかのスケールで作っている人は時々見ます。

今回は1/1スケールで自動で町を作ります。

どうやるか?

大まかなに以下のような流れの想定です。

  1. 地形や座標、建物などの情報を持ってくる
  2. マインクラフトが理解できるように情報を整形する
  3. 整形した情報を流し込んでブロックを積み上げる
  4. 完成したフィールドを楽しむ

次章からそれぞれについて詳しく解説していきます。

地形や座標、建物などの情報を持ってくる

無い頭でいろいろ考えたところ以下の2通りしか思いつきませんでした。

  1. 地理情報を元に再現
  2. 航空写真などを元に再現

最終的には2つ目の写真を使った手法を選択しましたが、1つ目も軽く触っていますので内容をまとめます。

1.地理情報を元に再現

こちらの案は、国土地理院などから公開されている数値標高モデルデータを参考に、緯度経度と標高から町を再現する手法です。

(参考)基盤地図情報ダウンロードサービス

こちらは最終的には敷居が高すぎて断念しました。。

地理データであるxmlファイルを頑張ってパースして、CSVファイルとしてマインクラフトに食えそうなレベルにもっていこうとしました。

しかしできたのはここまででした。
地形データを再現したところで、5mメッシュ情報ではGoogleマップの3Dと同じところまでが限界だと分かったからです。

メリット

  • 緯度経度標高の情報を元に正確な地理情報を再現できる

デメリット

  • 最小でも5mメッシュになる(情報が荒い)
  • 標高データがめちゃくちゃ分割されていて使いにくい
  • xmlファイルのフォーマットを理解していないと使えない

50cmもしくは1mの情報が無いと厳しいですね。

地理データの扱いも難しくこちらは断念。。

2.航空写真などを元に再現

地理情報が使えないと分かったので、もう航空写真をそのままマインクラフトに食わせるしかねぇ。

ということでGoogle Earthを利用して地形情報にできないかチャレンジしてみました。

ほしい情報は「緯度」「経度」「標高」の3つです。

Google Earthではこれら3つが入手できそうでしたが、標高の情報に関してはどうしてもローカルで使える形にはできなそうでした。

一旦、航空写真と同じイメージをマインクラフトに食わせられるか?にチャレンジしてから、道筋が見えたら標高を考えることにしました。

メリット

  • 細かいところまで再現できる

デメリット

  • 画像データを地形情報に変換しないといけない
  • 標高データが無い
  • xmlファイルのフォーマットを理解していないと使えない

マインクラフトが理解できるように情報を整形する

試しにお借りした航空写真は以下です。

引用:earth.google.com

(参考)35.7266406,139.1472625 - earth.google.com
https://earth.google.com/web/search/35.72664058,139.14726253/@35.7266406,139.1472625,268.99510033a,838.36333298d,35y,-177.53188209h,0t,0r/data=CigiJgokCVJ7UUxr3UFAEbkiCc-Z3EFAGVpJrivvZGFAIWfVaZN9ZGFA

山々に囲まれた良い町です。

まずはこの画像をベースにxy座標に対応する色テーブル(青,緑,赤)に変換していきます。
変換手順は以下の通りです。

  1. 画像をビットマップに変換する(扱うのが楽なので)
  2. ビットマップ画像から各ピクセルごとの青,緑,赤色を抽出する
  3. x,y座標と色情報の一覧をCSVにエクスポートする

あまり大きい画像だと処理に時間がかかるので縦横1,000px以内にしました。

変換については使い慣れたPowerShellを選びました。

csvファイルは以下のような形式で、縦横の全ピクセル数分行が並んでいます。

いい感じです。

整形した情報を流し込んでブロックを積み上げる

画像から地形の色を含めた情報に変換が終わりましたので、この情報をマインクラフトに食わせて地形にしていきます。

マインクラフト側への情報の入れ込みは、マルチサーバーを使って全ピクセルの情報を流し込みます。

使うコマンドはマインクラフトで使えるfillコマンドです。

/fill x z y x' z' y' block

前の手順で抜き出した座標と色の情報から、マインクラフトに流し込むためのfillコマンドを生成します。

この時、画像の色情報に合ったブロックを入れる必要がありますが、ここが1つ目の難関です。

ビットマップデータの「青,緑,赤」からマインクラフトで使える色付きブロックに変換する必要があるのです。

再現度は下がりますが、各色の数値を3等分して計27通りの色に変換してみました。

このままだと白や黒が抜けてしまうので、3色すべての数値が10以内であれば、白~黒に変換するロジックも入れています。
(ソースコードは汚いので差し控えます。。)

上記の条件を入れたスクリプトを流すと以下のようなコマンド一覧が出力されます。
約70万行ありますw

これをマルチサーバー上のコマンドラインに数回に分けて流し込むと、、、

できました!

見た目はばっちりです!!

ただ、単に写真を転写しただけなので平坦です。

完璧ですね。(ここまでは)

完成したフィールドを楽しむ

いや、でも求めているのはこれじゃない。。

ちゃんと地形や木々、建物が再現されていないとイヤや!

抜けている標高の情報を何とか入れたい。
うーん。

「白黒の濃淡(256段階)をz軸の標高に見立てて、fillコマンドと一緒に流し込めないかな?」

黒(0x00)は高い標高で、白(0xFF)は標高ゼロ。
そのまま流し込むと逆になるので必ず255から引いてあげる必要があります。

山の周辺を高くしつつ、道とその周りを低くしてみます。
azpaintさんを利用してこんな感じに。。

この標高画像と一緒にコマンド生成スクリプトに混ぜ込んで、流し込んでみると、、、

きたあああああ!
山並みは255mを超えるとそそり立つので5で割った数値に縮小してますw

現実世界とはちょっと違うかもしれないけど!
町の雰囲気を楽しめる!

ちゃんと道路も認識できる!
建物の屋上から生えちゃってるけど、微妙に追加したオークの木々もいい感じ!

交差点もいい感じ!

これはいろいろ応用ききそう!


新年早々何やってるの?

以上
おつかれさまでした。

Handmade with IT Knowledge.