見出し画像

VRChat向けfbxモデル「薄荷」をResoniteに導入する方法(glb変換)

2023年11月7日のResoniteのアップデート(2023.11.7.274)で、Assimpライブラリ(3Dモデルのインポートに使用しているライブラリ)が更新されたことにより、3Dモデル「薄荷」が正常にglbに変換して導入が出来ることを確認したため、具体的な手順についてまとめました。
この記事で想定している読者に含まれてはいませんが、「薄荷」を使っていない人については、この記事の「ボーン名の変更(前準備)」を飛ばしてそれ以降の手順通りにglbに変換してResoniteにインポートを一度試してみてください。正常にインポート出来る場合があります。
「薄荷」のv1.5以降をお使いの方も同様に「ボーン名の変更(前準備)」を飛ばして下さい。

⚠️改変されたアバタのインポートについて
無改変のモデルであれば、殆どの場合はこの方法で正常にインポートが出来ますが、着せ替えなどの改変をしている場合、この方法でインポートを行った時に正常に出来ないことがあります。
その時は素体となるアバタと衣装などのモデルを別々にインポートして、Resonite内でボーンの設定などを行って改変を行った方が不具合が生じる可能性が比較的低いため、この方法を推奨します。
後日Resonite内での着せ替えなどの改変方法についての記事を公開する予定です。


2023年11月9日の「薄荷」のv1.5アップデートについて

2023年11月9日に「薄荷」にアップデートがあり、v1.5になりました。
このバージョンでは、Resoniteでのインポートで問題となっていたボーンの名前が変更されたことにより、記事中の「ボーン名の変更(前準備)」が不要となりました。
また、テクスチャのみの変更や、衣装の変更、髪型の変更など、比較的シンプルな改変の場合は、glb変換は行わず「Hakka_VRC_v1.5.1-20231109」フォルダ内のfbxファイルを直接Resoniteにインポートし、テクスチャの適用や着せ替えなどの改変をResonite内で全て完結させる方が不具合に遭遇するリスクが比較的低く簡単であるため、そちらを推奨します。
改変「薄荷」の素体にv1.44以前の物をお使いでも、素体だけv1.5に置き換えて衣装や髪などを別々にインポートし、Resonite内で改変を行う方が不具合が発生する可能性が比較的低いですので、一度この方法をお試し下さい。
お困りの際や自信が無い場合は、私「CKK COBALT」を含む「当記事への掲載の承諾を頂いたメンターの方々」の一覧にある運営公認の案内人に遠慮なくお声掛け下さい。

想定読者

  • mio3io氏により販売されているオリジナル3Dモデル「薄荷」を所有している。

  • Unityの基本的な操作方法を理解している。(自力でUnitypackageのインポートやヒエラルキからアバタのアーマチュアの中を見ることが出来る)

  • テクスチャの変更程度の改変で、着せ替えなどの大幅な改変を行っていない。

必要な物

  • Unity 2019.4(普段VRChatで使用している物で可)

  • 3Dモデル「薄荷」(今回はHakka_VRC_v1.4.4を使用)

  • UniVRM v0.99.1(付属のUniGLTFでglbに変換して出力)

  • Resoniteクライアント(Steamでダウンロード後ゲーム内でアカウントの作成を完了させておいて下さい)


変換作業

注意

  • 今回は、説明の単純化と読者の混乱防止のため、VCC(VRChat Creator Companion)で生成したプロジェクトではなく、Unity Hubから直接新規作成したプロジェクトで無改変(デフォルト)の「薄荷」で説明しています。

  • 一度作業手順を理解し作業に慣れるためにもUnity Hubから新規作成してデフォルトの「薄荷」で本記事を再現する形で試すことを推奨します。

  • 後日改変済みのモデルの変換とインポート方法についてもVCC生成のプロジェクトを用いた記事を出す予定ですが、内容としては本記事と重複する点が多くあると思われます。(VRC SDK由来のデータはglbには含まれないため)

  • 今回はUnityの操作方法についてある程度は理解している読者を想定しているため、既にヒエラルキ内に3Dモデルが入っている状態から始めます。もし、途中で躓いて自力で解決が出来ない方は信頼出来る知り合い等の支援を受けて下さい。


ボーン名の変更(前準備)⚠️v1.5以降ではこの作業は不要です

