テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル


log

2009.11.14 C++:スキンメッシュ読み込みまであと少し!

ファイル 205-1.jpg

ある程度きれいにモーションが読み込めるようになりました。
モーション読み込みに、ある程度も糞もあるかい!って云いたくなりますが笑。

とりあえず分かったことを以下にメモしてみます。

XファイルはAnimation Keyの中にフレーム(骨)のモーション量を
格納していて。Keyの種類は全部で4種類あり、
Key Typeが0だと回転、1だとスケール、2だと移動、
3だと行列をそれぞれ格納しているのですが。回転の要素が特別な値を
格納していたので、どう使用していいのか今まで全く分からなかったのです。

スケール・移動は要素数が3つ、行列は要素数が16なので
それぞれX,Y,Zと行列の中身を格納しているんだなというのが
分かったのですが。回転の要素数は、なんと"4つ"なのです。

3Dをやっている方ならピンと来るのだと思いますが、こいつはX,Y,Z値を
そのまま格納している訳ではなくて、4元数つまりクォータニオン
というものを格納しているらしいです。

クォータニオンについて今まで全く勉強してこなかったので、
それはもう悪戦苦闘することになりました。。

結論を先にいってしまうと、
回転のAnimation Key要素は、おそらく先頭から順番に
Quaternion.w、Quaternion.x~zの要素を格納しているようです。
そのクォータニオンをD3DXMatrixRotationQuaternionで行列に
変換してしまえば他と同じように行列で統一できます。


これでとりあえず回転の処理は完成しましたが、なんだか
頭の頂点が後ろに引っ張られてしまってます(画像参照)。
まぁ、これはDirectX標準ビュアーでもこうなっていたので
おそらく単なるウェイトの設定ミスだろうと思います。

後は背景はアニメーション頂点バッファを生成していない為、描画できて
いないので、アニメーション有り無しで描画処理を切り替えれば完成!

そういえば、いままでC++はHSPと比べて軽い軽いと謳ってましたが、
モーション処理を考慮に入れることをすっかり忘れておりました。。
(HSP+E3Dの作者・ユーザーさんごめんなさい。)

モーション処理を考慮にいれると描画毎に頂点バッファを書き換えて、
ビデオメモリにバッファを転送しなければならないので、
それなりに処理が重くなりそうです。

あらかじめアニメーション分の頂点バッファをビデオメモリに
格納するという手もありそうですが。。それだとモーション補間できないからなあ。
けど、噂ではベイグラントストーリーはモーションの指定フレームだけ
あらかじめ作成しておいたモデルに差し替えることで
処理速度とクオリティを向上させていたんだそうな。

なるほど、少しだけやってみる価値がありそうだ。

2009.11.14 C++:モーションって…何だ

最近は長いことモーション読み込みと格闘しているのですが、
どうも一向に解決しそうにない感じです…。

動かすことには成功し、手足の伸びも解消できたのですが、
手足がなぜかばらばらな方向に回転してしまいます。
行列の設定がおかしいんでしょうけど、よく分からないのです。

それになぜか体の後ろの頂点だけ後ろにぐにょーんと
引っ張られてるという問題も発覚しました。
はじめは単なるウェイト設定ミスかと思ってましたが、
モデルを変えてみても同じでした。。

オフセット行列てなんだ…。クオータニオンてなんだ。
もはや分からないことが分からない状態!!