VMDとVPDの概要
このセクションでは、VMDとVPDファイルがどのような情報で構成されているか、MMDがその情報をどのように解釈するか、 そしてbabylon-mmdがどのようにMMDの挙動を実装しているかについて説明します。
このドキュメントでは、babylon-mmdがMMDの挙動をどのように実装しているかに関する内容はこのブロックで区別されています。
VMD/VPDファイルの概要
VMD(Vocaloid Motion Data)とVPD(Vocaloid Pose Data)ファイルは、MMD(MikuMikuDance)で使用されるアニメーションデータフォーマットです。
これらのファイルは、それぞれMMDモデルのモーションとポーズの情報を保存するために使用されます。
これらのファイル形式にはドキュメント化された仕様がないため、リバースエンジニアリング分析によって知られている情報のみが存在し、多少の誤りがある可能性があります。
また、各情報に対する公式名称がないため、 このドキュメントでは説明のために各情報に一般的な名称を任意に割り当てています。
VMDファイル
VMDファイルはMMDモデルのボーン、モーフ、セルフシャドウ、プロパティのアニメーションデータを保存します。
また、カメラやライト情報など、モデル自体に紐づいていないアニメーションデータも保存します。
VPDファイル
VPDファイルは、バインドする対象(ボーンまたはモーフ)の名前と、それらの対象の現在の状態(ポーズ)を保存します。
VMDと異なり、VPDはMMDモデルのボーンとモーフの状態のみを保存し、カメラ、ライト、セルフシャドウ、プロパティのキーフレームは含みません。
モーフ情報に関しては、MMD自体はVPDにおけるモーフデータの処理をサポートしていません。VPDにモーフデータを保存するのは**MMM(MikuMikuMoving)**によって提供される拡張機能です。
MMDはVPDファイル内のモーフデータの処理をサポートしていませんが、MMMとBlender MMD ToolsはVPDにモーフ情報を保存する仕様をサポートしています。
MMD自体がサポートしていなくても、MMD互換ソフトウェアがサポートしているため、babylon-mmdもVPDファイル内のモーフデータを読み取り処理します。
babylon-mmdはVPDを1フレームのアニメーションとして扱い、VMDファイルとVPDファイルを同じ方法で処理します。
VMDファイル構造と解析方法
VMDファイルは様々なデータタイプを含むリトルエンディアンのバイナリファイルです。
データは一般的な長さプレフィックス形式で構成されています。例えば、ボーンキーフレームデータを表現する場合、 まずキーフレームの数が示され、その後に各ボーンキーフレームの情報が順次リストされます。 各データのサイズは固定長または可変長で、データの順序は常に同じです。
データのアライメントは強制されず、各フィールドはバイナリファイル内に連続して格納されます。
VMDファイルには明示的なバージョンがヘッダーに含まれていません。 代わりに、データはボーン、モーフ、カメラ、ライト、セルフシャドウ、プロパティキーフレームの順に表示され、 古いバージョンでは、この順序で後に来るキーフレームセクションが省略されている場合があります。
例えば、WAVEFILE fullver. モーションにはプロパティキーフレームが含まれていません。
VPDファイル構造と解析方法
VPDファイルはShift_JISエンコーディングで保存されたプレーンテキストファイルです。
以下はボーンとモーフキーフレームを含むVPDファイルの例です。
Vocaloid Pose Data file
YYB式初音ミク_10th_v1.02.osm; // 親ファイル名
4; // 総ポーズボーン数
Bone0{右腕捩
0.000000,0.000000,0.000000; // trans x,y,z
-0.000000,-0.000000,0.000000,1.000000; // Quaternion x,y,z,w
}
Bone1{右ひじ
0.000000,0.000000,0.000000; // trans x,y,z
0.176789,-0.061290,0.747712,0.637114; // Quaternion x,y,z,w
}
Bone2{右手捩
0.000000,0.000000,0.000000; // trans x,y,z
-0.000000,-0.000000,-0.000000,1.000000; // Quaternion x,y,z,w
}
Bone3{右手首
0.000000,0.000000,0.000000; // trans x,y,z
-0.574374,-0.615622,0.113957,0.527368; // Quaternion x,y,z,w
}
Morph0{う
0.200000;
}
Morph1{え
0;
}
4行目の4;
はボーン状態の数を示しています。MMDはちょうどその数のボーンエントリを読み込み、それ以降の情報は無視します。
そのため、モーフ状態情報を含むMMM拡張では、常にモーフ状態情報をボーン状態情報の後に配置します。
VPDファイルを処理するために、babylon-mmdはレキサーベースのトークン化アプローチを使用しています。
テキストベースのフォーマットであるため、様々なエッジケースを柔軟に処理できるように設計されています。
ヘッダー
VMDとVPDファイルのヘッダーにはモデル名が含まれています。
MMDがアニメーションをエクスポートする際、アニメーションが適用されたモデルの名前をヘッダーに保存します。
この名前は後でMMDがアニメーションをモデルにバインドする際に、バインド対象がアニメーションがエクスポートされたモデルと一致するかどうかをチェックするために使用されます。
しかし、テキストエンコーディングの問題とモデル名の保存の長さ制限(VMDでは20バイト、VPDでは制限なし)のため、実際にはこのメカニズムは確実に機能しません。
モデル名が実質的に機能していないため、babylon-mmdは解析中にそれを無視してスキップします。
VMDファイルはカメラアニメーションまたは3Dモデルアニメーションのいずれかを保存できます。
カメラアニメーションを保存する場合、モデル名は「カメラ・照明」に設定され、モデルアニメーションを保存する場合はモデルの名前に設定されます。
- アニメーションを読み込む際、MMDがモデル名「カメラ・照明」を読み込むと、それをカメラアニメーションとして扱い、モデルへの適用を許可しません。
- モデル名がモデルの名前に設定されている場合、MMDはカメラへの適用を許可せず、モデルに適用する際に名前が一致するかどうかをチェックします。 一致しない場合、MMDはアニメーションを適用する前に警告を出力します。前述のように、エンコーディングの違いとモデル名の長さ制限により、この機能は同じモデルからエクスポートされたアニメーションでも誤動作する可能性があります。
VPDファイルでは、ヘッダーはボーンポーズエントリの数を指定していますが、babylon-mmdはこれを無視し、見つけられるすべてのボーンポーズ情報を解析します。
できるだけ許容的であることで、多くの異なるソースからのVPDファイルを処理できるようになります。
VMDの仕様ではカメラと3Dモデルアニメーションの両方を一緒に保存できますが、モデル名の検証プロセスにより、最終的にはカメラまたは3Dモデルアニメーションのいずれかにバインドが制限され、両方には適用できません。
しかし、babylon-mmdはVMDファイルを読み込む際にモデル名を無視するため、カメラアニメーションと3Dモデルアニメーションの両方を含むVMDファイルを読み込み、両方を適用できます。
このメカニズムは、後で紹介するVMDの最適化フォーマットであるBVMDにも適用されます。
ボーンキーフレーム
VMDファイルはMMDモデルのボーンキーフレームを保存します。ボーンキーフレームはモデル内のボーンの動きを定義し、具体的には各キーフレームにはバインドされたボーンの名前、位置、回転などが含まれます。
VMDファイル内のボーンキーフレームには以下が含まれます:
- ボーン名:キーフレームが適用されるボーンの名前。
- フレーム番号:キーフレームが適用されるフレームのインデックス。
- 位置:ボーンの移動(x, y, z)。
- 回転:クォータニオンとしてのボーンの回転(x, y, z, w)。
- 補間:ベジェ曲線パラメータ(位置 x, y, z および回転(slerp t に適用される)について、それぞれ2つの制御点ベクトルで表される)。
- 物理トグル:ボーンに物理が適用されるかどうかを示すフラグ。
VMDファイルでは、ボーン名は15バイトに制限されており、より長いボーン名は切り捨てられます。
そのため、15バイトを超える名前を持つボーンのアニメーションはVMDファイルに保存されますが、再読み込み時に正しくバインドされません。
物理ボーンをVMDアニメーションにベイクして読み込む際、物理ボーンの名前が15バイトを超えるためにバインドが失敗することがよくあります。
VPDファイルはボーン名とその現在の**状態(位置、回転)**のみを保存します。
モーフキーフレーム
VMDファイルはモーフキーフレームを保存します。モーフキーフレームはMMDモデルのモーフの状態を定義し、各キーフレームにはモーフの名前とその値が含まれます。
VMDファイル内のモーフキーフレームには以下が含まれます:
- モーフ名:キーフレームが適用されるモーフの名前。
- フレーム番号:キーフレームが適用されるフレームのインデックス。
- 値:モーフの値(0.0から1.0)。
VMDファイルでは、モーフ名も15バイトに制限されており、より長いモーフ名は切り捨てられます。
しかし、MMDモデルのモーフ名は一般的にボーン名より短いため、長いモーフ名によりバインドが失敗することはまれです。
VPDファイルにモーフの状態を保存することは、MMMの拡張機能であり、MMDによって処理されません。
VPDファイルはモーフの名前とその現在の**状態(値)**を保存します。
babylon-mmdはVPDファイルからモーフの状態を読み取り処理することをサポートしています。
カメラキーフレーム
VMDファイルはカメラキーフレームを保存します。カメラキーフレームには、カメラの位置、回転、視野角などの情報が含まれます。
MMDにはシーン内に1つのカメラしかないため、カメラキーフレームにはバインド対象に関する情報は含まれていません。
MMDのカメラはオービットカメラとして動作し、中心位置を中心に回転します。
VMDファイル内のカメラキーフレームには以下が含まれます:
- フレーム番号:キーフレームが適用されるフレームのインデックス。
- 距離:カメラから中心(カメラの軌道の中心)までの距離。
- 位置:カメラの中心位置(x, y, z)。
- 回転:ヨー、ピッチ、ロールとしてのカメラの回転(x, y, z)。
- 補間:ベジェ曲線パラメータ(距離、位置 x, y, z、回転 x, y, z および視野角について、それぞれ2つの制御点ベクトルで表される)。
- 視野角:視野角(度単位)。
- 投影タイプ:投影タイプ(カメラがパースペクティブかオルソグラフィックか)。
babylon-mmdはパースペクティブ投影のみをサポートしています。
オルソグラフィック投影のサポートは、要望があれば将来追加される可能性があります。存在しない理由は単に、オルソグラフィック投影がほとんど使用されないからです。
VPDファイルはカメラキーフレームの保存をサポートしていません。
ライトキーフレーム
VMDファイルはライトキーフレームを保存します。ライトキーフレームには、ライトの方向と色に関する情報が含まれます。
MMDにはシーン内に1つのディレクショナルライトしかないため、ライトキーフレームにはバインド対象に関する情報は含まれていません。
一般的に、ライトキーフレームはほとんど使用されません。
現代の3Dレンダリングエンジンは、通常、単一の固定ライトではなく、複数のライトを使用します。
3DレンダリングエンジンとMMDのシェーディング方法の違いにより、babylon-mmdはライトキーフレームをサポートしていません。
これは技術的に実装が不可能というわけではなく、単一ライトモデルが現代のアプリケーションで使用されていないためです。
ライトキーフレームのサポートは、要望があれば将来追加される可能性があります。
VPDファイルはライトキーフレームの保存をサポートしていません。
セルフシャドウキーフレーム
VMDファイルはセルフシャドウキーフレームを保存します。セルフシャドウキーフレームには、MMDモデルが自身の影をどのように生成するかに関する情報が含まれています。
これはほとんど使用されない機能です。
babylon-mmdはセルフシャドウキーフレームをサポートしていません。
セルフシャドウキーフレームのサポートは、要望があれば将来追加される可能性があります。
VPDファイルはセルフシャドウキーフレームの保存をサポートしていません。
プロパティキーフレーム
VMDファイルはプロパティキーフレームを保存します。プロパティキーフレームにはMMDモデルの可視性とIKボーンの有効状態が含まれます。
VMDファイル内のプロパティキーフレームには以下の情報が含まれます:
- フレーム番号:キーフレームが適用されるフレームのインデックス。
- 可視:モデルが可視かどうか(true/false)。
- IK有効テーブル:モデルの各IKボーンの有効状態(true/false)。
VPDファイルはプロパティキーフレームの保存をサポートしていません。