VRMのバージョン(0.x/1.0)と変換について

前回のVRMモデルのセットアップの解説内では省略しましたが、今回はVRM 0.x/1.0のバージョンの違いと変換を含めた運用について説明します。

2018年に最初に発表されたVRM規格(「VRM 0.x」と呼ばれるもの)は、その後色々と見直しが行われながら、最終的に2022年に「VRM 1.0」として正式な規格になりました。ファイルの拡張子は「.vrm」のままですが、内部のデータ構造も大きく変化して互換性が失われた別物になっているため、VRM 0.xにしか対応していない古いアプリ・サービスではVRM 1.0のデータを読み書きすることができず、本記事執筆時点(2024年3月)でもVRM 1.0に対応したものはまだそれほど多くないようです。

VRM 0.x/1.0間では細かな差異まで含めると多数に登りますが、Metasequoia 4上で編集するにあたって注意が必要となる違いとして以下が挙げられます。

  • 前方向の定義
  • ばねボーンの構造
  • メタ情報

前方向の定義

VRM 1.0では同じく手前側(+Z軸方向)が前と定義されていますが、VRM 0.xでは奥側(-Z軸方向)が前と逆になっています。

手前側を前としてモデリングする人のほうが多数派と思いますが、その逆だと扱いづらいだけでなく、glTF標準の定義でも手前側が前のため、VRM 0.xはglTFをベースとしながら標準に反する問題のあるものでしたが、それが是正された形となっています。

VRM 0.xファイルの読み書き時に前方向を反転させることもできます。VRM 0.xモデルが前を向いている場合、出力時には必ず反転させてください。

VRMファイルを読み込む以外の方法で用意したVRM 0.x用モデルが既に前向きになっている場合、[視線情報]内にある[前方向反転済み]をオンにしてください。これをしないと、VRMプレイヤー内で正しい姿勢でアニメーション再生されません。

ばねボーンの構造

VRM 1.0では親子間で一続きにつながっているばねボーンを一つのグループとして扱います。グループ内の個々のばねボーンに対してパラメータを設定できます。

6つのグループにそれぞればねボーンが4つずつつながっている

VRM 0.xではグループごとに、(つながりの有無に関わらず)複数のばねボーンをまとめて管理していました。ばねボーンごとに、指定したボーンから末端のボーンまで(分岐を含む)をばね制御の対象とします。グループ内の各ばねボーンには共通のパラメータが適用されます。

同じグループ内に6つのばねボーンがある

VRM 1.0のほうが自由度は高いのですが、VRM 0.xのほうが簡便に設定できるため、好き嫌いがあるかもしれませんね。

メタ情報

著作権や各許諾などの情報を含むメタ情報は、VRM 0.x/1.0で共通になっている項目がある一方で、1.0では「政治・宗教用途の利用」や「反社会的・憎悪表現」などいくつか追加されています。また、0.xでは「商用利用」はOKかNGだけだったのが、1.0では個人のみ商用利用可(法人不可)も選択できるなど、より実用性の高い設定ができるようになっています。

0.xと1.0どちらを使うべき?

目的のアプリ・サービスが既にVRM 1.0に対応しているなら1.0用にデータを作成すればいいでしょう。しかし、まだ0.xにしか対応していないものへ持っていく可能性があるなら、0.xで作成すべきです。後で0.xから1.0へ変換することもできます。

VRM 0.xから1.0へのデータ移行

既にVRM 0.x向けに作成しているデータをVRM 1.0へ移行するには、以下の手順で操作してください。

  1. 「前方向を反転」をオンにしてVRMファイルを読み込みます。
    VRM形式ではなくmqozで保存している場合、いったんVRMファイルに出力してから、そのファイルを再度読み込んでください。
  2. 読み込み後、モデルが手前側を向いていることを確認してから、[VRM 1.0へ変換]を呼び出してください。[ボーン設定モード]が「VRM 1.0」に切り替わり、またばねボーンがVRM 1.0向けの構造に変換されます。
  3. メタ情報はVRM 0.x/1.0で共通の項目のみ引き継がれますが、それ以外の項目は設定し直す必要があります。必ずメタ情報の内容を確認し、適切に設定してください。

これでVRM 1.0への変換は完了です。VRMファイルを出力すると、VRM 1.0に対応したものが出来上がります。

表情モーフのうち「surprised」(驚き)に限ってはVRM 1.0のみに存在します。表情モーフ自体が必須ではないのですが、VRMデータを持っていく先のサービス等でsurprisedの表情を使用する場合は、[モーフ]コマンド内でプリセットを追加してください。

VRM 0.x/1.0両方の出力に対応した共通モデルを用意したい

複数のアプリ・サービスで同じVRMモデルを利用する際に、既に1.0に対応しているものとまだなものがあって、VRMのバージョンを分けて出力しないといけない場合に、出力元のデータを1.0と0.xで別々に管理するのは煩雑なので、できることなら共通化したいものです。

この場合、VRM 0.xを基本としつつも、下記項目を押さえておくことで同じデータからVRM 0.x/1.0の両方の出力を行うことができます。

  • 常に[ボーン編集モード]はVRM 0.xにして、ばねボーンなどを編集すること。
    うっかりVRM 1.0でばねボーンを追加してしまった場合は戻せないので消す。
  • 手前側を前にする。(VRM 0.xと逆、VRM 1.0と同じ)
    • 既に奥を向いているなら、「前方向を反転」をオンにしてVRMファイルを読み直す。
    • 前を向いている状態で、[視線情報]内にある[前方向反転済み]をオンにする。(VRM 0.xファイルを反転読み込みした場合は既にオンになっているはず)
  • メタ情報の編集時のみ[ボーン編集モード]をVRM 0.xと1.0で切り替えながら、それぞれ編集する。(共通しない項目の両方を保持することができる)

この状態でmqozを保存しておけば、いつでもVRM 0.x/1.0どちらにも出力が可能です。出力前に[VRMを検証]を呼び出して、問題がないことも確認しておきましょう。

表情モーフsurprisedについても、VRM 0.x向けの段階で用意して構いません。標準以外の表情モーフが含まれることは問題ありません。

VRM 0.xで出力する場合

[ボーン編集モード]をVRM 0.xにしてVRMファイルを出力しますが、その際に必ず「前方向を反転」をオンにしてください。

VRM 1.0で出力する場合

[VRM 1.0へ変換]してからVRMファイルを出力します。出力後にmqozファイルを上書き保存してしまうと戻せないので注意してください。