オンライン展示会場をPlayCanvasで作る際の3Dモデル作成について

![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/630e6d1b-3182-c345-d6c4-539c6029faaf.png)
この記事では3Dデザイナー視点で、PlayCanvasを使用しオンライン展示会場を作成した際の、3Dオブジェクトの作成内容と作成方法を解説します。
**使用ソフト**
blender2.8.0/photoshopを使用

**作成物** 
1.会場モデル
2.ブースモデル
3.ブース内オブジェクト
4.publish&builds

#会場モデル
メイン会場となる大型の室内ホールと言った感じのもの。会場内には複数の展示ブースやアバターが動き回れるだけの広さが必要となります。そのため、リアルタイムライティングではシーン事態の負荷が高くなる。通常のテクスチャーマッピングでは画像データのサイズが大きくなり過ぎる等の問題が出てきます。これらを回避するために、Blenderのベイク機能とUVレイヤーを使い、なるべくデータ容量を抑えた構成にします。
###会場モデルのオブジェクト分け
1つのオブジェクトとして展開するとテクスチャのサイズがかなり大きくなってしまうので、いくつかのパーツに分けました。また、床やコンクリートの打ちっぱなしの様なパターンの部分に関してはPlayCanvasのマテリアル設定で可能なタイリング機能とLightMap機能を併用して容量の削減を行っています。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/5674d327-b8b6-5471-12e4-118d7c0d5b94.png)
###UV展開
メイン会場用のUVはLightMap用のUVのみ展開し、タイリング用の床や壁はマテリアル上の設定で対応しています。
タイリング様に用意したテクスチャは以下のモノです。
Colormap
Normalmap
AO
Roughness
LightMap用のテクスチャは会場ベース、階段の2つのみです。
![07+.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/faf7ae8a-ef65-d6fd-33d4-3c85487dfc61.png)
階段と2階部分、天井のダクトや照明オブジェクトを含む会場全体をテクスチャーとして用意します。
###UVレイヤー
BlenderのUVマップを複製し、タイリング用のUVとLightMap用のUVを作成します。
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/5ea111d6-d153-5b50-4006-56e2b2071abe.png)
"UVマップ"はタイリング用のUV、"lightmap"は放射(ライト)用のUVマップです。
これをPlayCanvasのマテリアル、UVChannelで使用します。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/62f04cbb-1c33-38ea-53a7-30f54e255a86.png)
Blender上のUVマップはPlaycanvas上のUVChannelではUV0。lightmapはUV1となっています。
###Blender マテリアル
プリンシプルBSDFで設定していきます。後でベイク処理をしていくので、無料のアドオン[BlenderKit]でコンクリートの壁や床のタイルなどの設定をしていきます。
https://www.blenderkit.com/oauth-landing/
###ベイク処理
BlenderのCycleRenderでベイク項目内のベイクモード[統合]。影響を照明の直接照明、間接照明にチェック。Contributionの放射にチェックを入れ、ライトのカラーや光源影響のみをレンダリングします。この際、Shadingシーンから各マテリアルにベイク用の画像テクスチャを1枚新規に作成しておきます。(ノードは繋がないで置いておきます)
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/ec2b2e0f-5f04-70a3-41ae-e039968e5046.png)
サンプリング値を2000まで上げてますが、レンダリングにかなり時間が掛かります。サポートでレンダーデノイズにOpenImageDenoiseを設定しています。これでかなりチラつきを抑えられます。
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/05baf292-967c-bc55-fa73-29e5247b480a.png)
出力設定の余白はデフォルトで16pxになっていますので、UV上でのオブジェクト間の余白が狭い場合レンダリング結果が重なってしまいますので、任意で数値を下げます。
###室内用cubemap
PlayCanvasのマテリアル設定の中で、Environment(環境光)を設定し、各ブースに建物内部の反射を投影させます。Blenderのカメラ設定で前後左右上下のレンダリング画像をPhotoshopで加工します。
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/32608f2a-f0c3-0756-ecfe-343f12eff8e1.png)
Blenderでシーンの中心から前後左右上下をレンダリングし、PlayCanvasにインポートします。
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/2ee9e727-0b08-ab26-986a-a1d76fb3b28b.png)
Assets欄からNew Asset→CubeMapを新規で作成します。
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/b462e46f-1ac7-197c-afe3-d0dac01739d3.png)
新規で作成したCubeMapに各画像をdrag＆dropで張り付け。最後にPREFILTER CUBEMAPのボタンをクリック。
これで、CubeMapとして、使用可能となります。
###Blenderエクスポート&PlayCanvasインポート
FBX化したいオブジェクト毎に選択し、下記の設定でエクスポートします。
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/4119b7b9-c1b6-7b42-71b2-d5278a799ca7.png)
赤枠部分は初期設定からの変更箇所です。パスモードが初期設定のままだと、オブジェクトとマテリアルがセットにならないので注意してください。
PlayCanvasへのインポートはAssete欄にdrag＆dropするか、UpLoadボタンから行います。
#ブースモデル
同じブース形状だが、展示内容の異なるブースを複数作成する必要があったのでPlayCanvasのTemplate機能を使用し、1つのブースモデルを流用する形で作成しました。
###ブース3Dモデル
通常のモデリングで形状を作成し、UV展開、室内にライトがある場合はライティングし、ベイク[総合]でテクスチャを生成します。
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/60480936-de1a-1139-d755-93d31ef99de8.png)
ブースモデルとテクスチャをPlayCanvasにインポートし、別々のシーンで設定をします。
![booth_all.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/cff57607-5033-a2cc-ca6f-33738c355bff.png)
###PlayCanvas Template機能
別々のシーンで作成したブースモデルをメインシーンで再利用します。3Dモデルはそのままにマテリアルや展示物を各商材ブース毎に変更します。
![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/bc16df37-a0d0-2b8d-cd19-bf206b968064.png)
#ブース内オブジェクト
パンフレットの表示にはシンプルなPlaneオブジェクトを使用しています。3Dロゴに関しても、Blenderによるベーシックなモデリングで作成しています。また、ムービーデータ(mp4)をPlaneポリゴンに張り付け再生させています。
![booth6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/590bece5-b57d-3b60-b283-c2e6135fcffe.png)
###パンフレット(赤枠C/D)
解像度と縦横の比率に注意し、PlayCanvasにデフォルトで入っているPlaneにマテリアルを設定します。マテリアルには　diffuseとEmissiveにパンフレット画像を入れます。少々自己発光で明るくしておくと可読性が上がります。
![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/2c98a09c-a64c-2d9b-9ef2-e25a546b6c5b.png)
###3Dロゴ(赤枠B)
ロゴマークの画像データをPhotoshopで.svgに変換し、Blenderで.svgを3D化します。各種マテリアルを設定します。回転アニメーションはPlayCnavasのCodeEdeitorから簡単なスクリプトで制御しています。
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/65aa0263-f827-9b7a-8206-10b6c06cd6d2.png)
###ムービーデータ(赤枠A)
モニター用の3Dモデルに映像を表示するように独立したplaneを用意し、映像用のマテリアルを設定します。スクリプトでmp4のムービーデータを再生しています。
![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/1871c841-94c2-a920-b402-65fc15742b56.png)