まず、「薄荷」のアーマチュアを展開し、画像のように「ChestTassel」と「HandBelt」の文字列を含むのボーン全ての先頭に「<NOIK>」を追加して下さい。これで前準備は完了です。
⚠️v1.5以降の「薄荷」ではこの作業は不要です。
v1.5以降をご使用の方はこの作業は行わず、次の「UniVRM v0.99.1のインポート」に進んでください。

「ChestTassel」と「HandBelt」の文字列を含むボーン全ての先頭に「<NOIK>」を追加

UniVRM v0.99.1のインポート

いつもの要領でUniVRMのUnitypackage(UniVRM-0.99.1_9941.unitypackage)のインポートを行って下さい。
上部のメニューバーに「UniGLTF」と「VRM0」が追加されたことを確認出来れば正常に完了しています。
⚠️ 画像内では、説明のためにVRC SDK未導入のプロジェクトを使用しているため、インスペクタでエラーを吐いていますが、glb形式で出力する際にはこのデータは含まれないためここは無視して問題ありません。

UniVRMのインポートが完了した状態

Modular Avatarで着せ替えをしている場合

Modular Avatarで服の着せ替えなどをしている場合、glbでのエクスポート前に「Manual bake avatar」を行って生成されたクローンを次の工程の「ExportRoot」に設定して下さい。

この操作を行わないと服がアバタに追従しない

glbでエクスポート

メニューバーの「UniGLTF」から、「Export to GLB」をクリックし、「Gltf Exporter」ウィンドウ内の「ExportRoot」に変換を行うアバタのルートをドラッグ&ドロップなどで入れて下さい。

UniGLTFから「Expot to GLB」を選択
「ExportRoot」にアバタのルートを入れる

ここまで完了したら「Export」を押すだけです。
出力先と名前を指定するファイルエクスプローラが表示されますので、そこで出力先と名前を指定して「保存」を押して下さい。
以上でUnityでの作業は全て完了です。

Resoniteでインポート

最初はメンターに頼むことを(強く)推奨

取り敢えず「JP チュートリアルワールド Resonite」のパブリックセッション(VRChatで言うパブリックインスタンスとほぼ同義)に参加しましょう。
「セッションを開始」ボタンを押せば基本的にはパブリックでセッションが作られます。
時間帯によってはResoniteの操作に慣れている方や、運営公認の案内人(メンター)が入ってくれます。
その方にVRChatの経験があることと、アバタのインポートを行いたい旨を伝えて下さい。
また、チュートリアルワールドの入口にメンターを呼ぶボタンがありますので、これを押してメンターを召喚することも出来ます。

困ったら遠慮せず取り敢えずこのボタンを押そう

Resoniteの日本コミュニティの公式Discordサーバもあります。こちらに参加して助けを求めて頂いても構いません。

当記事への掲載の承諾を頂いたメンターの方々

困った時は下の一覧にあるメンターの方々に直接フレンドリクエストを飛ばして助けを求めることも出来ます。
ダッシュメニューのフレンドタブの画面の左上に検索欄がありますので、そこから下の一覧にあるユーザ名を検索してフレリクやメッセージを送ってみましょう。
全員日本語でのコミュニケーションが可能です。

  • orange

  • yoshi1123_

  • kazu

  • FRICK

  • hinano.aira

  • CKK COBALT

ResoniteのフレンドタブにはDMの機能もある

自力でインポートしたい人向けの情報(非推奨)

どうしても自力でインポートしたいという方のために参考となる資料を提供します。
ここで全て解説を行うと、この記事が過剰に長大かつ混乱をきたす物となってしまいますので、後日別の記事で詳細な解説を行います。

既に簡潔にまとめて下さっている動画資料があったため、それを紹介します。
少なくとも、先ほどやったであろうUnityでglb形式でエクスポートする作業よりは簡単です。(実はあれがこの記事のメインです)
まず、アバタのインポートについては、Resonite公認メンターのひとりであるORANGE氏の動画を参考にして下さい。(動画長:1分41秒)

これでインポートが出来るはずです。しかし、このままでは目の動きが大きすぎますので、EyeRotationDriverの設定を行って下さい。
これもORANGE氏の動画が参考になります。(動画長:1分17秒)
「薄荷」の場合は、MaxSwingの値を8辺りを目安にすると良いです。(好みに合わせて値を設定して下さい。)


着せ替えた服がアバタに追従しない時の対処法

インポートするアバタの改変によっては、服のボーンとアバタのボーンとの関連付けが反映されない事により画像のようになることがあります。

