Skip to content

Commit

Permalink
Merge pull request #237 from KisaragiEffective/KisaragiEffective-patch-1
Browse files Browse the repository at this point in the history
  • Loading branch information
KisaragiEffective authored Dec 4, 2024
2 parents 60f1a0b + a4e8673 commit 4d72906
Showing 1 changed file with 69 additions and 0 deletions.
69 changes: 69 additions & 0 deletions SideStory~/9751ad99-74b5-4297-a27f-367aa69a7f68.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# 無題_9751ad99-74b5-4297-a27f-367aa69a7f68
この記事は[Resoniteアドカレ1枚目](https://adventar.org/calendars/10543)5日目の記事です。

## なぜRIHを作ったのか
なぜ私がResoniteImportHelper、略してRIHを作ったのかは今まであまり説明してこなかったことだと思うので、これを機に説明します。

「前」からの慣例として、Resoniteに初めて来た人や新しくアバターをセットアップする人は専用ワールドでセットアップしたものでした。
しかし、私はそれを是としませんでした。なぜなら、必要な行程ではあるもののセットアップの手間がVRChatのそれとはかけ離れているからです。
VRChatでは、Unityというゲームエンジンを開き、ZIPもどき[^1]を解凍すると一発で使えるアバターが置かれていることがほとんどです。そして、それを編集する際にはUnityで編集してからサーバーにアップロードします。
一方のResoniteではどうでしょうか。親切なショップであれば同等の役割を果たすresonitepackageが同梱されていることがありますが、ほとんどはそうではありません。そこで、通常はFBXやVRMなどの汎用モデル形式をインポートすることになります。

しかし、多くの場合でテクスチャの参照が壊れているため、メインテクスチャ、ノーマルマップ、マットキャップといったあらゆるテクスチャをもう一度割り当てる必要があります。これが第一の関門です。いくら必須[^2]の操作とはいえ、早い段階でこれを要求するのは厳しいものがあると主張します。
それに加え、慣れている既存ユーザーに委託するのにも解決が難しい問題があります。
まず、引き受けてくれる人を探さなければならないことです。私のようにコミュニケーションが上手ではないユーザーや、一人で過ごしたいがwikiの翻訳が追いついていないためにキャッチアップすることが難しいユーザーは厳しい決断を迫られていると考えています。
また、ライセンス上の問題も存在します。以前、「アバター界隈」で広く用いられているVN3ライセンスの改訂案を募集していたため、他人によるセットアップを他人への改変委託から分離してはどうか、と意見を書き込みましたが、モデラーを対象にした過去のアンケートによる結果及びresonite自体がモデラーに知られていないことにより却下されました。あまり意識されない観点ではありますが、これが第二の壁です。

それを乗り越えると今度はAOが強すぎるやら影が出すぎるやらでlilToonとかPoiyomi Toon[^10] っぽくならないことに悩まされます。まあAOは手元できることもできるんですが、他人がそうとは限らないので他人の写真写りは悪くなったりします。かなしいやつ。
今度は表情やらギミックやらの再現が必要になるでしょう。幸い、VRChatでエンコードできるのは有限[^3]のメモリ[^4]なので、チューリング完全[^5]ではありません。しかし、完全に同期させるとなるとやはりインスペクタを触ったり[^2]Protoflux[^6]に手を出したりする必要があります。これが第三の壁です。

それらのありがちな峠を超えると今度は着替えさせたいみたいな欲が出てきてもうキリがありません。ResoniteのアクティブユーザーはUnityに対して忌避感を占める人も少なくない (※要出典) ですが、私は逆に「Unityがあったらあの服とかそのアクセサリとか簡単に着せられるのに」って思ってしまいます。まあここ最近の話ですが。
それに加え、「VRChat界隈」では「非破壊改変」なる「アバターがもともともつテクスチャやモデルにin-place[^7]な変更をかけることなく編集する」という理念のもとにAAOやModular Avatarを始めとする各種ツールが集結しています。これらはNDMFと呼ばれる礎の上に立っているのですが、当然Unityに依存しているのでResoniteでは動きません。

さらに、いわゆる「VRSNS界隈」ではVRChatのアバター向けSDKがプロプライエタリな形式にも関わらず[^8]PSDやFBXのように相互変換のための形式としてやり取りする慣例が確立しはじめているため、VRChatのアバター向けSDKに対応することが必須だと考えました。この考え方はいわゆる「VRoid Studio」が出力する「XWear形式」やCVR[^9]によって証明されていますが、今後も加速していくことにベットしています。

ということで、私は次のようなツールがあれば今よりももっと楽に素早く調整・確認・使用のサイクルを早く回せるのではないかと思いました。

1. MAやAAOのように、Unityのエディタ拡張として動作する
2. NDMFの上に成り立つツールを**自動的に**呼び出せるようにする
3. Resoniteが解釈できる形式でモデルを出力する
4. VRChatのアバター向けSDKが存在すれば、それ用の特殊処理を挟む

幸い、これらの要件は比較的簡単に達成することができました:

1. Unityのエディタ上で動作するツールとして作成すれば自明に達成できる
2. NDMFのパブリックAPIを使えば達成できる
3. UniGLTFからglTFを出力すれば達成できる
4. やるだけ

そして何より、ツールですからこれらは全て自動でやる必要があります。変換には数十秒ぐらいかかりますが、大半はUniGLTF (後述) が消費しています。

glTFを選んだ理由ですが、khronosが保守してるからいいんじゃねーかなみたいなノリです。ええ。実際いくつか実装があり、その中で割とテストされていて日本語が通じそうなUniGLTFを使うことにしました。UniGLTFはUniVRMの基礎になっているライブラリなので、ある程度ユーザーによってテストされていることが期待できると考えています。形式はどうであれ、モデルを出力することでテクスチャの割当地獄やボーンの割当地獄からは開放されます。ただしFBX、テメーはだめだ。glTFはFBXと違って特定のパスがどうとかではないので、ポータブルに読み込めます。偉いね。
VRMはglTFの拡張なのですが、拡張部分が読み込めないので没になりました。UniVRMを使えよって話なんですが、Humanoidにしか対応してないらしいので今後様子を見ながら検討をネストします。

また、RIHはNDMFを**自動的に**呼び出せるようになっているので最適化のレベルとダイナミクスを天秤にかけることが可能になっています。しかも、VRChat向けの最適化・変換アルゴリズムを転用できるというおまけ付きで。いちいちツールバーからアバターをNDMF Manual Bakeする時代はここに終わりを告げました。
おまけとしてNDMF以外のVRChatビルドパイプラインを通るツールも呼び出せるようになっています。が、普通はそんなに意識することもないでしょう。多分。RIHはそれ以外に特別なことをしていないので、そのあたりで何かぶっ壊れたら普通にビルドしても再現するはずです。

次に着手したのが使用感の向上です。まあ色々ありますが、一番はリグ検知アルゴリズムを騙すためにフラグを立てるところです。最近のアバターは凝ってるので、うかつに`Chest_Belt`みたいなボーン名を付与していることがありますが、Resoniteのリグ検知は深さ優先探索なのでマッチしたら糠喜びして子孫のボーンが存在するかどうかチェックしません。そのためインポートが中途半端になり爆発します。
なので、Unityの`Animator`コンポーネントに存在しないものは全てリグとして検知されないように騙すようにしておきました。
あとはlilToonの焼き込みとかありますが試験的機能だし遅いから割愛。

## おわり
UniGLTFのバグか知りませんが、glTFのメッシュがバグり散らかしてたりするのでresonitepackageを出力しようかな〜とか考えています。が、アバターに存在するコンポーネントは多いのでまだ途方もない時間がかかりそうです。多分10年ぐらい。なので期待しないでおいて下さい。
ありがたいことに月々いくらかの支援を頂いているので、今後も実装できる範囲でメンテナンスを続けていくつもりです。

この文章は間に合うように急いで書いたので多分抜けてるところとかあると思います。こんなんでいいのかは知りませんがとりあえず書き上げたということで、何卒。

明日はオレンジさんの「もこもこっぴ」です。最近mocopiの話題を聞かないけどそれかな?

[^1]: unitypackageのこと。Resonite用語に翻訳するとresonitepackageのこと。
[^2]: Unityで息を吸うようにインスペクタを触るように、Resoniteでもその宿命からは逃れられない。
[^3]: 数キロバイト程度
[^4]: Expression Menuと連動するパラメーターやコンタクトの座標を含めた総称
[^5]: 大雑把に言うとライフゲームが作れること
[^6]: VRChatで言うところのUdon Graph
[^7]: オリジナルのファイルを直接上書きすること
[^8]: 当然FLOSSではない
[^9]: 特殊例ですが
[^10]: 私はPoiyomiをトゥーンシェーダーとは認めません

0 comments on commit 4d72906

Please sign in to comment.