
VRM1をVRC用に設定する検証(24/8/24付)
これは、VRM1.0をVRCアバターとして設定することを、実際に試してみての記録である。この先、同じようなケースが発生する可能性が高いので、それに備えて記録を残す。
まえがき
VRM1.0の現状
新しい機能が入った、新しいVRM!それが1.0!
コンストレイントが使えるぞ、ワーイヤッター!
見た目そんな感じかもしれないけど、そう簡単な話ではない。
詳細は詳しい人の説明を各自探して読んで欲しいんだけど、
0.x→1.0は、安直に互換のあるような更新ではない。
VRMをVRCで使う
自分で作ったモデルなら、VRMでもVRCでも好きにやれるかもだけど。
よしんば、自分が作ったVRMを販売して、それを誰かがVRCで使いたい、となったら?
もしくは、知り合いがVRMをVRCで使いたいんだけどうまくできないんだよ、となったら?
従来は、100の人が製作してくれている『VRMコンバータ』をUnityにインポートして利用することで、比較的簡単にVRCでも使うことができた。
だけど『VRM1.0』は内容が変わりすぎて、コンバータでVRC用にすることができない。(24/8/24現在)
気楽に1.0ヤッター!って言ってる人たちも、こういう課題があるんだよ、てことは知っておいて欲しい。

とはいえ、いつまでも0.xでくれ、というわけにもいかない。
1.0をVRCで使うには、という手順を今回は確認する。
検証①VRMコンバータ
検証用環境の準備
先ずはVRCSDKとVRMコンバータだけの最新版のプロジェクトを(VCCかALCOMで)作ってみよう。
VRCSDK3(アバター)と、VRMコンバータのみを入れる。
それからVRMはコンソーシアムの公式サンプルをDLしておこう。


VRMコンバータは1.0を扱えない
早速VRMをプロジェクトにインポートしてみよう。
あれれ?VRMとして認識してないぞ。
これは…VRMコンバータにはUniVRMが一緒についてくるんだけど、0.x専用のバージョンしかないようで…1.0を読みこむためのライブラリを、コンバータは持っていないのでは?(24/8/24現在)
それってつまり、対応してないのでは????
試しに、VRM1.0を読み込めるVniVRMを、プロジェクトに追加してみると、認識できるようになった。
これをコンバートできるか!?





結局、コンバータは1.0を扱うことはできない。
なにやら出来るらしい話を小耳にはさんだので、いつのまにか更新され可能になったのかも?と思って検証したんだけどねw 1.0に付与されているスクリプトやメタファイルは、コンバータが必要としている情報ではないようで。
『できない』ということがわかった。(24/8/24現在)
これはたぶん普通のFBXインポートからVRC用設定をするのと同じことになるかな。表情操作とかも構築しないとできない訳だよね。
検証②DiscripterとConstraint,Physics
VRC用コンポーネントをつけなおす
従来のコンバータが使えないのであれば、普通のFBXを設定するのと同じように設定すれば良いということ。
試しにVRMをヒエラルキーにもってきてunpack。VRM設定用のコンポーネントを削除してから、VRCアバターディスクリプタをつけてみた。
VRCSDKは、VRM1のコンストレインもspringboneもコライダーも”なんか余計なもんついてんぞ”と警告してくる。
VRM用のそれらのスクリプトは残したまま、置き換えるためのVRC用のスクリプトを付け足していく。
できあがったら、VRCSDKのビルダーの警告”(!)余計なVRM用のスクリプトがついてるぞ”をオートFIXしてみると、余計なスクリプトを全部消してくれる。

「余計なものがついている」と(!)警告されている。




この状態で動作確認をしてみる。physicsやコンストレインが動くようになってるので、問題が出ていないかよく見て、ひとつひとつ解決していこう。
VRVRCで動かすこともできる。
しかし、コンストレインは適した設定を探すのがなかなか面倒で、問題があっても後々まで解消できないものもあった。


検証②の際に課題と感じたこと
カプセルコライダーの指定方法の違い
そういえば、カプセルコライダーの指定方法が違う。
VRM1では、始点と終点の2か所を座標指定しているのに対して、
Physbpneでは、1か所の中心座標と角度。
座標やラジアスの値を移すだけでは置き換えることができない。
普通にやるにも、ビューポートを見ながら調節していく必要があるし、例えば後々変換を自動化するとしたら、どうやることになるんだろう???

エイムコンストレインの角度計算問題
サンプルでは、ショートパンツのすそが足ボーンのY軸回転(ねじれる方向)の影響を受けないように、エイムコンストレインで制御されていた。
だけどこれが、非常に厄介な問題に突き当たった。
たぶんなんだけど、エイムで制御する計算をする際に"問題の出る向き"というのが存在する。X軸のある角度を境に、Y軸の計算角度が0度から180度に置き換わる、とかそういうの。
これに対応するために、計算方向の根拠の向きを指定したりとか設定があるんで、試行錯誤してみたけど問題が解消できなかった。
こういう場合、エイムコンストレインではなく、ローテーションコンストレインでやる場合がある。とりあえずそうすることで問題を回避したんだけど、ボーンの階層構造を変更する必要があった。
これも個々のケースでの対処はできても、後々自動変換は難しくなるのではないか。
余談だけどこれをエイムで制御するやりかたは、MAYAとかUnityのやりかたよりも、MMDのリグのやり方に似た印象がある。(昔おなじことやったもん…)

検証③表情操作構築
ツールの追加
次は表情を動くようにするんだけど、僕はこういうのはちょっと苦手なので、ツールに頼ってみよう。
FaceEmoだ。VCCから指定してDLしたほうが便利そう。

これは表情操作を作成するために必要な作業一式を、ほぼ自動でやってくれるという、たいへんありがたいツール!
どういう操作パターンにするか、シェイプを動作させるanimをどう作るか、といったあたり指定作業があるけど、使い方の案内に従って行けば、僕でも簡単に作ることができた!
VRM内の指定をFaceEmoで置換
キーアサインはVRMコンバータと同じにしてみよう。
もとのVRM1がどの表情の時にどのシェイプを使っているかは、VRMのプレハブ内にある、表情名のデータをインスペクタで見ればわかる。
これを参照しながら、VRC用にFaceEmoツールで設定していく。



その他の設定
その他、リップシンク、視線、まばたきの設定等を、通常のVRCSDKの手順に則って設定していく。
ちょっと困ったこと
何故かわからないんだけど、視線の設定(EyeLook)を有効にすると、リップシンクの設定が変更できなくなるみたいだ。
リップシンクが変えられない…何故!?となってたら、EyeLookを無効にしてみて。

総括
こうして、VRM1.0をVRC用に使えるようにしてみたわけだけど、手間がかかるのは確かだった。
VRM0.xであれば、だいたい同じような結果を、VRMコンバータがやってくれることで得らるんだ。
だから本当にどうしても必要、という場合以外は、1.0を使うだけで手間が増えるので、僕としてはあまり使いたくない。
寧ろコンストレインとかなしでなんとかできる方法を探ってでも0.xにしといたほうが確実、という感もある。
あくまで今現在(24/8/24時点)での状況なので、例えば今後、VRM1.0を簡単にVRC用に変換できる方法ができてくるのであれば、変わると思う。