2011/05/07

MMDからMDDを吐く

 ::Update (5月19日) MMDBridge Ver 0.41に対応(たぶん)

MMDBridgeというクールなソフトウェアが公開されている。

・MMDBridgeは、pythonからアクセスできるAPIを備えており、それを使用して、
  MikuMikuDanceが描画している頂点・法線・テクスチャデータなどにアクセスできます。
・つまり、1フレームごとにほぼ全てのジオメトリ情報を他のレンダラに引き渡すことが可能です。

とのことなので連続したフレームを頂点モーフィングとして書き出すスクリプト
を書いてみた。

このスクリプトについて

3DモデルをWavefront obj、頂点モーフィングをNewTek mdd形式のファイルにそれぞれ書き出します。

以下のファイルで構成されています。
  • preprocess_mdd.py
  • export_mdd.py
preprocess_mdd.pyはMMDBridgeのスクリプトです。描画フレームが呼び出されるたびに頂点情報を./tmp/pre.expmddに追加で記録します。

最初のフレームは./out/export_mdd.objと./out/export_mdd.mtlとテクスチャも書き出します。すでに同名のファイルがある場合は書き出さないので別のモデルに切り替えたときは注意。
(obj書き出し部のコードはmmdbridge_octane.pyから引用)

すべての描画が終わったらexport_mdd.pyで./tmp/pre.expmddを元に頂点モーフィング情報を./out/export_mdd.mddに書き出します。

export_mdd.pyはMMDBridgeのスクリプトではありません。pythonから直接、実行してください。


ダウンロード

https://gist.github.com/960168

ダウンロードしたファイルはtarとgzipでアーカイブされたファイルなのでそれらを解凍する手段がない場合は、downloadではなくexport_mdd.pypreprocess_mdd.pyの各ファイル名の右側のrawと書かれたリンクをクリックして生のテキストファイルをブラウザから保存してください。

使い方
(前提としてMMDBridgeのインストールと使い方をわかっていることを想定しています)
MikuMikuDance Ver 7.35とMMDBridge Ver 0.41とPython 3.2で動作を確認
  1. export_mdd.pypreprocess_mdd.pyをMikuMikuDanceのフォルダに置く。
  2.  MikuMikuDanceを起動してメニューのMMDBridgeのプラグイン設定を開き、使用するスクリプトをpreprocess_mdd.pyにする。
  3. すきなフレーム数分、モーションを書き出す or 再生する(スクリプトの呼び出しタイミングの設定による)。
  4. MMDBridgeでモーションをフックしたあとコマンドプロンプトで python export_mdd.pyとするかexport_mdd.pyをダブルクリックで開き、どのプログラムで開きますか?みたいなのでpython.exeを選択して実行する。
  5. カレントディレクトリのoutフォルダにexport_mdd.obj,export_mdd.mtlとテクスチャとexport_mdd.mddが保存される。
注意点

頂点モーフィングの特性上、毎フレームの頂点情報を./tmp/pre.expmddにテキストファイルとして書き出していくのでハードディスクの空き容量に注意してください。

動かない背景オブジェクトなども律儀にかきだすので描画フレーム数によっては数GBを楽に消費します。

最終的に書き出す./out/export_mdd.mddはバイナリファイルなのでそれより小さくなりますが気をつけて下さい(たぶん5分の一くらい)。メモリが少ないとmddファイルを3Dソフトなどで読み込めない場合があると思うので注意。
背景ぬきでモデル単体で描画したほうが無難。

頂点モーフィングなのでカメラワークなどは保存されない。カメラは削除したほうが無難。

途中でオブジェクト(頂点数)が増減するとモーフィングにならない。

スクリプトの呼び出しタイミングをAVI出力時に設定していてもフレーム操作でフレームを移動させるとMMDBridge(ver 0.3)がスクリプトを実行し始める(頂点情報などはなしで)。

その他

NewTek mddは頂点モーフィングの形式としては割と一般的(というかこれ以外あまりない?)
だと思うので3D統合環境ソフトなら扱えるかもしれない。

とりあえずBlender 2.49bでは動作確認済み。Blender 2.5.xではmddを読み込むとモデルが崩壊。2.49bでもモデルが反転するので書き出したmddの座標系とか変える必要があるのかもしれないが数学に弱いのでそういうことはわかりません。たぶん右手系と左手系を変えるだけだけど3Dソフトウェアによって違うとおもうので...。
2.5.xで読み込む場合は一度、2.49bで読み込んだあとblendファイルで保存し、それを2.5.xで読む 。


http://www.geocities.jp/higuchuu4/
https://sites.google.com/a/render.jp/mmdbridge/home
http://www.dstorm.co.jp/dsproducts/lw9/developers/Technical_Data/MDDFileFormat.html
http://www.ef9.com/ef9/PO1.5/LW/PointOven_lw.html