「 2013年02月 」一覧

続MMD(PMD,VMD)をロードして描画してみた


前回からまだ不足していた物理演算部分を実装してみましたが、どうにもうまく再現できない状況が続いています。
今まではデータが左手系で格納されているために右手系に変換してロード&描画していましたが、物理演算においてはこのあたりの変換で失敗しているのかもしれません。一度右手系で無変換の方法でやってみたほうがいいのかな・・・。

世間からはかなり遅れて始めたMMDロードでこんなに苦労するとは予想外です。

ちなみに実装というか物理演算のタイプはここを参考にしました。
http://d.hatena.ne.jp/ousttrue/20100424/1272126923


D3DXでERROR_MOD_NOT_FOUND


ある環境でプログラムを動かそうとしたら、D3DXAssembleShaderFromFile 関数で ERROR_MOD_NOT_FOUND というエラーコードが返ってきた!
こんなエラーは初めてで、エラーメッセージのログも何もなくとても困った・・・。

よくよく調べてみるとこのエラーは、必要なモジュール(DLL)がロードできなくてエラーとなったことを意味しており、今回の件も、確かに強引にプログラムを動かそうとしていたことが原因となっているようでした。
DirectX の再頒布ランタイムをインストールすれば問題は解決になりそうです。

追記

さらなる調査の結果、どうやらシェーダーコンパイラである D3DCompiler_XX.dll が見つからなかったために起こった模様。
これが原因だとすると、D3DXAssembleShader系だけでなく、D3DXCompileShader系やD3DXEffect系もおそらく同じようなエラーになるだろうと推測します。


MMD(PMD,VMD)をロードして描画してみた


ネット上の先人の情報からMMDのデータ(PMDとVMD)のデータをロードして、DirectX11を使って描画してみることに成功しました。
色々と厄介な点もありましたが、今のところなんとか動いているようです。

基本形状を出すまでは結構早くに実現できたのですが、モーションデータの再生にとても時間を食われました。
特に、足の部分のIK処理と表情についてのモーフィング処理、ですね。

足のIKについては、色々な人が既に試しているなかで、CCDによるIKをこちらも実装してみました。
若干足の曲げ具合や、パキパキと動いてしまう点がちょっとオリジナル挙動とかけ離れてしまうのですが、もう妥協してしまいました。

表情についても、全ての頂点データをCPUで処理して毎フレーム頂点バッファに転送!という方式だったらすごく楽なのですが、
有限のマトリックスパレットを想定してボーン分割処理が入っていたり、全頂点データは毎回送りたくないので、影響範囲だけにしたいなぁという思惑からちょっと厄介な感じになっていました。

↑この部分についてですが、
面データを走査して、表情モーフィングに関係する面かどうかで振り分け、その後マテリアルごとのデータに振り分け、念のためボーン分割処理を適用して、1回の描画データを構築しています。
この1回の描画データごとにとりあえずは頂点バッファを作成していますが、モーフ時にはここにCPU上で計算した表情データを注入しています。

MikuMikuDance付属のミクのデータと、http://ch.nicovideo.jp/azup で配布されていた、GO MY WAY!! のデータを、自分のプログラムで再生してみるとこんな感じに仕上がりました。

これから先は、物理の対応を入れて、スカートや髪の毛をヒラヒラでしょうか。

感想としては、毎回全頂点データを送るDirectX9世代のDrawPrimitiveUP を使うならば、MMDのデータって非常に楽に描画までたどり着けるようになっているなと思いました。ここを頂点バッファを使い出したり、ボーンを分割処理なんてことをやっていたりすると難しくなっていくように思いました。元のデータにある程度の想定をおけるなら、こんなややこしいことをしないに限りますね。


GitLab


GitLab 4.1が先日公開されました。この4.1がなかなか魅力的だったのでここで紹介したいと思います。

今までのGitLabは無料のGitHubで出来ない、プライベートなリポジトリを持つことを前提として、
公開リポジトリに関してはサポートしないという位置づけでした。
これが今回の4.1では、パブリックなリポジトリをGitLab上で管理できるように機能が拡張されました。

これすごく欲しかったんですよね・・・。2.4のころにサポートされていればこちらをじっくり検討したかもしれない・・・。

4.0ではCIまわりで手が入っているし、これはぼちぼち再チェックした方がよさそうな雰囲気を感じました。