kumaryu日記
2009-01-20 お腹痛い
_ またお腹が
いつもながらお腹の調子が悪い。仕事のストレスかとも思うんだがスケジュールが決まったから、多少は和らぐかな。
土曜日はIGDAのスクリプト言語がなんちゃら…ゲームにおけるスクリプト言語の現状、と言うのを聞いてきた。
あんま、っつーか全然Rubyは出てこなかったけど。
でもパネラーの人にもRuby使ってる人とかはいたので、まあ実績が無いだけで人気ないことはないよね。
速度が特に重要らしい。GCの停止時間も痛いよね。
Luaはやっぱりあんま好きにはなれんなぁ。単純過ぎて。
Squirrelは調べてみたけど結構よさそうではあった。
しかし、ふと思ったんだけど、ゲームに組み込む言語としては速さとかメモリ使用量とか気になるけど、ツール作るにはライブラリとかが重要になるよね。
ツールも同じ言語で作ったりはしないんだろうか。俺はRubyゲーム作ったときにwxRubyでツールも作れてソース使いまわせて幸せでしたよ。
_ [COLLADA][Blender] BlenderでCOLLADA 1.4書き出し
BlenderのCOLLADA書き出し、アニメーション無しなら一応なんとかなった。
FX Composerで表示されないのはエフェクトのtransparencyが0.0になってたからだった。そりゃ表示されんよね。
なぜか1.0-alphaを書き出してたんだが、transparency=透明度、つまりtransparency=1.0=透明!と考えたんではなかろうか。
もちろんそんなのはCOLLADAの罠で、COLLADA 1.5の仕様書ではちゃっかりtransparency=alphaみたいな事が書いてあった。さすが1.4までの意味不明な仕様書はトラップ満載だぜ!
これで一応単純なメッシュの書き出しはおっけー。UVテクスチャをマテリアルとして書き出した分にはちゃんとテクスチャつきのバインドポーズモデルがFX Composerで読み込めた。
次にアニメーションを…と思ったが、とりあえずもうちょい簡単そうなPhysicsを。
で、超簡単なのを書き出したらあっさりうまくいったのでもういいや。また必要なときにちゃんと検証しよう。
ところでMacでいままで開発しつつWindowsマシンでFX Composerを使って読み込んでたんだが、面倒なのでCOLLADA RTを見に行ったら、丁度COLLADAViewerのMac版バイナリがアップされてたのでこれを使うことにした。
この選択が後に悲劇を呼ぶことになるとは知らずに…。
さてはて、問題はアニメーション。特にボーンアニメーションだね。
書き出してFX Composerに読み込んでも何故か再生されないことは確認してあるんだが、原因は不明。
ファイルをみてたら補間方法がベジェになってるのにIN_TANGENTとOUT_TANGENTがないですよ。本当はタンジェント計算するのが正しいんだろうけど、とりあえずLINEARで書き出し。
あ、FXComposerで再生できた。そういやこんな問題もあったっけ。
しかしうまくアニメーション自体はうまく出てないなぁ。
とりあえず簡単なデータで書き出してみてもさっぱりうまくいかない。つか描画とデータがなんか一致しないような。
skinのbind_shape_matrixを調べてたら、COLLADAではcolumn major matrix使うよ!って書いてあった。しかしデータに書かれているのはどうみてもrow major。これだー!!
COLLADAViewerで見てまだおかしい点はあるにせよ、あるていど想定できる描画になってた。
しかしBlenderの行列もcolumn majorだったとおもったんだけどなんでだろ、と思って書き出すところを見てみたらわざわざ転置して書き出してる…はて?
他の所も転置してるのでちゃんと仕様を読んでみたら、COLLADAではcolumn major使うけど、書き出すデータ上では人が読み易いようにrow majorだよ!とつづいてた…!!
え、じゃあなんで?とFXComposerで読んでみたらCOLLADAViewerでおかしかったデータが正しい描画に!
…COLLADAViewerがおかしいのかよ。ほんとCOLLADAやってると誰も信用できなくなってくるぜ…。
しかしこれで万事おっけーかと言うとそんなことは無く、回転の軸が全然あってない。
データを見てみると、予想通りアニメーションの出力がボーン座標系での出力になっている。
それをワールド座標系の回転としてそのままぶちこんでるから、そりゃまあ軸がおかしくなるわな。
これを直す方法は二つ。
- アニメーションをワールド座標系に変換して書き出す
- アニメーションはボーン座標系のまま、JOINTをワールド座標系に変換できるようにする
1は分かり易いからいいとして、2はBlenderのボーン計算と同じ事を実行時にやるイメージ。
データの再利用性から言うときっと2の方がよさそうな気がするのだがどうだろう。
1の方は実は既に実験用のコードが仕込まれているのを発見できた。2の方がいいけど既にあるならそれに越したことはないので有効にしてみた。が、上手くいかん。
アニメーションをワールド座標系に変換するのが上手くいってないね。ボーン座標系の変移値をそのままワールド座標系に変換しただけ。元のJOINTのボーン座標→ワールド座標変換行列を無視して変移の値を上書きするものだから変なことになる。
<node id="Bone" type="JOINT"> <rotate sid="rotateZ">0 0 1 90</rotate> <rotate sid="rotateY">0 1 0 30</rotate> <rotate sid="rotateX">1 0 0 0</rotate> </node>
このノードをY軸で回転したいときにX=0, Y=0, Z=0という値をぶちこむ感じ。せっかく初期値が入っててもCOLLADAのアニメーションは上書きしかできないので、それらはシカト。
こうすれば直るかも。
<node id="Bone" type="JOINT"> <rotate sid="rotateZ">0 0 1 0</rotate> <rotate sid="rotateY">0 1 0 0</rotate> <rotate sid="rotateX">1 0 0 0</rotate> <rotate>0 0 1 90</rotate> <rotate>0 1 0 30</rotate> <rotate>1 0 0 0</rotate> </node>
上の三つだけアニメーション対象。アニメーションの書き換え対象には値を入れないようにしておくのだ。
あー、でもここまでするならボーン座標系でアニメーションできるじゃない…。
<node id="Bone" type="JOINT"> <matrix>ボーン→ワールド座標行列</matrix> <rotate sid="rotateZ">0 0 1 0</rotate> <rotate sid="rotateY">0 1 0 0</rotate> <rotate sid="rotateX">1 0 0 0</rotate> </node>
うん、こっちの方がいいわ。
で、これでやったらボーン1つだけというアニメーションは上手くいったんだけど、やはり親子構造込みのボーンでは無理だった。でもまあ考え方は間違ってないと思うので、もう少しでなんとかなるかもね。
えーと、パッチ配布はもうちょっと待ってください。