Minecraftを作ろうとした話

4日目を担当させていただきます。ITSUKIです。
本日はよろしくお願いいたします。

この記事はゲーム制作者の発表の場アドベントカレンダーに参加中です。
https://adventar.org/calendars/8046
企画者のtwitter : https://twitter.com/hothukurou

自分のtwitter : https://twitter.com/itsuki_develop
ゲーム開発者向けのDiscordServerも運営しています。
https://disboard.org/ja/server/849501804734709840

本日は3,4年前に作成したMinecraftを開発した際に得た
地形に関しての知見の共有を行いたいと思います。

内容としまして
1.地形データの作成
2.チャンクの生成
3.複数チャンクの生成

・前提
Minecraftのデータ管理はチャンクと呼ばれる
16ブロック*16ブロック*384ブロックを区切りとした
区画で管理されています。
※ただし今回は16*16*16としています。
https://minecraft.fandom.com/ja/wiki/%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF

  • 地形データの作成
    チャンク事にデータの作成を行います。
    https://kan-kikuchi.hatenablog.com/entry/PerlinNoise
    こちらを参考にパーリンノイズを使用して表面を作ります。
    その後表面のブロックを基準に
    ・草ブロック 1つ(最上層)
    ・土ブロック 3つ
    ・石ブロック 無限
    ・岩盤ブロック 1つ(最下層)
    になるようにデータを作成します。

  • チャンクの生成
    今回は単純にポリゴン生成を行います。
    空気データとブロックデータのはざまにポリゴンを生成するという事をすることでよけないポリゴンを生成せずに済みます。

    簡単なやり方はブロックデータが隣接している空気ブロックを集めて処理するやり方になります。
    空気ブロックを基準に8方向のブロックの種類を見て側面のポリゴンを生成するやり方になります。

  • 複数チャンクの生成
    基本的にはチャンクの生成と同じです。
    生成した際に隣接したチャンクがある場合、
    間にあるポリゴンの解決がとても大事になります。

    チャンクには他のチャンクに接する面としない面があり、
    そこで処理を分離することで、高速化を図ることが出来ます。

  • まとめ
    データを元に再現をする仕組みというのを意識すると、作りやすいのかなと思います。
    またMinecraftなどのボクセル系はいかにポリゴンが少なくしながら、地形改変を可能にするかが肝なので、地形生成時の高速化は必須です。
    今回開発したものはそこまで高速化は出来ていませんが、
    その一端を経験できたのは、とても良い経験だと考えます。

短いですが見ていただきありがとうございます。

この記事が気に入ったらサポートをしてみませんか?