2013年01月一覧

MMDのデータをロードする(メモ)

MMDのデータ(PMDとVMD)をロードするということをやっていて、
今現在苦労中です。ここまでくるにも色々と気をつけなくてはいけない点がありました。防備録というかメモというか記しておきたいと思います。すごく今更ですが・・・。

座標系
データは左手座標系で格納されている。
右手座標系で処理している場合には、Z値の反転とポリゴン面の表裏が反転するので
その補正を行うこと。

親子構造に関して。
ボーンの親子構造においてローカル座標ではなくグローバル座標で位置が記録されている。よくあるモデルデータにおいてのローカルマトリクスは存在しないので、この位置と親の情報を使ってローカルマトリクスを生成する必要がある。
(親のワールドマトリクスと今求めたローカルマトリクスでの計算結果が、元々記録されていたグローバルでの位置と一致しないことがあるので注意が必要)
(スキニングメッシュの描画がおかしくなってこのことが発覚した。)

スキニングメッシュでの定番のバインド行列は回転が空のため、またボーン位置をグローバル座標で保持しているため簡単に求まる。

PMDデータは上記の性質により、頂点データをロードして単一のワールドマトリクスで描画させるとAスタンスのモデル形状として描画することが出来る。すごく簡単。

アニメーションについて。

アニメーションのデータはボーンの位置データと回転データを保持している。
ここまでは多くのデータと変わらないが、位置データは実はローカル座標でもグローバル座標でもなく、ローカルでのオフセット値が格納されている。
ネットで調べると親からの相対オフセットが格納されているということなので、これはすなわちローカル座標系でのオフセット値となるので、その情報と一致している。

足はIK(Inverse Kinematics)によって制御されるのでアニメーションのデータとしては
記録されていない。うまく動かすためには相当大変なようだ。


Catmull-Clarkのサブディビジョン

先日のmqoでの曲面のこともあり、DX11世代ではテセレーションによる曲面分割のこともありとで、ちょっとCatmull-Clarkのサブディビジョンを計算するようなコードを書いてみました。詳しい理論はさておき以下のように実装できました。

なめらかな曲面が出来てくるのでなかなか楽しいです。最初はテセレーションの部分ってほとんど興味が無かったのですが、今回のようにうまくいくと、これがシェーダーで出来るのか、と思うとますますDirectX11でやってみたいなと思うようになりました。

今回苦労した点は、データの持ち方と計算方法でしょうか。
リアルタイムレンダリングという書籍の計算式ではちょっとわかりにくくて、ネット上の他の参考情報を使わせて貰いました。

参考にしたページ

  • http://www.i-berry.ne.jp/~teratera/catmullclark.html
  • http://d.hatena.ne.jp/u_1roh/20060627/1151390713

とくに後者の式を簡単にしたほうを実装してみました。