バーチャルキャスト向け背景（.glb）の作り方

## 概要
バーチャルキャストの1.4.0より背景モデル(.glb)が読み込めるようになりました。
<a href="https://www.infiniteloop.co.jp/blog/2018/10/virtualcast-140-release/">バーチャルキャスト 1.4.0a リリース</a>
なので… **何ならバーチャルキャストに持って行けて、何が持ってゆけないか？　どうやって、どこで設定すればよいか？** を整理してゆこうと思います。

## ライティング / シェーダー周り

結論から言うと「**unlitで頑張る**」です。※unlitとは「**陰影処理を行わない処理**」の事
対応シェーダーは以下の通り。
**Standard,** Unlit/**Color**, Unlit/**Texture**, Unlit/**Transparent**,
Unlit/**Transparent Coutout**, UniGLTF/**UniUnlit**,

colorは単色, Textureはテクスチャをそのまま出力,
Transparentはアルファ値が使える(透明度/透過画像),
Transparent Coutoutは部分的に表示を消すパラメータが使える,
参考：<a href="http://tsumikiseisaku.com/blog/shader-tutorial-transparent/">Unity シェーダーチュートリアル / アルファとアルファテスト</a>


**「Standard使えるやん！」**と思い.glbにして持って行った所…確かにスタンダートシェーダーは有効なのですが、バーチャルキャスト内のライトはデフォルトでは「**RotationX,Y,Z が 0 の DirectionalLightが１つ**」という仕様で、「**配信のホストがライト機能で変更しないと**」ディレクショナルライトの設定は変わりません。
（使えない事はないですが”必ず意図した設定”にはできない）
中にライトを持ってゆけず、unityでベイクした結果もunityに依存した情報なので.glbには持ってゆけません。
つまり、現状は「**(基本的に)unlitで頑張る！**」という事になります。

アプローチとしては…
**・(Unityへインポートする前に)blenderなどでテクスチャに直接影を書き込む**
**・テクスチャ作成時に、絵を描く感覚で影を落としておく**
等があると思います。

それでもstandardshaderを使うシーンは、光沢感や金属管を出したい場合…**unlitにするぐらいならstandardの方がよい**というケースだと思います。

裏を返せばライティングやシェーダーを割り切って、純粋なデザインやアイディアだけに注力してつくれるという事なので、面白アイディアが色々出てきやすくなるんじゃないかな？とも思います。
某VRメタバースではリフレクションプローブだの、GPUパーティクルだの、VRを意識した謹製シェーダーだの、AOマップだの、メッシュベイカー・LODで最適化だの、トリガーだのパーティクルだの…無限にこだわれるので、これはこれで沼でもある。

**Standardshader（Unityでのプレビュー）**
![glTF18y10M18d19h12m52s.png](https://qiita-image-store.s3.amazonaws.com/0/149449/8726fea2-8018-968b-f2ce-c39b5aac09ab.png)
シェーダーは「Standard」
ライトは「RotationX,Y,Z が 0 の DirectionalLightが１つのみ」という設定です。

**Standardshader（バーチャルキャストでのプレビュー）**
![VCtestModel.png](https://qiita-image-store.s3.amazonaws.com/0/149449/3fc523a6-523e-4f51-a8ab-da3ad9ad08fe.png)
上記のモデルをバーチャルキャストに持って行ったときのプレビュー
色合いがほぼ同じなので、シェーダーは有効で、ライトの設定が一致してるのだと思います。
厳密にいうと、unityのプレビューとは若干異なりますが、ほぼ上記の設定ではないかと思います。

## アニメーションの仕様

結論から言うと「**Animationはtransformなら使える！**」です。

そもそも .glb のエクスポート対象にならないコンポーネントは＝アニメーションのキーにしても実質的な意味はありません。対象となるコンポーネントは以下の通り。

・MeshRenderer + MeshFilter (一番親以外の子供につけてください)
・SkinnedMeshRenderer (一番親以外の子供につけてください)
・Animation (一番親のオブジェクトに付けてください。回転はQuaternionのキーフレームを打ってください。移動・回転・拡縮に対応しています。BlendShapeは未対応)
・＋Gamneobjectが必ず持つ **transform (position/rotation/scale)**

参考：<a href="https://github.com/dwango/UniVRM/wiki/glb%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9">glbファイルの作り方</a> の「Glbのエクスポート対象になるコンポーネント」を参考。
参考：<a href="https://github.com/dwango/UniVRM/wiki/%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88%E5%AF%BE%E5%BF%9C%E7%8A%B6%E6%B3%81">アニメーションのエクスポート対応状況</a> の「注意事項」を参考。

注意点としてはtransformのRotationはオイラー角で指定するのではなく、クォータニオンで指定するという点。
この仕様ならゴリゴリの演出を考える必要はなく、数秒のループアニメーションが主になりそうですね。

## アニメーションはblenderとUnityどっちで作る？
アニメーションファイル（実際にキーを打つ）を作るのは、Unityでanimationを作成すればOKです。
（blenderで設定する場合…blenderのアニメーションはエクスポートした際にUnityのanimationに置き換わるので、最終的には同じになります）
skyboxの雲の回転などは、空のゲームオブジェクトを回転のキーにしておいてオブジェクトを差し替えられるようにすると楽かもしれないですね。

## その他Tips

**Skyboxの設定**
Skyboxの設定方法がなく.glbには入れる事ができないので、屋外のステージはSkyboxは自作する必要があります。
地面側はおまんじゅうのようにうまく閉じると良さそう？
→<a href="https://3d.nicovideo.jp/works/td44898">Vカツ ハロウィンマップ</a>

**自作シェーダーは無理(18/10/19)**
Skyboxは自作する必要あるので unlit/texture を作成し Cull Front を書き加えて Sphere に適用してもっていったところ.glbに置き換えた段階で通常の unlit/texture に置き換わっていました。
あくまで使えるのは unlit/texture で、unlit/texture のカスタムは使えないという事です。

**blenderのデフォルトUVを活用する**
skyboxを自作する場合、全天球の場合UV展開が難しくなります。
なので、UV球のプリミティブ作成時に「UVを生成」にチェックしておくとかなりやりやすくなります。
![skybox.png](https://qiita-image-store.s3.amazonaws.com/0/149449/30ed91c3-f440-911a-9783-f06b39be5754.png)

**MaterialのTilingは無効になる**
unlitのパターンテクスチャで床を作るという方針は難しい…
高解像度のパターン床が必要な場合、メッシュとUVで作った方がいいかもしれません。

**Skydomeの推奨サイズは90m以下**
モニターカメラのカリング距離が100mに設定されてる(18/10/21時点)ので、100mを越えるスカイドームは表示がおかしくなる。
移動などを考慮しても90m以下におさめるのがよいと思います。
※blenderは単位をｍに変更できます。blender１ｍ＝unity１ｍ

**全体の指針として**
おそらく「**unlitシェーダーだけでキングダムハーツを作る**」という意識でアーティスティックにデザインをまとめると良さそうだなと思いました。
また、色合いがビビットカラーな見た目でも、面白い仕掛けがあればライティングとかカラーパレットは忘れても「配信としての面白さ」には直接関わらなさそうだなと思いました。
むしろ、**配信者さんが沈まないような落ち着きのある空間**を作るのが最難関だと思います。

某VRなんとかだと何でもアリなので、これくらい制限ある中でまとめる方が手に収まりやすいですね…

## 参考になるモデル

<a href="https://3d.nicovideo.jp/works/td44485">スター・オープンスタジオ</a>
<a href="https://3d.nicovideo.jp/works/td44483">イブニング・オープンスタジオ</a>
<a href="https://3d.nicovideo.jp/works/td44324">スカイ・オープンスタジオ</a>
星の表現など、参考になると思います。

<a href="https://3d.nicovideo.jp/works/td44815">HOT LIMITごっこ</a>
波のシェーダーが書けないので、半透明のメッシュを回転させて波を表現

<a href="https://3d.nicovideo.jp/works/td44383">【Vキャス背景】荷馬車（アニメーション）</a>
アニメーションの継ぎ目が分からないアニメーションで移動を表現しています。
電車なども同じ方法で表現できそうです。