モナドのまほう　第７話『オープンワールドという泥沼』

* [第一話　画像が表示できました](http://qiita.com/hiruberuto/items/5321d8cebce7b87851f6)　←初回
* [第六話　Blenderで涼風青葉ちゃんごっこの巻](http://qiita.com/hiruberuto/items/247c6c0034b6383c5436)　←前回


粛々とゲームを作る日記です。しかも純粋関数型プログラミング言語で。




# マインクラフトより狭いけど高い

コーディングでは最適化作業が続いていてつらかったですが、パフォーマンスの問題はなんとか解決の目処が立ってきました。地中に隠れた部分の頂点を根本的に削減することで、ポリゴン数は以前の数十分の一にまで減っています。いろいろと小汚い最適化を繰り返したので細かいバグの修正や調整はまだ必要ですが、これでマインクラフトと同じくらいの描画範囲が確保できそうです。

マインクラフトの世界は水平方向に三千万ブロック四方の大きさがあるらしいのですが、本作はいまのところ26万ブロック四方程度の広さしかありません。これはパフォーマンス上の理由で三次元の座標をひとつの数値型に押し込んで表現しているからです。倍精度浮動小数点数型の仮数部52ビットのうち、X軸に18ビット、Z軸に18ビット、Y軸に16ビットを割り当てています。地形を生成するときに座標の計算が大量に行われるのですが、ここで座標を表すオブジェクトを作成してしまうとガーベージコレクタが動きまくってカックカクになるので、無理やりプリミティブな数値だけで表現しているのです。

マインクラフトの場合は高さ方向の空間の大きさが固定になっているらしく、0から255までの範囲にしかブロックが置けないようになっているそうです。それに対して、本作では上下方向にもそのような制限がなく、ひたすら天空を目指してブロックを積み上げたり、ひたすら地下を目指して掘り下げたりすることができます。垂直方向に16ビットの精度が確保されているので、水平面をゼロとして32767ブロックまで積み上げることが理論上可能です。またマイナス方向にも32768ブロックまで掘り下げることが可能になっています。1ブロック=1メートルとすればエベレストでもすっぽり収まる高さで、これ以上の高さになるとお前は軌道エレベータでも建造するつもりかという話なので十分な広さは確保できていると思います。

そんなわけで、ちゃんと果てしなくブロックを積めるか試してみましたが、200ブロックを超えた高さでも問題ありませんでした。

![height200b.png](https://qiita-image-store.s3.amazonaws.com/0/64695/a8429ecc-fe8b-7a2b-dd71-ab7f169b79fa.png)

手作業でクリックして積んだので、これ以上は面倒くさくて止めました。

![height200c.png](https://qiita-image-store.s3.amazonaws.com/0/64695/b9fe917a-203f-35a5-d82e-766a597b365e.png)

カリン塔みたいです。

![height200.png](https://qiita-image-store.s3.amazonaws.com/0/64695/e96b7b9f-ed88-c945-04d9-b9015224dbe4.png)

ただし、高いところまで行くと見晴らしは良くなるものの、その高さで見渡せるだけの広さの地形を表示できるわけではないので、あんまり高く登っても見晴らしに関しては意味が無いです。作ってみてわかったのですが、マインクラフトの256ブロックという高さ制限はそのへん合理的なので、本作の仕様も考えなおすかもしれません。あんまり垂直方向に自由度が高くても、地下の大半は表示されることもなく隠れているし、上空はほとんどがブロックのない空隙なので無駄が多いのです。





# セルシェーディング

前回ゲーム内に表示した時は顔に影が落ちてとても見苦しかったのですが、アニメみたいに塗り分けるセルシェーディングへ切り替えたら多少は見れる画になってきました。[こちら](http://www.html5gamedevs.com/topic/4691-shader-cel-shading/)で紹介されていたシェーダをそのまま使っているだけですが、前回の初代プレイステーションみたいな画よりはずっとマシだと思います。

![cell.png](https://qiita-image-store.s3.amazonaws.com/0/64695/d936f499-b662-99fb-1a0e-588a5b2d3cbf.png)

ただ、この単純なシェーダでは影の部分で肌の色がくすんでいるのがちょっとつらいです。現実なら人間の皮膚はある程度光を通すので、その際に血液の色の影響で若干赤みがかかって鮮やかな光が出てくるのです。直接光が当たっている部分は直接の反射光が強すぎてその赤みがわかりにくいのですが、影の部分はわりと赤みがかってみえるので、これがキャラクターの肌の生き生きとした質感に影響します。二次元のイラストレーションでも影はちょっと彩度を上げて塗ったりするのです。それがこのシェーダでは再現できていないので、またいろいろ調整が要ると思います。

あと、キャラクターに輪郭を表示するともっとアニメっぽくなりますね。ただし、なめらかな輪郭線を表示するにはポリゴンがかなり細かくなければならず、下手に荒いポリゴン数で輪郭を出そうとするとゴミが現れて小汚くなります。まだ試していませんが、うまくいくかどうか……。

本作のグラフィックデザインを考えるに、そもそもこの手のブロック積み上げる形式のグラフィックではあまりにディフォルメが効きすぎていて、どうあってもシリアスな雰囲気にはならないということに気付きました。最初はSFでゾンビでシリアスなホラー路線を考えていたのですが、もうファンタジーでメルヘンでキュート路線で行こうと思います。

っていうか、なんかセルシェーディングのためにマテリアルを切り替えたら、今度はアニメーションが効かなくなる問題が……。~~たぶんbabylonjsのバグだと思うんですけど~~いやこれバグじゃないですわ。シェーダ書き換えたんだから当たり前です。シェーダをアニメーションに対応させなくては。


# BGMを作ろうとして早々に挫折

babylonjsのオーディオ再生機能を試そうと思ったのですが、その前に自分でBGMも作りたくなってしまって、今度はそっちの作業に手を付けることに。でもこれ……今回の一連の作業のなかで**ぶっちぎりに一番難しい**ですわ。私は多少の楽器の心得はあるのですが、作曲まではやったことないので、いざ作ろうと思ってもどこから手を付けてよいやら……。

それに、作曲の作業をするならフルサイズのキーボードが必要ですね。アレンジや耳コピするときなんかには２オクターブしかない小さなキーボードを使っているのですが、これでは片手づつでしか演奏できないのでぜんぜん曲のイメージが掴めないのです。しかもこれまで使っていたStudio Oneがバージョン3からSFZ形式のサウンドフォントが使えなくなるという制限が増えてしまって、ソフトウェアの方も馴染むツールがないでつらいです。Studio One2を使うしか……。もうフリー素材に頼るべきかどうか……ひとまず音楽は後回しです。






# 次のお話

* [第八話　たまにはデモします](http://qiita.com/hiruberuto/items/c1017d61978afbce6cc5)