モデリング知識ゼロでもマインクラフトのようにブロックを積み上げてローポリな3Dモデルを作る方法

## はじめに
今回はモデリング知識が特になくても（自分のこと）マインクラフトのようにブロックを積み上げてローポリな3Dモデルを簡単に制作できる方法を記事にしたいと思います。

MagicaVoxelというツールを使いモデルを作成し、Unityで使えるようにすることが目標となります。

<img width="645" alt="スクリーンショット 2019-01-12 21.02.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/55086/5eaf73a5-f4b2-882c-ac25-0f675c3f0e54.png">

最終的には上記のようなローポリモデルがUnityで使えるようになります。

## MagicaVoxelとは

* https://ephtracy.github.io/

MagicaVoxelは、ブロックを積み上げてボクセルライクなモデルを直感的に作成できるツールです。モデリングの知識がなくてもノンデザイナーでも手軽に3Dモデルを作ることができ大変重宝しています。
<img width="533" alt="スクリーンショット 2019-01-12 16.28.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/55086/2c2188b1-a00e-cbaa-35db-4d96ba4b64cb.png">

MagicaVoxelではボクセルライクなモデリングに使われることが多いと思いますが、今回はあえてローポリライクなモデルを作成してUnityにインポートすることに挑戦します。

## 今回使用したツール
* [MagicaVoxel(0.99.2）](https://ephtracy.github.io/)
* Unity2017.4.14f1
* [MeshLab](http://www.meshlab.net/)

## MagicaVoxelでマーチングキューブ変換したモデルを出力する
MagicaVoxelで適当にモデリングを行います。今回はシンプルな家を作ってみました。
（MagicaVoxelのインストール方法や使い方についての説明は割愛させていただきます）

MagicaVoxelの特徴としてモデルの作成機能だけではなく、レンダリング機能も備えていることが挙げられます。

<img width="533" alt="スクリーンショット 2019-01-12 16.28.43のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/55086/3e309aa9-ca18-5578-7821-53b26034b135.png">

レンダリングとモデリングモードの切り替えは赤で囲んだ部分で行うことができます。
レンダリングモードにすると以下のEditor表示になります。

<img width="533" alt="スクリーンショット 2019-01-12 22.40.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/55086/219e49a1-06c0-fd7c-1b34-e7ef21b31446.png">

モデリングモードでは、ライトやEmmision、材質など設定を変えていろいろなレンダリングを試すことができます。その中にSHAPEという設定項目があります。デフォルトはCUBEになっています。これをMCにすると以下のような描画になり、ボクセルライクな描画からローポリチックな表現に変わったことが分かるかと思います。MCとは、[マーチングキューブ](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%83%81%E3%83%B3%E3%82%B0%E3%82%AD%E3%83%A5%E3%83%BC%E3%83%96%E6%B3%95)のことです。マーチングキューブとは3次元ボクセルデータをポリゴンデータ化するアルゴリズムの一つです。

<img width="533" alt="スクリーンショット 2019-01-12 22.52.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/55086/8c6575ee-f814-c5f7-fb32-16be8a71fce3.png">

右下のExportのmcを選択することでマーチングキューブでの書き出しが可能になります。
（objを選択してもCUBEでの書き出しになってしまいます）

<img width="154" alt="スクリーンショット 2019-01-12 23.16.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/55086/2674aff8-055f-d14f-2401-07d4c609c70e.png">

しかしここで問題が出てきます。保存しようとすると分かりますが、拡張子が.plyになってしまいUnityが対応していない形式での書き出しになってしまいます。

<img width="400" alt="スクリーンショット 2019-01-12 23.20.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/55086/942f2806-36c4-f593-aa6a-eba1a4283aa8.png">

この問題に対応するため次はply形式のモデルをUnityの対応しているobj形式に変換していきます。

## MeshLabを使ってUnity対応形式のオブジェクトに変換する
ply形式のモデルを変換するツールはさまざまありますが、今回はMeshLabというフリーツールを使うことにします。Mac、Windows両方に対応しています。

* http://www.meshlab.net/
こちらからダウンロード、インストールを行うことができます。

インストールまでできたらMeshLabを開いて先ほど作ったply形式のモデルを読み込みます。（Fileから開くかD&Dで読み込みができます）

![スクリーンショット 2019-01-12 23.37.57.png](https://qiita-image-store.s3.amazonaws.com/0/55086/68c13483-0527-f2b3-5c88-b0dc8070ba59.png)

MeshLabではobj形式への変換とそれに合わせたテクスチャの作成を行います。
まずは、テクスチャの作成を行っていきます。

Filters -> Texture -> Parametrization: Trival Per-Triangleを選択します。
<img width="533" alt="スクリーンショット 2019-01-13 0.36.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/55086/e412fcba-4635-78be-4306-7a66051b8b25.png">

Inter-Triangle borderを0に、MethodをBasicに変更してApplyを押下します。
<img width="366" alt="スクリーンショット 2019-01-13 0.44.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/55086/170cf4e9-d523-846e-4414-352c0e4cc0ef.png">

さらに、Filters -> Texture -> Transfer: Vertex Attributes to Texture(1 or 2 meshes)を選択します。


<img width="533" alt="スクリーンショット 2019-01-13 0.45.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/55086/9c83ed27-e3b3-7184-d563-f29de9d6664c.png">

設定はそのままでApplyを押下してpngを保存します。これでテクスチャの書き出しは終了です。

次にobj形式で書き出しです。

File -> Export Mesh Asを選択、形式をobjに指定して保存できます。（簡単ですね）

<img width="300" alt="スクリーンショット 2019-01-13 0.00.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/55086/275e7b07-f6e0-82d0-8b93-40d8f8d1f884.png">

<img width="300" alt="スクリーンショット 2019-01-13 0.02.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/55086/315969de-bda5-c7a9-1adb-a7fc62b2e88b.png">

（テクスチャ作成 -> obj書き出しの順に行わないとUnityへのインポート時にテクスチャが上手く表示されないことがあるようです） 

次は作成したobjとテクスチャをUnityにインポートしていきます。

## Unityで使う
先ほど作成したobjとpngのテクスチャをUnityにD&Dします。
Png画像はInspecterからDefaultをSprite設定に変更しApplyします。

<img width="362" alt="スクリーンショット 2019-01-13 2.00.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/55086/d22e825a-5142-bcd3-b09f-6595ebc3d31e.png">

objの方にはマテリアルの設定を行っていきます。
InspecterのExtract Materialsでマテリアルの作成を行うことができます。

<img width="365" alt="スクリーンショット 2019-01-13 2.03.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/55086/f0889a0e-2db9-035f-880c-180ed664bb56.png">

マテリアルが作成できたらマテリアルのAlbedoにPngのテクスチャ画像をD&Dすればobjに色がつきます。
<img width="366" alt="スクリーンショット 2019-01-13 2.04.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/55086/efb23f02-2803-049e-99ca-21fa8accbf34.png">

あとは、objをシーンに配置して煮るなり焼くなりゲーム素材として使うことができます！

<img width="645" alt="スクリーンショット 2019-01-12 21.02.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/55086/5eaf73a5-f4b2-882c-ac25-0f675c3f0e54.png">

## まとめ
ProbuilderやBlenderでのモデリング作業のハードルが高く挫折した自分なのですがMagicaVoxelを使うことで意外と自作のモデル制作を行うことができています。ただ、ボクセル調の一択の表現したものしかできないのももったいないと感じていたので今回このようなローポリ表現に取り組んでみました。

ローポリモデル制作の一つの参考例となれば幸いです。

## 参考
* http://www.pointcloud.jp/blog_n22/