From c31fb0834321ccf6b6189d3d674bce3ea2df46ca Mon Sep 17 00:00:00 2001 From: Kisaragi <48310258+KisaragiEffective@users.noreply.github.com> Date: Mon, 2 Dec 2024 21:33:55 +0900 Subject: [PATCH 1/4] Create 9751ad99-74b5-4297-a27f-367aa69a7f68.md --- .../9751ad99-74b5-4297-a27f-367aa69a7f68.md | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 SideStory~/9751ad99-74b5-4297-a27f-367aa69a7f68.md diff --git a/SideStory~/9751ad99-74b5-4297-a27f-367aa69a7f68.md b/SideStory~/9751ad99-74b5-4297-a27f-367aa69a7f68.md new file mode 100644 index 0000000..698e4ef --- /dev/null +++ b/SideStory~/9751ad99-74b5-4297-a27f-367aa69a7f68.md @@ -0,0 +1,38 @@ +# 無題_9751ad99-74b5-4297-a27f-367aa69a7f68 +この記事はResoniteアドカレ1枚目 n日目の記事です。 + +※このリビジョンは下書きです。 + +## なぜRIHを作ったのか +* 人に依存するセットアップワークフローが嫌だったから + * 例えば、丑三つ時にセットアップしたくなってもできませんね? + * できる ← まあそうだね、ところで私はdev tooltipをもってインスペクタを開いてテクスチャをいちいち割り当てるのは苦行だと思います +* Resoniteで着替えさせるのがめんどくさい (はず) + * ツッコミまち: 少なくとも自分はそのようなツールを知らない +* VRMが使えないから + * 正確には、glTFは読み込めるがMToonなどのVRM拡張部分が読めない +* 手動作業が面倒だから + * NDMF Manual Bakeして、UniGLTFでエクスポートして、シェーダーをいい感じに見比べて、違ってたら修正して……なんてやってられるかーーーー!!! + * 決まりきったワークフローを手動でやるのはミスの元だし時間の無駄 +* 表情作るのがちょっと面倒 + * モデルをインポートしたときにシェイプキーの初期値が読み込まれないことがある +* 今流行りの非破壊改変と相性が悪い + * 一部はProtoFluxでエミュレートできるが、アバターの構成要素を全て操作できるわけではない +* IK探知が勘違いする + * 例えば"ChestBelt"というボーンが胸だと認識されてリグがおかしくなるとか、そういうの + +これらはRIHでほぼ解決します。 + +* 人に依存するセットアップワークフロー → かなりの軽減 +* Resoniteで着替えさせるのがめんどくさい → それなりに軽減 +* VRMが使えない → いい感じにそれっぽいプロパティをglTFに押し込めることで強引に解決 +* 手動作業が面倒 → 手動作業を破壊 +* 表情作るのがちょっと面倒 → 今は解決しない +* 今流行りの非破壊改変と相性が悪い → NDMFとVRCSDKのホックに対応して解決 +* IK探知が勘違いする → `` をつけて解決 + +## むすび +ありがたいことに月々いくらかの支援を頂いているので、今後も実装できる範囲でメンテナンスを続けていくつもりです。 + +明日は〇〇さんの『〜』です、お楽しみに! + From cb96858f2da7fa4c6cd74f65d1501789e269faff Mon Sep 17 00:00:00 2001 From: Kisaragi <48310258+KisaragiEffective@users.noreply.github.com> Date: Wed, 4 Dec 2024 20:20:01 +0900 Subject: [PATCH 2/4] Update 9751ad99-74b5-4297-a27f-367aa69a7f68.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit セーブ --- .../9751ad99-74b5-4297-a27f-367aa69a7f68.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/SideStory~/9751ad99-74b5-4297-a27f-367aa69a7f68.md b/SideStory~/9751ad99-74b5-4297-a27f-367aa69a7f68.md index 698e4ef..7944d25 100644 --- a/SideStory~/9751ad99-74b5-4297-a27f-367aa69a7f68.md +++ b/SideStory~/9751ad99-74b5-4297-a27f-367aa69a7f68.md @@ -1,9 +1,22 @@ # 無題_9751ad99-74b5-4297-a27f-367aa69a7f68 -この記事はResoniteアドカレ1枚目 n日目の記事です。 - -※このリビジョンは下書きです。 +この記事は[Resoniteアドカレ1枚目](https://adventar.org/calendars/10543)5日目の記事です。 ## なぜRIHを作ったのか +なぜ私がResoniteImportHelper、略してRIHを作ったのかは今まであまり説明してこなかったことだと思うので、これを機に説明します。 + +「前」からの慣例として、Resoniteに初めて来た人や新しくアバターをセットアップする人は専用ワールドでセットアップしたものでした。 +しかし、私はそれを是としませんでした。なぜなら、必要な行程ではあるもののセットアップの手間がVRChatのそれとはかけ離れているからです。 +VRChatでは、Unityというゲームエンジンを開き、ZIPもどき[^1]を解凍すると一発で使えるアバターが置かれていることがほとんどです。そして、それを編集する際にはUnityで編集してからサーバーにアップロードします。 +一方のResoniteではどうでしょうか。親切なショップであれば同等の役割を果たすresonitepackageが同梱されていることがありますが、ほとんどはそうではありません。そこで、通常はFBXやVRMなどの汎用モデル形式をインポートすることになります。 +しかし、多くの場合でテクスチャの参照が壊れているため、メインテクスチャ、ノーマルマップ、マットキャップといったあらゆるテクスチャをもう一度割り当てる必要があります。これが第一の関門です。いくら必須の操作とはいえ、早い段階でこれを要求するのは厳しいものがあると主張します。 +しかし、慣れている既存ユーザーに委託するのにも解決が難しい問題があります。 +まず、引き受けてくれる人を探さなければならないことです。私のようにコミュニケーションが上手ではないユーザーや、一人で過ごしたいがwikiの翻訳が追いついていないためにキャッチアップすることが難しいユーザーは厳しい決断を迫られていると考えています。 +また、ライセンス上の問題も存在します。以前、「アバター界隈」で広く用いられているVN3ライセンスの改訂案を募集していたため、他人によるセットアップを他人への改変委託から分離してはどうか、と意見を書き込みましたが、モデラーを対象にした過去のアンケートによる結果及びresonite自体がモデラーに知られていないことにより却下されました。あまり意識されない観点ではありますが、これが第二の壁です。 +それが終わると今度は表情やらギミックやらの再現が必要になるでしょう。幸い、VRChatでエンコードできるのは有限のメモリなので、チューリング完全ではありません。しかし、完全に同期させるとなるとやはりインスペクタを触ったりProtofluxに手を出したりする必要があります。これが第三の壁です。 + + +[^1]: unitypackageのこと。Resonite用語き翻訳するとresonitepackageのこと。 + * 人に依存するセットアップワークフローが嫌だったから * 例えば、丑三つ時にセットアップしたくなってもできませんね? * できる ← まあそうだね、ところで私はdev tooltipをもってインスペクタを開いてテクスチャをいちいち割り当てるのは苦行だと思います From 94471dd371c27e1570421d3d1650df28961e41e9 Mon Sep 17 00:00:00 2001 From: Kisaragi <48310258+KisaragiEffective@users.noreply.github.com> Date: Wed, 4 Dec 2024 23:03:44 +0900 Subject: [PATCH 3/4] Update 9751ad99-74b5-4297-a27f-367aa69a7f68.md --- .../9751ad99-74b5-4297-a27f-367aa69a7f68.md | 84 +++++++++++-------- 1 file changed, 51 insertions(+), 33 deletions(-) diff --git a/SideStory~/9751ad99-74b5-4297-a27f-367aa69a7f68.md b/SideStory~/9751ad99-74b5-4297-a27f-367aa69a7f68.md index 7944d25..c7ac65d 100644 --- a/SideStory~/9751ad99-74b5-4297-a27f-367aa69a7f68.md +++ b/SideStory~/9751ad99-74b5-4297-a27f-367aa69a7f68.md @@ -8,44 +8,62 @@ しかし、私はそれを是としませんでした。なぜなら、必要な行程ではあるもののセットアップの手間がVRChatのそれとはかけ離れているからです。 VRChatでは、Unityというゲームエンジンを開き、ZIPもどき[^1]を解凍すると一発で使えるアバターが置かれていることがほとんどです。そして、それを編集する際にはUnityで編集してからサーバーにアップロードします。 一方のResoniteではどうでしょうか。親切なショップであれば同等の役割を果たすresonitepackageが同梱されていることがありますが、ほとんどはそうではありません。そこで、通常はFBXやVRMなどの汎用モデル形式をインポートすることになります。 -しかし、多くの場合でテクスチャの参照が壊れているため、メインテクスチャ、ノーマルマップ、マットキャップといったあらゆるテクスチャをもう一度割り当てる必要があります。これが第一の関門です。いくら必須の操作とはいえ、早い段階でこれを要求するのは厳しいものがあると主張します。 -しかし、慣れている既存ユーザーに委託するのにも解決が難しい問題があります。 + +しかし、多くの場合でテクスチャの参照が壊れているため、メインテクスチャ、ノーマルマップ、マットキャップといったあらゆるテクスチャをもう一度割り当てる必要があります。これが第一の関門です。いくら必須[^2]の操作とはいえ、早い段階でこれを要求するのは厳しいものがあると主張します。 +それに加え、慣れている既存ユーザーに委託するのにも解決が難しい問題があります。 まず、引き受けてくれる人を探さなければならないことです。私のようにコミュニケーションが上手ではないユーザーや、一人で過ごしたいがwikiの翻訳が追いついていないためにキャッチアップすることが難しいユーザーは厳しい決断を迫られていると考えています。 また、ライセンス上の問題も存在します。以前、「アバター界隈」で広く用いられているVN3ライセンスの改訂案を募集していたため、他人によるセットアップを他人への改変委託から分離してはどうか、と意見を書き込みましたが、モデラーを対象にした過去のアンケートによる結果及びresonite自体がモデラーに知られていないことにより却下されました。あまり意識されない観点ではありますが、これが第二の壁です。 -それが終わると今度は表情やらギミックやらの再現が必要になるでしょう。幸い、VRChatでエンコードできるのは有限のメモリなので、チューリング完全ではありません。しかし、完全に同期させるとなるとやはりインスペクタを触ったりProtofluxに手を出したりする必要があります。これが第三の壁です。 +それを乗り越えると今度はAOが強すぎるやら影が出すぎるやらでlilToonとかPoiyomi Toon[^10] っぽくならないことに悩まされます。まあAOは手元できることもできるんですが、他人がそうとは限らないので他人の写真写りは悪くなったりします。かなしいやつ。 +今度は表情やらギミックやらの再現が必要になるでしょう。幸い、VRChatでエンコードできるのは有限[^3]のメモリ[^4]なので、チューリング完全[^5]ではありません。しかし、完全に同期させるとなるとやはりインスペクタを触ったり[^2]Protoflux[^6]に手を出したりする必要があります。これが第三の壁です。 -[^1]: unitypackageのこと。Resonite用語き翻訳するとresonitepackageのこと。 +それらのありがちな峠を超えると今度は着替えさせたいみたいな欲が出てきてもうキリがありません。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. やるだけ -* 人に依存するセットアップワークフローが嫌だったから - * 例えば、丑三つ時にセットアップしたくなってもできませんね? - * できる ← まあそうだね、ところで私はdev tooltipをもってインスペクタを開いてテクスチャをいちいち割り当てるのは苦行だと思います -* Resoniteで着替えさせるのがめんどくさい (はず) - * ツッコミまち: 少なくとも自分はそのようなツールを知らない -* VRMが使えないから - * 正確には、glTFは読み込めるがMToonなどのVRM拡張部分が読めない -* 手動作業が面倒だから - * NDMF Manual Bakeして、UniGLTFでエクスポートして、シェーダーをいい感じに見比べて、違ってたら修正して……なんてやってられるかーーーー!!! - * 決まりきったワークフローを手動でやるのはミスの元だし時間の無駄 -* 表情作るのがちょっと面倒 - * モデルをインポートしたときにシェイプキーの初期値が読み込まれないことがある -* 今流行りの非破壊改変と相性が悪い - * 一部はProtoFluxでエミュレートできるが、アバターの構成要素を全て操作できるわけではない -* IK探知が勘違いする - * 例えば"ChestBelt"というボーンが胸だと認識されてリグがおかしくなるとか、そういうの - -これらはRIHでほぼ解決します。 - -* 人に依存するセットアップワークフロー → かなりの軽減 -* Resoniteで着替えさせるのがめんどくさい → それなりに軽減 -* VRMが使えない → いい感じにそれっぽいプロパティをglTFに押し込めることで強引に解決 -* 手動作業が面倒 → 手動作業を破壊 -* 表情作るのがちょっと面倒 → 今は解決しない -* 今流行りの非破壊改変と相性が悪い → NDMFとVRCSDKのホックに対応して解決 -* IK探知が勘違いする → `` をつけて解決 - -## むすび +そして何より、ツールですからこれらは全て自動でやる必要があります。変換には数十秒ぐらいかかりますが、大半は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をトゥーンシェーダーとは認めません From a4e8673c0011ec5812943f9b1b53eaf5ab87a535 Mon Sep 17 00:00:00 2001 From: Kisaragi <48310258+KisaragiEffective@users.noreply.github.com> Date: Wed, 4 Dec 2024 23:06:29 +0900 Subject: [PATCH 4/4] Update SideStory~/9751ad99-74b5-4297-a27f-367aa69a7f68.md --- SideStory~/9751ad99-74b5-4297-a27f-367aa69a7f68.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SideStory~/9751ad99-74b5-4297-a27f-367aa69a7f68.md b/SideStory~/9751ad99-74b5-4297-a27f-367aa69a7f68.md index c7ac65d..c0a4fed 100644 --- a/SideStory~/9751ad99-74b5-4297-a27f-367aa69a7f68.md +++ b/SideStory~/9751ad99-74b5-4297-a27f-367aa69a7f68.md @@ -56,7 +56,7 @@ UniGLTFのバグか知りませんが、glTFのメッシュがバグり散らか 明日はオレンジさんの「もこもこっぴ」です。最近mocopiの話題を聞かないけどそれかな? -[^1]: unitypackageのこと。Resonite用語き翻訳するとresonitepackageのこと。 +[^1]: unitypackageのこと。Resonite用語に翻訳するとresonitepackageのこと。 [^2]: Unityで息を吸うようにインスペクタを触るように、Resoniteでもその宿命からは逃れられない。 [^3]: 数キロバイト程度 [^4]: Expression Menuと連動するパラメーターやコンタクトの座標を含めた総称