VirtualFashionMall#3のギミックとツール周りの話

VirtualFashionMallも3回目ですね。今回もギミック制作として参加しました。今回は規模拡大に合わせてギミックだけでなくブースの配置用ツールも作りました。

これは邪教徒カルテットさんの試着自撮りです。

この記事では自分がVFM#3でやったことをくどくどと書いていきます。正直誰向けなのかと言われるとよくわからない感じになってますが、Udonギミックに興味ある方が参考にしたり、将来の自分自身が振り返ったりするときのために残しておきます。

途中で読むのが面倒になったら「最後に」まで飛んでください。

VirtualFashionMallについて知らない方はこちらの記事を先に読んでください。(VRoidFashionMallはVirtualFashionMallの前の名前です)

sandman73773941.hatenablog.com

カラーバリエーションの仕様変更

これまでのUdonWearではカラバリの切り替えは単一のマテリアルの切り替えでやっていました。これだとマテリアルが複数あったり、モデルのポリゴン形状が異なる場合に対応できないため、SkinnedMeshRendererそのものを切り替えるように変更しました。UdonHatも同様に修正しました。

もはや「カラー」バリエーションではないですね。当初は半袖長袖を切り替えるくらいを想定していたんですが、佐久本さんが男性向け服女性向け服で切り替えていてそういう使い方もあるなあと思いました。

UIの日本語対応

ミレアさん、野菜ゆうきさんからフィードバックをもらってUIがこれまで英語だけだったのを日本語バージョンも用意しました。プレイヤーが言語を選択するのは面倒くさそうなので、タイムゾーンを判別して自動で英語と日本語が切り替わるようにしました。

難しい単語を使っているわけでもないし英語だけでええやろと最初は思っていたんですが、日本語にしてみるとかなり分かりやすくなったので驚きました。UdonHatも同様に修正しました。

この説明書きはあざらしうむさんにお願いして描いてもらいました。

同期変数の修正

VRChatの仕様変更で同期変数の定義が一定数以上あると同期がされなくなるという現象が発生しました。同期変数の個数ではなく定義数が問題であるというところがミソで、最初は同期変数の数を減らすのをがんばっていたんですが、最終的に同期変数を配列にして定義数を減らすことで対応できました。

実はUdonWearはPythonコードからUdonSharpコードを生成して大量にある同期変数の同期のやりかたを一括で変えられるようにしています。コード生成は無駄に複雑さを増していてよくなかったかもと思っていましたが、結果的にはやっていて良かったです。

ちなみに同期変数を減らす過程でたまたま試着時に発生するタイムラグがなくても動くことに気づいて消しました。また服を着た後にアバターを切り替えても服が破綻しなくなりました。

設定された大きさや位置のキャッシュ化

もちおしゃ系試着ギミックの一番の弱点は試着するたびにアバターにうまく着せるには、着た後服の位置や大きさなどをユーザが設定しないといけないところです。この手間を省略できれば大きなブレイクスルーになります。

ところで話が少し逸れますが、同時期に開催されているVKet2022Summerのパラリアル大阪のBEAMSブースではキャンディちゃんさんによる試着ギミックが導入されています。ちなみにキャンディちゃんさんはVFMのきっかけとなったワールドのひとつであるColorful Magicの試着ギミックの開発者です。

vrchat.com

このキャンディちゃん式試着ギミックは大胆にも服の位置や大きさの設定が省かれていて、着た後の調整はできません。その代わり「魔法の鏡」によって服の描画順番を最後にすることでアバターが服を着ていたり胸が服から突き抜けたりしていても、鏡ごしには自然に服を着ているように見える仕組みが用意されています。

これはすごいアイデアだと思いました。特にVKetのお客さんは試着を目的にワールドに来るわけではないので、調整はむしろ野暮ったくて邪魔になります。完全に合わせようとするのはやめて、ヒトガタになるべく合うようにおおまかな自動のスケール調整と「魔法の鏡」で仕上げているのはプロの潔さを感じます。

一方で、VFMではお客さんは試着を目的で来るし、どんなアバターでも着られるようにしたい(僕自身ヒトガタから逸脱したペンギンアバターを使っている)ので、どうしても着た後の調整をやる必要があります。

調整を完全になくすことはできなくても、調整の回数を減らすことができないかと考えて、キャッシュを導入することにしました。

キャッシュは新しく服を試着したときに、最後に別の服で調整した大きさや位置を初期値として設定した状態にする機能です。この機能があれば、同じような形の服しかないような理想的な状況では最初に一度だけ調整を行えば他の服では一切調整がいらなくなります。

