【前編】VRM Converter for VRChatを使わずにVRMへアバターを変換


どうも初めまして、C-kunです。

A-kun Advent Calendar 2024の３日目です。

## はじめに

最近一億年ぶりにVRChatのアバター改変をしました。ModularAvatar便利ですね。おかげでほとんどの衣装がModularAvatarを使っている状態になりました。

しかしながらこの状態、VRMを作成する環境としてどうなのか？と思いました。ArmatureやBoneの設定ができない状態なので、結局手作業で調整することになるのでは...？ここまでくるとその辺も自動化してみたくなります。

調べてみると、VRM Converter for VRChatというものがあるようです。今回はそれについて、使ってみた所感等をメモ程度に書いていきたいと思います。

## 先に結論を教えて

結論としては、ModularAvatarが入っている状態からVRM出力まではとりあえずツールの力を使って出力するところまではできました。しかし、VRMConverter for VRChatを使ってVRMに変換する際に、一部のメッシュがずれてしまう問題が発生しました。

そのため、今回はツールの出力結果も参考にしながら、UniVRMに標準で備わっている機能でVRMを作成する方法に挑戦します。

## ModularAvatar抜きのアバターを作成

まずはアバターのルートオブジェクトで右クリック、ModularAvatarから
ManualBakeAvatarを選択します。
![alt text](https://github.com/fukuda-A-HU/zenn-books/blob/main/images/modularavatar-vrm/image-1.png?raw=true)

すると、以下のようにアバターが複製されます。

![alt text](https://github.com/fukuda-A-HU/zenn-books/blob/main/images/modularavatar-vrm/image-2.png?raw=true)

複製されたアバターにはModularAvatar関連のコンポーネントが削除されています。また、アバターの複数のArmatureがある場合は、それらが統合されています。

## 複製されたアバターの軽量化

VRMファイルを使う際、ほとんどのプラットフォームでファイルサイズの制限があります。そのため、VRMに変換する前のこの段階で不要なGameObjectは削除しておいたり、使用するテクスチャのサイズを圧縮したりするなどはしておいた方がいいでしょう。

参考までに、Clusterでは100MB以下のファイルサイズに収めることが推奨されています。
https://help.cluster.mu/hc/ja/articles/360029465811-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%A2%E3%83%90%E3%82%BF%E3%83%BC%E3%81%AE%E5%88%B6%E9%99%90

アバターをGithubで管理している人も、100MB以上のファイルはアップロードすることができないので、注意が必要です。

## VRM Converter for VRChatでVRMファイルへの変換

次に、アバターをVRMに変換します。

まずは一度Unityを閉じ、下記のリンクからVRM Converter for VRChatをVCCに追加します。

https://id.pokemori.jp/vrm-converter-for-vrchat

あとはこれをプロジェクトに追加します。
![alt text](https://github.com/fukuda-A-HU/zenn-books/blob/main/images/modularavatar-vrm/image-8.png?raw=true)

前項で複製したアバター(名前に(clone)がついている方のアバター)を選択した状態で、上のVRM0からExport VRM file from VRChat Avatarを選択します。VRMをUnityで扱うために必要なアセットも同時に追加してくれます。

![alt text](https://github.com/fukuda-A-HU/zenn-books/blob/main/images/modularavatar-vrm/image-3.png?raw=true)

あとは、VRMファイルに保存する各種パラメータを設定します。個人で使う分に関しては、上の表情設定以外は適当でも良いと思います。

![alt text](https://github.com/fukuda-A-HU/zenn-books/blob/main/images/modularavatar-vrm/image-4.png?raw=true)

最後に、一番下のExport VRM FileでVRMファイルを出力しましょう。

## 変換が...失敗？
VRM Converter for VRChatは、VRMファイルに変換する際に、以下のような問題が発生しました。素体の位置は正しいものの、服の位置がずれています。
上が変換前、下が変換後です。
![alt text](https://github.com/fukuda-A-HU/zenn-books/blob/main/images/modularavatar-vrm/image-15.png?raw=true)
![alt text](https://github.com/fukuda-A-HU/zenn-books/blob/main/images/modularavatar-vrm/image-14.png?raw=true)

変換前のアバターの位置は正しいので、これはVRM Converter for VRChatのなんらかの処理に失敗によるものかもしれません。おそらくですが、UniVRMのVRM0.0対応版の方の処理で失敗しているのではないかと...？詳細は不明ですが、モデルをVRMに変換するところはVRM Converter for VRChatを使わずにUniVRMを使ってやってみる方が良さそうです。いずれにせよ、VRM Converter for VRChatはVRM対応する際にやらなくちゃいけない処理を一括でやってくれているので、自分でVRM対応化するときの参考にするために取っておきましょう。

もしここまでで普通にVRMファイルが出力され、モデルの位置も正しかった人は下記の記事を参考に手順を進めるといいかもしれません。
https://zenn.dev/hitsub/articles/9b6cd40dc1dc8c

## VRM0.0でなく、VRM1.0で出力していく理由


現状、VRM1.0に対応しているツールは少ないですが、今後VRM1.0に対応するツールが増えていくことが予想されます。

ちなみにですが、ClusterもVRM1.0に対応しています。
https://note.com/cluster_official/n/n394990adbd1

そこで今回はVRM1.0で出力することにしました。


## VRM1.0に対応したUniVRMのインストール

前項でUniVRMのVRM0.0版の処理で失敗していると考えたので、UniVRMのVRM1.0で出力していくことにしました。

次に、VRM1.0に対応したUniVRMをインストールします。
Package ManagerからVRM1.0に対応したUniVRMをインストールします。
Window -> Package Manager から、左上の+ボタンの右の三角ボタンを開き、Add package by git URLを選択します、
![alt text](https://github.com/fukuda-A-HU/zenn-books/blob/main/images/modularavatar-vrm/image-9.png?raw=true)

以下のURLを入力し、バージョンを指定してインストールします
- https://github.com/vrm-c/UniVRM.git?path=/Assets/VRM10#vx.xxx.x

xにはUniGLTFなどと同じバージョンを指定してください。
以下のようにVRMConsortiumの欄のバージョンが揃っていれば正しいです。
![alt text](https://github.com/fukuda-A-HU/zenn-books/blob/main/images/modularavatar-vrm/image-10.png?raw=true)

## VRM1.0での出力
出力したいアバター（前項で出力・軽量化したアバター）を選択した状態でVRM1 -> Export VRM 1.0を選択します。

![alt text](https://github.com/fukuda-A-HU/zenn-books/blob/main/images/modularavatar-vrm/image-17.png?raw=true)

Windowが開くので、ファイル名とAuthorを入力し、Exportをクリックします。
![alt text](https://github.com/fukuda-A-HU/zenn-books/blob/main/images/modularavatar-vrm/image-18.png?raw=true)

## VRMファイルの追加、読み込み

出力されたVRMファイルをUnityプロジェクトに追加します。今回はAssets直下に__VRMという名前のフォルダを作成し、その中にVRMファイルを追加しました。
![alt text](https://github.com/fukuda-A-HU/zenn-books/blob/main/images/modularavatar-vrm/image-19.png?raw=true)

この状態で、VRMファイルをHierarchyにドラッグアンドドロップすると、アバターがシーン上に表示されます。
![alt text](https://github.com/fukuda-A-HU/zenn-books/blob/main/images/modularavatar-vrm/image-22.png?raw=true)
とりあえず先ほどのような失敗はしていないようです。

## VRM0.0モデルをVRM1.0モデルに変換
VRM Converter for VRChatはVRM0.0モデルとして出力されるため、VRM1.0モデルに変換する必要があります。

VRM0.0ファイルを選択し、ModelタブからMigrate To Vrm 1 にチェックを入れて、Applyをクリックします。
![alt text](https://github.com/fukuda-A-HU/zenn-books/blob/main/images/modularavatar-vrm/image-11.png?raw=true)


## Materialの調整

まず、手元にMaterialの参考になるようなアバターがある場合はProjectの中に読み込んでおきます。（この時、前項と同様にVRMファイルを選択した際にModelのタブにMigrate To Vrm が表示されている場合、VRM0.0ファイルなので前項と同じようにVRM1.0へ変換しておいてください。）

次に、Hierarchy上にアバターを追加し、(PrefabではなくVRMファイルを直接展開する)Materialを調整していきます。下記のように左からVRM Converter for VRChatで出力したもの、変換前のアバター、UniVRMのVRM1.0版で出力したもの、Materialの参考となるアバターを並べて編集すると便利です。

![alt text](https://github.com/fukuda-A-HU/zenn-books/blob/main/images/modularavatar-vrm/image-24.png?raw=true)

MaterialがProject内に展開されていなかった場合、またはMigrate To VrmでVRM0.0から変換した場合、InspectorからExtract Materials And Textures と Extract Meta And Expressionsを選択してTexture、Material情報をVRMファイルから抽出します。

![alt text](https://github.com/fukuda-A-HU/zenn-books/blob/main/images/modularavatar-vrm/image-20.png?raw=true)

VRM0.0から変換されたモデルのMaterialを変更する際は、下記のように、vrm1のついているフォルダ内のファイルを編集します。

![alt text](https://github.com/fukuda-A-HU/zenn-books/blob/main/images/modularavatar-vrm/image-25.png?raw=true)

ここからは半分気合です...うぉぉ

## まとめ

一旦今回はここまでです。次回は残りの設定を行っていきます。

## 参考文献

https://creator.cluster.mu/2024/10/31/vrm10-override/

https://vrm.dev/univrm1/install/

https://docs.unity3d.com/ja/2019.4/Manual/AvatarCreationandSetup.html

https://docs.unity3d.com/ja/2019.4/Manual/ConfiguringtheAvatar.html

https://vrm.dev/vrm/vrm_about/

https://zenn.dev/hitsub/articles/9b6cd40dc1dc8c