🚀

VRMローダ を VRM1.0 に対応する道のり(途中)

2022/02/16に公開

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時点)

UniVRM
公式サンプル コンバート元のVRM0


以下、対応順にメモなど。

VRM0 を glTF2の機能付きでエクスポート、読む

ローダがglTF2.0を読めるか確認する。
VRM0を「UseSparseAccessor」と「DivideVertexBuffer」をONでエクスポートし、読み込みテストする。
ローダがSparseAccessor に未対応だとExpression(顔アニメとか)が正しく読めない。

VRM1 glTFとして読む

正面向きが変わっている。VRM0との共存方法を考える。

VRM1の正面方向

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)

名前が変わっている。
排他情報が追加されている。

Expression

ローカル軸があるVRM1を読む

ローカル軸を利用できるようにする。
なお、公式サンプルのアリシア・ソリッド(VRM0版)にはローカル軸が無い。
検証用には別モデルを用意し、VRM1でエクスポートして利用する。
ローカル軸を破棄すると、VRM0と同じ状態になる。(厳密にはTスタンスがズレているかもしれないが)
VMCプロトコル対応も考慮する

(メモ)VRM1移行期はローカル軸破棄モードを利用しつつ、将来的にローカル軸保持モードを利用する という進行が良さそう。SpringBone,Constraintを素直に実装するために。

(未着手)Spring, Constraint

Spring、Constraint それぞれ情報はある。ただ、Constraintはドラフト。
検証アセットは無い。基本的なSpringBoneについては、アリシア・ソリッドのデータで確認できる。

(メモ)公式サンプルアセットが揃うまで 様子見かな…

現時点ではここまで。

Discussion