VRoidStudioで作成された服はだいたい同じ形をしているので理想的な状況に近いです。ただし、今回のVFMではVRoidStudioではないツールで作成された服も出展されています。そこで服ごとにキャッシュの有効無効を切り替えられるようにしてVRoidStudio製ではない服についてはキャッシュを無効にしています。

将来的にはVRoidStudio以外で一般的な服の作成ツールが出てくればキャッシュを分けるようなことも有効かもしれません。また、体格の違うアバターを頻繁に切り替えるようなユーザはあまりキャッシュの恩恵が受けられないので、アバターごとにキャッシュを分けるというのも有効かもしれません。どれくらいキャッシュが役立つか未知数だったのでとりあえず今回はシンプルなものを導入しました。うまく動いていそうなので良かったです。

同じ衣装の試着ギミックでも置かれるワールドの性格によって仕様が変わるのはおもしろいと思いました。

肩の高さ調整の無効化とスケールの調整

これまでのUdonWearでは胸部の高さ調整に伴って肩の高さも変えていました。こうするよりも肩の高さは固定にしたほうが着やすいことが分かったので無効化しました。その代わり固定だった肩のスケールを、胸部と腕のスケールに応じて変えるように変更しました。

着やすくはなったんですが、以前ひつじうたさんがやっていたような、シャツをスカートとして着こなすという荒業ができなくなってしまいました。本当は機能をON/OFFできるといいのかもしれません。

アバター身長の算出方法の修正

服の試着時に服のスケールをアバター身長に合わせて変更しています。これによって大きいアバターでも小さいアバターでも同じように服を着ることができます。身長の算出にはHips-Spine-Chestのボーンの長さを使っていました。しかしあるバージョン以降のVRMConverterForVRChatを使ってアップロードされたアバターはChestの位置がUpperChestの位置に移動してしまって、Hips-Spine-Chestの長さだとアバターの大きさが実際よりも大きく見積もられて服のスケールが大きくなってしまい、結果としてアバターが服に埋もれてしまうという現象が発生しました。(この原因究明には佐久本さんからの情報提供がめちゃくちゃ役に立ちました。ありがとうございました)

なんでVRMConverterはそんないらんことするんやと最初思いましたが、それもVRChat側の問題に対するWorkaroundのようなので仕方がなさそうです。既に大量にアップロードされているVRMConverterを使ったアバターの使用をVFM会場でやめてもらうのも現実的ではありません。VRMConverter関係なくChestがUpperChestの位置にあるようなアバターだとうまく動かないというのも変わりません。UdonWear側で対処するべき問題です。

いろいろ試行錯誤して最終的にはHips-Spine-ChestだけではなくNeckを加えてHips−Spine-Chest-Neckの長さを使うように修正しました。こうすることでChestの位置がSpineとNeckの間で動いてもトータルの長さはあまり変わらないためVRMConverterの問題を解決できました。また、体型が一般的なヒトガタから逸脱したアバターの身長もより正確に求められるようになり、より試着を安定させることができるようになりました。

デスクトッププレイヤー用ポーズシステム

5,6,7,8,9,0キーを押すとデスクトッププレイヤーもポーズが取れるシステムを作成しました。実装としてはStationをポーズごとに用意してキーが押されるとStationをプレイヤー位置に移動して座らせてアニメーションを上書きするという仕組みになっています。(Stationは位置同期しているので複数プレイヤーが同じポーズを取れないという制約があります)

前からTwitterに上げられる自撮りを見ているとVRプレイヤーはユニークなポーズが取れるのにデスクトッププレイヤーは直立したポーズしかとれなくてもったいないなと思っていました。この機能でデスクトッププレイヤーももっと試着や自撮りを楽しめるようになればいいなと思います。

ただ、現行のUdonHatとうまく動かないのが心残りです。後で修正するかもしれません。

ブース配置用ツール

今回のVFMでは出展者が増えるのに合わせて、ブース形式で展示したいという要望があったのと、毎回服やポスターをワールドに配置するのが大変なのでここらへんの作業を自動化できないかというので作りました。決まった位置にポスター画像とVRMファイルが置かれているフォルダを指定してボタンを押すとブースがシーンに配置されるようなエディタ拡張ツールにしました。

最後に

VFM#3はまだ9/3までやってます。総勢20人の出展者の皆さんが作った渾身の服とアイテム、きんととさんの企画力、渡辺秋穂さんのプロデュースノウハウ、いかめしさんのツボを押さえた会場モデリング、朝霧ルさんの適切なサポートがなければVFM#3は成立しなかったでしょう。

ひとりでも楽しめますが、ぜひ大切なフレンドと足を運んでください。あなたが試着することでVFMは完成します。

vrchat.com