見出し画像

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ヤッター!って言ってる人たちも、こういう課題があるんだよ、てことは知っておいて欲しい。

VRC用にするんなら、VRM0.xをくれ…!

とはいえ、いつまでも0.xでくれ、というわけにもいかない。
1.0をVRCで使うには、という手順を今回は確認する。

検証①VRMコンバータ

検証用環境の準備

先ずはVRCSDKとVRMコンバータだけの最新版のプロジェクトを(VCCかALCOMで)作ってみよう。
VRCSDK3(アバター)と、VRMコンバータのみを入れる。
それからVRMはコンソーシアムの公式サンプルをDLしておこう。

ALCOMで新しいプロジェクトを作る
VRM1.0の公式サンプルをDLしてみる

VRMコンバータは1.0を扱えない

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

試しに、VRM1.0を読み込めるVniVRMを、プロジェクトに追加してみると、認識できるようになった。
これをコンバートできるか!?

VRM1.0を放り込んでみるけど、VRMとして認識しない
0.xのライブラリはあるけど、1.0のライブラリが入ってない
1.0のライブラリをプロジェクトに追加した
VRM1.0のデータを、モデルとして認識した
VRMコンバータは、VRMに必要なコンポーネントが無い(ので変換できない)と言ってきた

結局、コンバータは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してみると、余計なスクリプトを全部消してくれる。

VRMの設定用コンポーネントを消して、VRCアバターディスクリプタをつけてみた。
「余計なものがついている」と(!)警告されている。
コライダー。VRM用を残したまま、置き換え用のVRC用スクリプトを付け足す。
SpringBpne。VRM用を残したまま、置き換え用のVRC用スクリプトを付け足す。
エイムコンストレイン。VRM用を残したまま、置き換え用のVRC用スクリプトを付け足す。
VRCSDKの(!)警告のオートFIXを実行すると、VRM用スクリプトは消える。

この状態で動作確認をしてみる。physicsやコンストレインが動くようになってるので、問題が出ていないかよく見て、ひとつひとつ解決していこう。
VRVRCで動かすこともできる。

しかし、コンストレインは適した設定を探すのがなかなか面倒で、問題があっても後々まで解消できないものもあった。

VRCで動かしてPhisicsとコンストレインを確認しているところ
上腕のコンストレインの設定が適切でなかった(こんなのはごく一部だ

検証②の際に課題と感じたこと

カプセルコライダーの指定方法の違い

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

カプセルコライダーの設定方法の違い。単純に変換ができない。

エイムコンストレインの角度計算問題

サンプルでは、ショートパンツのすそが足ボーンのY軸回転(ねじれる方向)の影響を受けないように、エイムコンストレインで制御されていた。
だけどこれが、非常に厄介な問題に突き当たった。

たぶんなんだけど、エイムで制御する計算をする際に"問題の出る向き"というのが存在する。X軸のある角度を境に、Y軸の計算角度が0度から180度に置き換わる、とかそういうの。
これに対応するために、計算方向の根拠の向きを指定したりとか設定があるんで、試行錯誤してみたけど問題が解消できなかった。

こういう場合、エイムコンストレインではなく、ローテーションコンストレインでやる場合がある。とりあえずそうすることで問題を回避したんだけど、ボーンの階層構造を変更する必要があった。
これも個々のケースでの対処はできても、後々自動変換は難しくなるのではないか。

余談だけどこれをエイムで制御するやりかたは、MAYAとかUnityのやりかたよりも、MMDのリグのやり方に似た印象がある。(昔おなじことやったもん…)

エイムコンストレインの角度計算の問題が出ている様子

検証③表情操作構築

ツールの追加

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

FaceEmo

これは表情操作を作成するために必要な作業一式を、ほぼ自動でやってくれるという、たいへんありがたいツール!
どういう操作パターンにするか、シェイプを動作させるanimをどう作るか、といったあたり指定作業があるけど、使い方の案内に従って行けば、僕でも簡単に作ることができた!

VRM内の指定をFaceEmoで置換

キーアサインはVRMコンバータと同じにしてみよう。
もとのVRM1がどの表情の時にどのシェイプを使っているかは、VRMのプレハブ内にある、表情名のデータをインスペクタで見ればわかる。
これを参照しながら、VRC用にFaceEmoツールで設定していく。

VRMのプレハブ内の表情名のデータを参照する
FaceEmoの設定画面
ハンドサインで表情が動く

その他の設定

その他、リップシンク、視線、まばたきの設定等を、通常のVRCSDKの手順に則って設定していく。

ちょっと困ったこと

何故かわからないんだけど、視線の設定(EyeLook)を有効にすると、リップシンクの設定が変更できなくなるみたいだ。
リップシンクが変えられない…何故!?となってたら、EyeLookを無効にしてみて。

EyeLookが有効になってると、リップシンクの設定操作ができなくなる

総括

こうして、VRM1.0をVRC用に使えるようにしてみたわけだけど、手間がかかるのは確かだった。
VRM0.xであれば、だいたい同じような結果を、VRMコンバータがやってくれることで得らるんだ。

だから本当にどうしても必要、という場合以外は、1.0を使うだけで手間が増えるので、僕としてはあまり使いたくない。
寧ろコンストレインとかなしでなんとかできる方法を探ってでも0.xにしといたほうが確実、という感もある。

あくまで今現在(24/8/24時点)での状況なので、例えば今後、VRM1.0を簡単にVRC用に変換できる方法ができてくるのであれば、変わると思う。

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