Vketのブース造営はエクストリーム競技
限られたリソースの中で、如何に大きく・美しく・派手に魅せるか?
Vketのブース造営に要求されるスキルは余りに多く、険しい。
※この記事は「どもがよ Advent Calendar 2024」9日目の記事です。
みなさんはVirtual Market(以下、Vket)をご存知でしょうか?
VRゲーム「VRChat」上で年2回開催される大規模展示会です。その開催規模は拡大傾向にあり、今冬のVirtual Market 2024 winterでは、のべ1293ものスペースが出展予定です。
「とはいっても、VR空間は無限に広いんだから、スペース数が多くても問題はないだろう?」
残念ながら違います。VR空間といえど我々プレイヤーのデバイスの上で動作するため、デバイスのスペックより大きいものは動かせません。
そのため、Vketで出展するブースには様々な制限が掛かります。
スペースの広さの制限、描写リソースの制限、ファイルサイズの制限。もっと言えば出展者の作業時間にも限りがあります。
それらの中で、自分が創りたいモノをどう仕上げ、どう実現し、どう妥協するかを試行錯誤するわけです。
というわけで、今冬のVirtual Market 2024 Winterで、私がブース造営でどんな点を意識したのか、まとめたいと思います。
ブースに何を置いたのか
まず、実際に出来上がったブースを見てみましょう。
今回ブースのコンセプトとして、「メイン商品である3Dモデル『アイベル』を中央に1体ドーン!と置いて、定期的に衣装を着替えさせる」ということを最初から構想していました。
衣装切替え方式を採用した理由
「メインの3Dモデル1体と、着せ替え用の複数の衣装」の見せ方というと、パっと思いつくのは以下の通りでしょうか。
衣装の数だけモデルを置く
一番見せたい衣装を着せたモデルを1体置いて、あとは衣装単体で置く
モデルを1体置いて、それに衣装を切り替えながら着せる
どれも一長一短あるのですが、今回3番目の方法(以下、衣装切替え方式)を採用したのは、以下のメリットを重視したからです。
表示するモデルが常に1体であり目移りしにくい
複数モデル/衣装を置くよりも省スペース、かつ描写リソースを軽減できる
衣装切替え時にアニメーションを入れることで目立ちやすい
個人的に一番最後のが大本命ですね、「衣装切替え用の映えるド派手なアニメーションを作りたい」というのが強い欲求でした。
だってそーでしょ、遠目に見えるブースでいきなり\メークアップ!/始まったら気にならん?
ブースの背景をどう作ったか
ブースの方向性が決まったら、実際に制作していきます。
ブースは基本的に展示物がメインです(今回で言えばアイベルと委託物)。
背景も世界観を形作るうえで重要ではあるのですが、できるだけローコストで"映える"モノが求められます。ということで、背景の理想は「メッシュ1個」「マテリアル1個」です。
マテリアル1個で非金属/金属/ネオンすべて表現する
3Dモデリングにおいて「マテリアル」とは物体の質感を表すものであり、通常「大理石」と「金属」は別のマテリアルとして設定します。
しかしブースの背景のマテリアルは1つに絞りたい…。
大理石の床は諦めて、総金属製ステージを作るしかないのでしょうか?
これらはマスクを使えば実現できます。
UnityのStandardシェーダーでは、「Metallic」「Smoothness」「Emission」などのマスクテクスチャを設定できます。
それらを利用することは「ここはツルツル」「こっちはザラザラ」「ここは光る」など、1つのマテリアル内で異なるパラメータを設定できます。
(私はコレ知ったときに大発見だと思いましたが、私が知らなかっただけで、実は基本スキルかもしれない…)
衣装切替えのギミックをどう作ったか
今回の目玉である衣装切替え。
私が考えた「衣装切替え用の映えるド派手なアニメーション」は以下のようなものでした。
これを実現するためには、大きく3つの課題がありました。
大量の三角パネルをくっつけて球状、正確には多面体にする
その多面体を動かすアニメーションを用意する
切替えアニメーションを自動でも手動でも動くようにする
「1~2」「3」と、2節に分けて見ていきましょう。
240枚の三角パネルを多面体にして動かす
今回、以下の観点から菱形三十面体を採用しました。
正二十面体だとあまり球に見えないため、21面以上のもの
すべての面が合同(=単一の三角パネルを作ればよい)
六角形を基調としている(ように見える)造形
「なぜ六角形?」というと、弊サークル(卯福堂)のロゴが六角形ベースだからですね。
菱形三十面体の菱形を8個の三角形に分割したもの、つまり30(面)×8=240枚のパネルで構成されたオブジェクトを作成します。もちろん各パネルにはボーンを設定しなければなりません。
ではネットで菱形三十面体の3Dモデル素材を見つけられるか?
答えはNo。なんということでしょう、作り方もわからないのに菱形三十面体を自作しなければなりません!
幸い、菱形三十面体の頂点座標を掲載しているサイトを見つけられました。
これを元にBlenderで菱形三十面体を自作。
それに沿うように菱形に配置した三角パネル群を配置していきました。
240本ものボーンの配置については、ChatGPTにPythonスクリプトを書かせました。ChatGPTマジ便利。
さて、苦労して作った菱形三十面体。これをアニメーションさせなければなりません。
240本のボーンのアニメーションを手作業で作っていては発狂してしまうため、これもChatGPTにC#のスクリプトを書かせ、それをベースに半自動で作成しました。
ブースに誰もいなくてもアニメーションさせるには
簡単です。自動でループするようアニメーション設定すればいいだけです。
しかし、私は今回3つの要件を課していました。
ブースに誰もいなくても(自動的に)衣装切替えする
誰かがブース内の切替えボタンを押したら、ただちに衣装切替えする
ワールドにいる全員が同じ衣装が見えるよう、衣装の種類を同期する
これが「1のみ」または「2と3のみ」ならば簡単です。
前者は上で述べたとおりですし、後者はUdonでスクリプトを組めば実現できます。
「1~3同時に」となった瞬間、一筋縄ではいかなくなります。
なぜか?
Vketにおいては、「ブースの近くに人がいない状態でUdonスクリプトを動作させる」手段の多くが、制限されているからです。
そうしなければ、ワールド内の全ブースが一斉に動作しかねません。それはリソースの無駄ですし、自分から見える範囲のブースのみ動けばよいわけです。
ですが、制限されていない手段もあります。
その一つが「Animation Event」です。
これはアニメーション再生中にイベントを発火させられる仕組みです。つまり、3Dモデル(アイベル)がワチャワチャするアニメーションの最後に「衣装切替えする」Animation Eventを発火させ、Udonスクリプトを動作させるのです。
これは、ワールドにいる全プレイヤーが影響(=計算リソースの消費)を受けますが、それは約20秒ごとに1回であり、比較的影響は軽微と言えます。
このようにして、自動でも手動でも衣装切替えできる仕組みを実現しました。
メインの3Dモデルをどう軽量化したか
衣装切替えにいくら心血を注いでも、メインの3Dモデル(アイベル)をちゃんと表示できなければ意味がありません。
ですが、Vketのブースにかかる種々の制限により、モデルの軽量化がどうしても必要になってしまいます。
VRCアバター用のモデルは得てして重量化されている
まず前提として、なぜモデルの軽量化が必要なのか?
昨今の国内のVRChatでは、アバター改変が日常的に行われています。色変えといった軽いものから、衣装着せ替えや、小道具の追加などなど。
その意味で、アバター用モデルの制作者としてはモデルの「改変しやすさ」は無視できない要素ではあります。
しかし、改変しやすいアバターは重いです。
メッシュは結合するより分離して、個別にON/OFFできるようにする。
マテリアルも分離して、個別に編集しやすくする。
衣装の着せ替えができるように、衣装で隠れる素体(=裸や下着)部分も作り込む。
メッシュやマテリアルが増えるほど、アバターのパフォーマンスは低下していきます。
私はアイベルを当初、「低負荷でハイクオリティ」のコンセプトで制作しました。
素体と衣装と小道具(バッグ)を1メッシュに詰め込み、マテリアルも極力結合し、テクスチャも4K1枚。
要は「改変しやすさ」とは真逆の方向に突っ走ったわけです。
当初はそれでもいいかと楽観視してましたが、いざ「追加衣装を作ろう!」となったとき、詰みました。
ver.2.0.0では逆に改変しやすくなるようにバージョンアップしたのですが、結果としてVket展示のための軽量化が必要になってしまいました。
軽量化と逆行して増えるファイルサイズ
とはいえ軽量化の策がないわけではありません。
「アバターを改変しつつ軽量化もしたい!」という市場の欲求に応えてか、改変や軽量化のための便利なライブラリがいくつもリリースされています。
Modular Avatar(https://modular-avatar.nadena.dev/ja)
Avatar Optimizer(https://vpm.anatawa12.com/avatar-optimizer/ja/)
TexTransTool(https://ttt.rs64.net/)
これらを使って、メッシュやマテリアルの結合を実施することには成功しました。これでSetPass Callsチェックの心配をせずとも済む…。
しかしここで牙を向いたのがブースチェック。
どういうことかというと。
軽量化したアバターを「Modular Avatar(というかNDM Framework)のManual Bake」機能でassetファイルに出力するのですが、このファイルのサイズがかなり大きい。
アイベル(歩荷衣装)のassetファイルが23.2MBになります。
これが3体分でざっくり70MB。
アイベルや多面体のアニメーションで17MB。
ここにブースのテクスチャやら委託物やらを含めると、余裕で容量制限100MBを超過します。
これをどのように解消すればよいか?
assetファイルが大きくなる原因は、ファイルがバイナリ形式でなくテキスト形式なこと。
なのでなんとかしてassetファイルをバイナリファイルに変換することが出来ないか試行錯誤しましたが、こちらについては上手くいかず断念。
次に調べたのが「assetファイルの中に不要なデータがないか」。
アバター軽量化の過程で不要なデータはすべて削ぎ落とされたように思われましたが、実際に調べてみたらありました。
ブレンドシェイプです。
Avatar Optimizerには、使わないブレンドシェイプを固定&削除する「AAO Freeze Blendshape」という機能があります。
これを使っていたためassetファイルの不要なブレンドシェイプも削除されているものと思いましたが、含まれていました。
なのでBlenderの段階で不要なブレンドシェイプを削除して、ギリギリ解決出来ました。
これは「『AAO Freeze Blendshape』が効いてない!」と主張したいわけではないです。というか私もよくわかってないです…。
もしかしたら、NDMFのManual Bakeについては単純なアバターアップロードと異なる部分があるのかもしれません。特殊な用途だし。
とはいえ、Vketの入稿におけるManual Bakeの需要は高いです。
今回挫折したバイナリ化も含め、知見を貯めておきたいところです。
まとめ
この記事を書いている途中で、Vket 2024 Winterが開会されました。
私も早速自ブースを確認しに行ったのですが、今回のキモである衣装切替えギミックが想定外の状態に。
これについてはすでに修正済みです。
(運営さんに報告して初日のうちにご対応いただきました)
多くの人の成果物が一つのワールドに詰め込まれるため、凝ったことをするとバグるリスクもある(?)ということ…ですかね…。
というトラブルがあったり、アニメーションなどで妥協が必要な箇所もありましたが、今回のブースは個人的にいい感じにできました。
キモである衣装切替えについて希望通りの形で実現できたし、
ブースの背景も概ね自分の理想通りに実現できたし、
その上で、委託展示を2人分も請けることができました。
というわけで、今回のブースを実現するために得たノウハウや気付きについて、ざっと取りまとめてみました。
分野が多岐にわたるためとっ散らかっていたり、専門的な話があったり、かと思ったら抽象的な説明しかなかったり、わかりにくい点も多かったと思います。
こんな記事ではありますが、「Vketに参加しよう!」「Vketのブースってどうやって作るんだろう?」という方の一助になれば幸いです。
※どもがよ Advent Calendar 2024、明日はのぞみさんの「今年1年振り返り」です。旅行の話とかになるのかな? 今年のアドカレ旅ネタ多すぎて、出不精の民である私は羨ましすぎて溶けてる。お楽しみに!