【ゲーム制作】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)」