ネット上の先人の情報からMMDのデータ(PMDとVMD)のデータをロードして、DirectX11を使って描画してみることに成功しました。
色々と厄介な点もありましたが、今のところなんとか動いているようです。
基本形状を出すまでは結構早くに実現できたのですが、モーションデータの再生にとても時間を食われました。
特に、足の部分のIK処理と表情についてのモーフィング処理、ですね。
足のIKについては、色々な人が既に試しているなかで、CCDによるIKをこちらも実装してみました。
若干足の曲げ具合や、パキパキと動いてしまう点がちょっとオリジナル挙動とかけ離れてしまうのですが、もう妥協してしまいました。
表情についても、全ての頂点データをCPUで処理して毎フレーム頂点バッファに転送!という方式だったらすごく楽なのですが、
有限のマトリックスパレットを想定してボーン分割処理が入っていたり、全頂点データは毎回送りたくないので、影響範囲だけにしたいなぁという思惑からちょっと厄介な感じになっていました。
↑この部分についてですが、
面データを走査して、表情モーフィングに関係する面かどうかで振り分け、その後マテリアルごとのデータに振り分け、念のためボーン分割処理を適用して、1回の描画データを構築しています。
この1回の描画データごとにとりあえずは頂点バッファを作成していますが、モーフ時にはここにCPU上で計算した表情データを注入しています。
MikuMikuDance付属のミクのデータと、http://ch.nicovideo.jp/azup で配布されていた、GO MY WAY!! のデータを、自分のプログラムで再生してみるとこんな感じに仕上がりました。
これから先は、物理の対応を入れて、スカートや髪の毛をヒラヒラでしょうか。
感想としては、毎回全頂点データを送るDirectX9世代のDrawPrimitiveUP を使うならば、MMDのデータって非常に楽に描画までたどり着けるようになっているなと思いました。ここを頂点バッファを使い出したり、ボーンを分割処理なんてことをやっていたりすると難しくなっていくように思いました。元のデータにある程度の想定をおけるなら、こんなややこしいことをしないに限りますね。
コメント