VRMローダ を VRM1.0 に対応する道のり(途中)
VRM1.0(まだ正式リリースされていません)の対応過程を、備忘録として書きます。
進展あったら追記します。
この記事はVRMの汎用的な話です。ただ、UnrealEngine向けVRMローダー開発を通じて得た見解なので 内容には偏りがあります。
VRM0→VRM1.0 対応までの道のり(途中)
- VRM0を glTF2の機能付きでエクスポート、読み込みチェック
- VRM1 glTFとして読み込む
- VRM1 Humanoid骨
- VRM1 MToon
- VRM1 Expression
- ローカル軸があるVRM1の対応
- (未着手)Spring, Constraintの対応
- (未調査)ライセンス、一人称視点用のデータ などなど
利用可能な検証アセット
UniVRMの中に、VRM0->VRM1 に変換するサンプルがある。
VRM-1.0β/Runtime/Scenes/SampleScene.unity
デフォルトでは、アリシア・ソリッドのVRM0がコンバート対象になっている。
おそらく、純粋なVRM1の公式サンプルデータは無い(2022/02/16時点)
以下、対応順にメモなど。
VRM0 を glTF2の機能付きでエクスポート、読む
ローダがglTF2.0を読めるか確認する。
VRM0を「UseSparseAccessor」と「DivideVertexBuffer」をONでエクスポートし、読み込みテストする。
ローダがSparseAccessor に未対応だとExpression(顔アニメとか)が正しく読めない。
VRM1 glTFとして読む
正面向きが変わっている。VRM0との共存方法を考える。
VRM1 Humanoid骨
パラメータの格納箇所が変わっている。.vrmファイルからJSON部分をコピペしてビューワで見比べるのが早い。
Chest, Neckが無いモデルを扱えるか考える。(VRM0から引き続きupperChestやshoulderもOptional骨)
骨違いのリターゲット実装について、考える。
humanoid骨 詳細
自分がよく使っているJSONのビューワ
VRM1 MToon
全容はここにある。VRM0からの差分・補足情報が多いので、実装を全部見直すのが早い。
大きな変更点は ShadingShift/ShadingToony処理変更、リニア色空間。
前段の手順と同じく、JSONビューワで差分を確認しつつ進める。パラメータがglTF側に格納されている場合もある。
UniVRMはVRM0->1 のコンバート時にパラメータの変換処理が入る。
VRM0との共存や、パラメータの保持方法を考える。
パラメータ変換 -> VRM10/MToon10/RuntimeMToon10Migrator.cs
Shift,Toonyの処理 -> VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_lighting_mtoon.hlsl
VRM1 Expression(旧BlendShapeGroup)
名前が変わっている。
排他情報が追加されている。
ローカル軸があるVRM1を読む
ローカル軸を利用できるようにする。
なお、公式サンプルのアリシア・ソリッド(VRM0版)にはローカル軸が無い。
検証用には別モデルを用意し、VRM1でエクスポートして利用する。
ローカル軸を破棄すると、VRM0と同じ状態になる。(厳密にはTスタンスがズレているかもしれないが)
VMCプロトコル対応も考慮する
(メモ)VRM1移行期はローカル軸破棄モードを利用しつつ、将来的にローカル軸保持モードを利用する という進行が良さそう。SpringBone,Constraintを素直に実装するために。
(未着手)Spring, Constraint
Spring、Constraint それぞれ情報はある。ただ、Constraintはドラフト。
検証アセットは無い。基本的なSpringBoneについては、アリシア・ソリッドのデータで確認できる。
(メモ)公式サンプルアセットが揃うまで 様子見かな…
現時点ではここまで。
Discussion