2014年02月24日

MMDBridgeのテスト

気がついたら2月が終わろうとしているとかどういうことなのでしょうか…。
ボリュームレンダリングはぼちぼち進めていますが、今回は息抜き?です。

レンダリングのテストにPMD/PMXモデルを使用させていただいているのですが、これまでほぼずっと初期ポーズのみでしたので、そろそろ違う姿勢にもしたくなってきました。

ボーンアニメーションは実装していましたが、ボーンを動かすと物理演算をしないと悲しいことになってしまいます。また、IKもMMDと違う動きになってしまうことも多いので、自分で実装するのは大変です。

そこで今回は、以前から気になっていたMMDBridge[1]を使用させていただくことにしました。ちゃんとした外部レンダラ用のようですので、自分でレンダリングするときに使っていいのか良くわかりませんので、もし問題があればお知らせください。

手順
(1) [1]からMMDBridgeをダウンロード、説明を見ながら準備
(2) 作者様のobjファイル出力のサンプルpyを、VBOで使う頂点座標と法線座標をバイナリで出力するように改変
(3) MMDで動画及びデータ出力
(4) 自分のプログラムでボーンアニメーションの代わりに上記データを読み込んでVBOにコピー

今回作成したpyは以下のようなものです。といってもほぼサンプルを削っただけになります。
mmdbridge_vbo.py
モデルの種類がわかっていること前提で、自作プログラムで読み込んでおいて、頂点と法線ベクトルだけMMDBridge経由でいただく、ということになります。

MMDは、あぴミクさんと、[2]のモーションを使用させていただきました。

VBOは、下記のような感じで、GL_DYNAMIC_DRAWで作ったVBOのポインタを取得して、ファイルから読込んだデータを叩き込むだけです。(以下はエラー処理などかなり削っています)
  // 頂点データを指定する
glBindBufferARB(GL_ARRAY_BUFFER_ARB, VboId[0]);
// VBOの動的ポインタを取得
float *ptr = (float*)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_READ_WRITE_ARB);
if (ptr)
{
sprintf_s(filename, 256, "%s/%05d.obj", outFolder, (int)frame);
FILE *fp = fopen(filename, "rb");
int modelnum, vnum;
// モデル数
fread(&modelnum, sizeof(int), 1, fp);
// 頂点数
fread(&vnum, sizeof(int), 1, fp);
// 頂点座標をptrに直接読み込む
fread(ptr, sizeof(float)*vnum*3, 1, fp);
// VBOのマッピングを解除
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
// 法線ベクトル
glBindBufferARB(GL_ARRAY_BUFFER_ARB, VboId[1]);
ptr = (float*)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_READ_WRITE_ARB);
if (ptr)
{
// 法線ベクトルをptrに直接読み込む
fread(ptr, sizeof(float)*vnum*3, 1, fp);
// VBOのマッピングを解除
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
}
fclose(fp);
// フレームを進める
frame+=delta;
if ((int)frame > endFrame)
{
frame = startFrame;
}
}
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);


実行結果
MMDで作るよりひどくなっていますが、ただのテストということでご了承ください。

[1] MMDBridge
[2] 【MMD】Sweet Devilトレース完成&モーション配布
web拍手 by FC2
posted by シンドラー at 22:27 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。