Gポイントポイ活 Amazon Yahoo 楽天

無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!

log

2011.03.11 C++:LWS読み込み

ファイル 337-1.jpg

LWSファイルからのモーション読み込みがある程度出来てきたので、さっそく
新しいモデルの方をプログラム上に読み込んでみました。
毎度のことながら、とても試行錯誤することになりましたが、実装できて本当に
よかったです。デバッグで画面が立ち上がる前の「うまくいくかな?それともまた
失敗だろか?」っていうもやもやの中でうまくいったときの喜びは大きかったでした。

それで、今回は何に苦戦したかといえば。今までウェブ上で調べていたらLWの
回転順序はY-X-Zだと書かれていたので、そうとばかり考えていたのですが、
実はそうではないんですよね。確かにレイアウト上ではY軸を動かせば他の2軸も
拘束しているように見えるし、Z軸を動かしても他の2軸は動かないので、Y-X-Z順
に回転しているんだなと思うのが普通なのですが、プログラム上での実際の回転
順序はZ-X-Yなんです、これが。

それで、回転順序は合っているとばかり思っていた上にスキニング後の位置が
ボーンの長さよりも長くなったりしていたので、オフセット情報がおかしいのだろう
とばかり考えていて、結局無駄な時間を過ごしてしまいました。どうやらスキニング
の場合は回転と平行移動の行列を交互に掛け合わせるので、回転順序が違うだけ
で親空間からの距離も変わるみたいですね。

それと後になってから色々と考えてみましたが。結局Z-X-Y回転なのにGUI上では
Y-X-Z回転のように見える謎がよく分からずに終わりました。例えるなら天動説と
地動説のように、地球からみれば太陽は地球を中心に回って見えるけど太陽から
みれば地球は太陽を中心に回って見えるような感じで、相対的に逆転してみえる
ものなのかな、と。なんともあやふやな答えしか出せませんでしたが、いずれ分かる
ようになったらまたそのときにでもメモしようかと思います。

そういえば、実装してみて思いましたが。モーション情報が読み書きできるように
なったので、モーションファイルのコンバータが作れそうだなと思いました。
現状だとBVH、DAE、VMD当たりのフォーマットについてはある程度把握できて
いるので、機会があれば実装しようかなと考え中です。昔の自分だったら、
フォーマット調べても「何コレ?分からん。。」で終わっていたのですが。それなりに
成長したのかもしれないな。