【ゲーム制作】No.13: VPDファイルの読み込みと描画(Direct3D11)
今回はMMDファイル関連であるVPDファイルの読み込みと描画になります。
MMDファイルでいうと、モデル(PMDファイル/PMXファイル)、モーション(VMDファイル)、ポーズ(VPDファイル)の中で
三番目のポーズ機能(VPDファイル)になります。
①VPDファイルの読み込み(VPDパーサー)の実装
VPDファイル読み込みの為のVPDパーサーは今回新規に作りました。
設計はstd::wifstreamの標準C++ストリームとstd::getline()による1行読み出しによる
標準なもの。トータル400行ぐらいでした。
途中のトラブルは文字化けが出たぐらい。
理由はわかってないですけど、以下の1行で治りました。
std::wifstream ifs;
ifs.open( vpd_file_name, std::ios::in | std::ios::binary);
ifs.imbue(std::locale("", LC_CTYPE)); // これを入れないと文字化けになる
②VPDファイルの描画
結論からいうと、VPDファイルの実装はまったくありませんでした。
元々PMXファイルへの描画機能とVMDファイルによるモーションは
既に実装済みだった為、そこにVPDファイルを変換することで描画は出来ました。
図でいうと以下のような形です。
①VMD描画 VMDファイル → VMDパーサー(既存)→ モーション管理クラス(pmx_motion_t) → D3D描画クラス → 描画
②VPD描画 VPDファイル → VPDパーサー(新規) → モーション管理クラス(pmx_motion_t) → D3D描画クラス → 描画
自分のようにPMXファイルによる描画とVMDファイルによるモーションが既に
実装済みだったなら、MMDなどのアプリでVPDファイルからVMDファイルに変換し、
VMDファイルでポーズ画像を描画することでも実装無しで実装可能です。
③VPDファイルの仕様
VPDファイルの描画をするにあたってVPDファイルの仕様やフォーマットを
いろいろ調査したのですが、それらしき情報がまったく無くて
これが一番苦労しました。
MMDはとても素晴らしいものですが、仕様となると途端に無くなる。
勝手にやれの一点張り。こういうところが弱点だなぁと思いました。
VPDファイルは基本的に以下の繰り返しですが、
Bone1{上半身
0.000000,0.000000,0.000000; // trans x,y,z
0.088801,0.153755,0.013875,0.984011; // Quaternion x,y,z,w
}
// 以下これが続く・・
「Vaporlock V1.00.zip」の「球体ポーズ.vpd」には、
Morph0{まばたき
1;
}
のようなブロックもあります。
グループモーフが最も近いですが、仕様がわからず・・
また「Vaporlock V1.00.zip」ですが、
readmeには「そぼろ様のAutoLuminusに対応しており・・」とありますが
詳細がわからない・・発光する機能だろうけど・・
④画像比較
以下MMDと自作のポーズ画像の比較になります。
MMD側は「MikuMikuDance_v926x64」「自作」
モデルは「初音ミク イミテーションv1ミニマム2.pmx」「Vaporlock V1.00t.pmx」
ポーズは順に「miku.vpd(sm18628875)」「四脚ポーズ.vpd(Vaporlock V1.00)」「球体ポーズ.vpd(Vaporlock V1.00)」