服と体が分離した状態

この時は、アバタのインスペクタを開き、服とボーンそれぞれのArmatureを探して下さい。

服とアバタのArmatureが別々になっているのが原因

次に、服のArmatureのボーンをアバタ側の同じ名前のボーンの下に入れて下さい。

この作業の完成形。服由来のボーンをアバタの同じ名前のボーンの下に置く

ボーンを移動させる時は、移動させたいボーンをグラブして移動先で放して下さい。

グラブしている時は、グラブしている物の名前とIDが表示される

この作業、分かる人には分かると思いますが、キセテネが行っている作業を手動で行っています。
これで、服がアバタに追従するようになるはずです。
ボーンの移動先を間違えたなど操作の巻き戻しを行いたい場合は、デスクトップモードの場合はCtrl+Z、VRの場合はコンテキストメニュー(手元に出る丸いメニュー)から「戻す」を選んで下さい。
この作業でも解決出来ない場合は、Resonite内でアバタと服を別々にインポートしてResonite内で着せ替える方が簡単かつ比較的高い確率で解決が見込めます。

インポート完了後の仕上げ

Resoniteへのインポートが終わった直後は、全てのシェイプキーが0に設定されている筈ですので(特にTops)、インスペクタでそれぞれのシェイプキーを編集しましょう。
表情設定ツールはJP チュートリアルワールドにありますので、それをお使い下さい。(「薄荷」の場合は、「Body」のメッシュに表情のシェイプキーがあります)
アイテムやメッシュの表示非表示もインスペクタのActiveのチェックマークで出来ます。
基本的にUnityと同じ雰囲気で編集出来ます。
揺れ物についても設定が飛んでいますので、DyamicBoneを適用しましょう。(購入の必要はありません)
揺れ物についてもORANGE氏の動画を参考にして下さい。(動画長:1分38秒)



今更ながらResoniteとは?(おまけ)

ResoniteはNeosVRと呼ばれる別のサービスの開発に携わっていた人達が独立し2023年10月7日にサービスを開始したVRSNSです。(独立に至った経緯については、話が長くなるので割愛します)
そのため、NeosVRの頃の操作感や仕様を多く引き継いでおり、困った時はNeosVRのWikiやドキュメントを漁れば殆どの場合は解決します。
つまり、Resoniteの操作や仕様にやけに詳しい方々はNeosVRの頃から遊んでいる人達です。

恐らく、アバタをセットアップしている時にインスペクタを開いた時点で察しが付いたかとは思いますが、今までUnityで行っていたVRChatのアバタの改変の大半は基本的にResonite内で完結します。
着せ替えもResonite内で有志の方が作って配布している専用のツールを使えば簡単に出来ます。(Resonite標準のツールでも出来はしますが、少々複雑で初っ端からこれを触るのは辛いと思いますので割愛します)
Resoniteがどんなゲームなのかというのは、これは私の個人的な表現なのですが、ResoniteはVRゲームの皮を被った「VRでも編集可能かつ共同作業も可能なVRゲームに特化したIDE(統合開発環境)」です。

Unityで見慣れたヒエラルキとそのインスペクタ
メッシュを選べばUnityでお馴染みのSkinnedMeshRenderer
「Materials(List):」にあるマテリアルの横の「↑」ボタンを押すとこれもまた見慣れた画面

機会があればインスペクタの使い方についてもまとめます。階層の移動はヒエラルキ欄の上のボタン二つで出来ます。
上でも言及しましたが、基本的にアバタの改変やワールドの製作などUnityでやっていたことの大半はResonite内で完結します。また、変更はリアルタイムに反映され、ビルドやアップロードの待ち時間はありません。
更に、VRHMDを外せば自動的にデスクトップモードに瞬時に切り替わります。
インスペクタの機能やその仕様についてはNeosVRの頃と大差無いため、NeosVRのwikiの記事を資料として置いておきます。

この二つのボタンで今開いているスロットの上の階層に移動が出来る

複数のインスペクタを同時に開いて作業も可能

Resoniteの世界観

最後にResoniteの楽しい世界観を紹介して終わります。この世界を気に入って貰えたら嬉しいです。
そして、自身の知り合いにもどんどんResoniteを紹介して下さい。
読者の皆様のResonite生活が良い物となりますことを願っております。

カメラはチェキ

