m-crftは3Dサンドボックスゲームです。
3DCGはDxLibを使って実装されています。
Windowsでのみ動きます。LinuxとMacには対応していません。
- 3DCGの表現技法を一通り扱ってみるための題材として
- 水がどんどんきれいになっていくのが楽しい
- ボクセルエンジンの最適化を楽しむため
ももも
がかわいいため
- 無限の広さを持つ世界。
- パーリンノイズによる自然な地形。4つのバイオームがあります。
- Shaderによる基本的な3DCG表現。(影、光、水面反射など)
- マルチプレイ対応!チャットも可能。
- 便利なコマンドにより、ブロックによる建築がサポートされます。
実行バイナリは以下のリンクからダウンロードできます。
[TODO:link]
Visual Studio 2017 CommunityとDxLibを使って開発しています。
ソリューションファイルが含まれているので、Cloneすればそのまま動かすことができます。
ただし、DxLibの設定は各自で行っていただく必要があります。DxLibの設定はこちらのリンクを参照してください。
Cドライブ直下にDxLibのプロジェクトに追加すべきファイル_VC用
が置いてあるものとしてプロジェクトの設定をしてあります。
Cドライブ直下にない場合はDxLibの設定を行ってください。
a: 左に移動
s: 後ろに移動
d: 右に移動
w: 前に移動
e: インベントリを開く
/: コマンドモードを開く
f: ダッシュキー。このキーを押しながらasdwを押すと高速移動。spaceを押すと大ジャンプ。
space: ジャンプ
右クリック: ブロック設置
左クリック: ブロック破壊
マウス移動: カメラの方向を変える
ホイール: アイテムを変更
Worldは9×9のChunkの集まりです。Chunkは16×16×256個のBlockの集まりです。Worldを構成するChunkの数は実行中に変更することができます。プレイヤーがWorldの中心のChunkから別のChunkへと移動するたびに、必要なChunkを最生成、またはメモリから読み出します。
地形はパーリンノイズに従って生成されます。ただ純粋にパーリンノイズを用いているのではなく、川や海に面した地形が不自然にならないよう高さを調整したり、洞窟をつくるための調整はしています。
今のところ4つだけです。
マルチプレイはDxLibの通信機能を用いて行われています。
メッシュの数はレンダリング時間に大きな影響を与えます。そのため、なるべく少ないメッシュで世界を構築することが求められます。
m-crftでは、Greedy Mesh
というメッシュ構築アルゴリズムを用いています。
以下のURLを参考にしました。
[https://0fps.net/2012/06/30/meshing-in-a-minecraft-game/]
Shaderを用いて、以下のことを表現しています。
- 影
- 水面反射
- さざ波
- アンビエントオクルージョン
- ライトブルーム・ゴッドレイ
- フォグ
- カラーライト
影は、深度バッファシャドウアルゴリズムを用いて表現しています。
Cascade Shadow Mapping
Variance Shadow Mapping
Gaussian Blur
の三つを組み合わせています。
DirectXのチュートリアルと リポジトリを参考にしました。
水面反射はScreen Space Reflection(ssr)を用いて表現しています。
よく用いられるのはカメラを水面の下に持ってきて、そこから得られる画像を水面に描画する方法ですが、この方法は水面が一定の高さにあるシーンでしか用いることができません。
ssrを用いると画面外にある物体を水面に反射させることはできませんが、ある程度のクオリティの描画結果を得ることができます。
動的法線マップを用いて表現しています。以下のような方法です。
- ハイトマップを作成
- 波動方程式に基づいて波のシミュレーションを行い、ハイトマップを次の状態に更新
- ハイトマップに基づいて法線マップを作成
- 法線マップを水面にテクスチャマッピング
アンビエントオクルージョン
は、遮蔽度
を表現するための技法です。
以下のURLを参考にしました。
[http://0fps.wordpress.com/2013/07/03/ambient-occlusion-for-minecraft-like-worlds/]
太陽に関する表現技法です。ライトブルームは太陽をまぶしく見せる表現、ゴッドレイは木漏れ日のような表現です。
以下のURLを参考にしました。
[http://maverickproj.web.fc2.com/pg65.html]
遠景には距離フォグをかけています。以下のURLを参考にしました。
[https://wgld.org/d/webgl/w060.html]
以下のURLを参考にしました。
[https://www.seedofandromeda.com/blogs/29-fast-flood-fill-lighting-in-a-blocky-voxel-game-pt-1]