#publish&builds
PlayCanvasではプロジェクト公開用のURLを簡単に生成することができます。手順は以下の通りです。
シーンビュー上部にある"Manage Scenes"をクリック
![24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/4626939f-3468-c4c1-f471-70f2fda71e34.png)
シーンを選択するポップアップが出ます。赤枠の"PUBLISH"をクリック。
![25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/eb1d9e91-ce17-287f-f468-89e3ddc8dd10.png)
赤枠の"PUBLISH TO PLAYCANVAS"をクリック。download .zipはプロジェクトそのものをZIPでローカルに保存できます。
![26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/6288a146-eb3d-3ccc-e77b-09b87f3d393e.png)
"PUBLISH TO PLAYCANVAS"をクリック後"PUBLISH NEW BUILD"という画面に切り替わります。タイトルやディスクリプション、バージョン情報等を記入できます。一番下部の"PUBLISH NOW"をクリック。
![27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/be8528eb-17fe-2162-2af0-3d70bac13084.png)
公開用のURLが生成されます。
![28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/2be48851-ddd3-142b-1251-e91a31c76fa0.png)
このURLを共有することで、誰でもこのコンテンツに入ることができます。
#まとめ
PlayCanvasの利点は…

1. ゲームエンジンがブラウザ上で作動し、オーナーがアサインしたメンバーと、同じプロジェクトに入り、共同作業が出来る点。
1. かなりのポリゴン数やテクスチャサイズでも、インポートした時点でかなり圧縮され軽くなる。(最新の.gltに自動で変換してくれる！)
1. マテリアルが結構本格的。突き詰めればフォトリアルなシーンも作れます。
1. デバイスに依存せず、ブラウザが起動できればどんなデバイスでもURLにアクセスすれば動作します。

今回は3Dデザイナー目線から、PlayCanvasで作るオンライン展示会場をご説明しました。unityでのコンテンツ開発とは違い、エンジニア、デザイナーが共通のプロジェクト内で一緒に作業できる環境は、かなり効率良く進みました。トライ＆エラーがリアルタイムに確認できるので、意思の齟齬は少なく、問題点や進行状況が分かり易かったです。また、バージョン管理機能も搭載していますので、ブランチを切って別シーンで編集し、マージするということもPlayCanvasでは可能です。何よりも、お手軽にモックやサンプルプロジェクトが作れて、即確認、即共有できる点は、他のゲームエンジンには無い特徴だと思います。
皆さんも、是非PlayCanvasで色々なコンテンツやゲームを作成してみてください。

【PlayCanvas 公式サイト】
https://playcanvas.jp
【Twitter】
https://twitter.com/playcanvasJP
【日本 PlayCanvas ユーザ会 - Slack】
日本の PlayCanvas 開発者が集まったコミュニティがございます。
PlayCanvas での開発に興味がある方はぜひこちらご参加ください。
参加には Slackが必要となります。
https://playcanvas.jp/joincommunity