「 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

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


mqo形式の読み込みにチャレンジ

2013年、あけましておめでとうございます。
今年はDirectX11世代(OpenGL含む)の勉強をしておかないとな、と思っています。

そんな2013年1つめのネタとして、メタセコイアのモデル形式mqoを読み込んで描画してみるということをやってみました。
mqoはファイルフォーマットが公開されていますし、単に形状を出すならそんなに難しいことはないと思います。

それでも苦労した点としては、以下の点です。

  • 各頂点の法線データがなく、自前で計算しなくてはならない。
  • 頂点カラーやUVが頂点に入っていても実際に描画に使うかどうかはまた別の判定が必要
  • 曲面については諦めた。
  • 公式ページのファイルフォーマットの説明に即してないファイルがある。テクスチャのパスとか平気で64バイト以上の文字列が入っている

そのほか、自分の勉強のために DirectX11で描画部分を作成してみました。

メタセコイアに含まれているモデルの”kame.mqo”を曲面フリーズして、描画させてみたところこんな感じです。
読み込めているかどうかの確認がしたかったので、ライティングは適当にLambertで描画しています。
元々のマテリアル設定はPhongでしたが・・・。

他にもキャラクター物とかもテストしてみましたが、うまく読み込めています。
ただ、曲面のフリーズが大変なので、Cutmul曲面には対応しておいた方がいいのかなと思いました。