Resoniteでカメラを使って写真を撮ると、暫くすると撮影した画像がカメラや撮影者の近くにオブジェクトとしてスポーンします。これを他の人も画像(スクリーンショット)として保存が可能です。
カメラで撮影するとその画像が出て来る。そして他の人と共有が出来る仕様は、まさしく撮影してその場でプリント出来るインスタントカメラ(チェキ)のようです。

Ctrl+ZとCtrl+Yがある世界

この世界は編集可能です。つまり、作業の巻き戻しが可能とも言えます。VRモードでは、コンテキストメニュー(手元に出て来る丸いメニュー)から「戻す」ボタンで作業の巻き戻しが可能です。デスクトップモードではCtrl+ZとCtrl+Yがそのまま使えます。

誰かが教えてくれる安心感

この世界での編集画面は、他のユーザからも見えていますし他のユーザも編集可能です。(Builder権限が必要)
そのため、分からない事ややりたいけどやり方が分からない事があった時に周囲の人に訊くとその場でスムーズに対応出来ます。
誰かに頼る時にDiscordなど連絡先を交換し、画面を共有して…という過程が無いのは大きなメリットです。
困った時は取り敢えずメンターに訊けば間違いありません。その場で教えてもらえるか、その分野に詳しい人を紹介してくれます。

見える物全てが編集可能

今回アバタを編集しましたが、勿論ワールドも編集可能です。
それだけではありません。目の前にある「シーンインスペクター」、これも編集可能です。是非時間があれば、インスペクタのインスペクタを開いてインスペクタを編集してみましょう。
壊れたら消して新しく作り直せば良いだけ。色々漁って弄って壊して楽しみましょう。
ちなみに、インスペクタを出す時使っている手元のDevTool、これも編集可能です。DevToolなどのツールを自分好みにカスタムして使っている方も居られます。


技術的な話(興味のある方向けの情報)

glb形式である理由

この記事ではfbxモデルをglb形式に変換した上でResoniteにインポートした。
FBX形式でのインポートも可能だが、UnityのFBX Exporterを使う場合、適切な場所にテクスチャのフォルダを置いてエクスポートしないとResoniteにインポートした時にテクスチャが適用されず、Resonite内でテクスチャのインポート作業やインスペクタを開いてマテリアルを編集するなどとUnityとResonite内共々により複雑な作業と全体の作業工程数が増える。
一方、glb(今回使用したUniGLTFでのエクスポート)形式でのインポートの場合、Unity内でのフォルダの作成移動などの操作は必要なく、Unitypackageをインポートし、Exportをクリックするだけでテクスチャが適用された状態でResoniteにインポート可能となり、要求される作業は前者と比較しかなり簡素化され、Resonite内での作業工程数とその作業時間も削減することが出来る。

ボーンの名前を変更する理由

Resoniteは、IKシステムを含む多くの部分でFrooxEngineと呼ばれるこのゲームに最適化された独自のゲームエンジンで動いている。(最終的なレンダリングや音声関係のみUnityの機能に依存している)
そのため、3Dモデルのインポートにはfbxやglbなどの汎用の3Dモデル用の形式しか使用できず、そこに含まれていないUnity独自のアバターマッピングなどの機能や情報が使用及び参照出来ない。
この事情により、ResoniteのIKシステムは、ボーンの名前から部位を推定し、独自にUnityのアバターマッピングに相当する物をインポート時に構築しアバターとして使用している。
つまり、ボーンの名前にIKシステムが誤認識する文字列が含まれている場合、その3DモデルのIKのセットアップが正常に出来ないのである。
そして、今回インポートに使用した「薄荷」は、まさしくその問題を抱えており、IKシステムが正常にセットアップ出来るよう誤認識を引き起こしうるボーンにResoniteのIKシステムがそれらを無視すよう「<NOIK>」と先頭にマーキングしている。

ボーンの名前を変更せずにインポートした場合はこうなる
ResoniteのIKシステムがChestTasselをchestと誤認識しているのが原因

最新のUniVRMではなく、UniVRM v0.99.1を使用する理由

この記事は、VRChat向けに日頃からUnity 2019.4で改変などをしている者を想定して書いている。そのため、Unity 2019.4に対応している過去のバージョンで最新のUniVRM v0.99.1を使用した。これ以降のバージョンはUnity 2019.4に非対応であり、インポートを行ってもエラーが出て正常に動作しないことをUniVRM v0.115.0で確認している。


この記事が気に入ったらサポートをしてみませんか?