kumaryu日記
2009-05-12 あつすぎ
_ 暑い!
家が暑いのはまだなんとかなるが、仕事場の暑さは異常。逃げ出すわけにもいかんし。
特に俺の周りでパワフルな熱源が活躍中ってのもあるが、いやほんとにひどいね。
そこそこ熱を持つ液晶モニターをこまめに消してみるが焼け石に水。
夏はこれからなんだが、なんとか考えないと…。
_ [COLLADA] COLLADA描画の仕方
COLLADA描画を再開しました。
COLLADAを描画するにはっ!
- まずscene要素を探します。
- え、無かった?
- おしまい
あれ、なんか違う。いや正しくはあるけど。
- まずscene要素を探します。
- scene要素のinstance_visual_sceneからvisual_sceneを探します。
- visual_sceneの子要素を辿ってひたすらインスタンス化します。インスタンス化とか気にしないなら気にしなくても可。とにかく参照を解決しまくればおk。
- nodeを辿って行列を計算します。
- シーンを辿って描画します。
- おしまい(次のフレームからは4以降を繰り返す)
これだけだね。COLLADA描画しようと気合いをいれたらこれだけだったのでちょっと拍子抜けしたわけだ。
アニメーションを入れるなら4の前で適用して、4で行列を再計算すればいいはず。
とりあえずスキニングとかモーフィングなんかのコントローラを考えなければ、COLLADA FXの難しいプロファイルを考えなければ、描画は簡単ですね。
それを考えなければCOLLADAいらんか。
_ [COLLADA] COLLADA FXは異常
で、次にアニメーションをやるか、マテリアルをやるかちょっと悩んだんだけど、色がついてないとちゃんと読めてんのか確認するのが大変なのでマテリアル。
しかしCOLLADA FXは大変だというのは分かってたんだがやはり大変だ。
ものすっごい自由度高い設計になってるので、これ全部対応なんてやってられん。
あとめんどい。diffuse要素の中のtexture要素がsampler2D要素を参照してそれの中のsource要素がsurface要素を参照してそれの中のinit_from要素がimage要素を参照してやっとイメージにたどり着きますよ。
つかsampler2Dのsource要素とか要素じゃなくて属性じゃダメだったんかい。
で、surface要素のinit_fromでimage要素を参照するとはかいてあるんだが、参照方法が謎過ぎる。
image要素はlibrary_images要素の下にしかつかない。それを遠くから参照してくるんだから普通に考えればurl。しかし仕様書を見てもなんとも書いておらず、サンプルを見るとimage要素のidが指定されている。
しかしライブラリ内の要素のidをぽろっと参照するのはCOLLADAでは反則だ。ライブラリは他のファイルにあるかもしれないのでそれの参照、つまりurlになってるのが正当なはず。
あれ、imageはlibrary_imagesにしかくっつかないと思ったけど確認したらそんなことないな。エフェクト内のいろんなところにくっつく。うーん、library_imagesの存在意義が危ういんですけど。
結局surfaceのinit_fromに指定できるのは何なのよとスキーマまで調べたらIDREF。やっぱりidをぽろっと指定するのが正しいらしい。
ただ問題はIDREFが出てくるのはCOLLADAのスキーマ中でこのsurfaceのinit_*だけ。それ以外の場所ではIDREFなんざ全く使われておりませぬ。明らかに設計ミスだろ!
1.4.1じゃなくて1.5の仕様書はどうかと見たら全然別物になってやがった。
surfaceはなくなっててimageに機能統合。sampler2Dにはinstance_image要素がくっつくようになってて、ちゃんとurlで参照するようになっていました。もちろんimageはlibrary_imagesにしか入りません。ぐう、しれっと直しやがって。
じゃあ1.5を読み込むようにしよう!と、言いたいところではあるが、1.5を吐くアプリケーションなんて見たことないよ。もちろんBlenderからも吐けないし、そこまでエクスポータに手を入れたくないよ。
というわけで1.4.1でなんとかするしかない。まあ適当にimageをidで検索かけるだけなので簡単にできるんだが、ここだけの処理なので気持ち悪いだけです。
あとbind_materialでのparamとかinstance_materialでのbindとか自由度高すぎね?こんなのまじめに処理できなくね?うわーん。
まあ所詮中間フォーマットだし、COLLADAの編集をしたいわけでないし、必要なところだけ対応するのが正しいんだろうけどね。
そんなこんなでなんとかテクスチャを超適当に読み込んで表示できた。本当に適当なのでテクスチャ座標が2つ以上あるとまずいとか、lambertといいつつ全然シェーディングしてないっつーかdiffuseにテクスチャ張ってあるのにしか対応してないとかものすごい問題あるんだが、とりあえず俺が今必要な機能くらいはできたのでひとまず満足。
あとはアニメーションとスキニングだなぁ。skinの読み込み自体はできてるのでスキニングのコードを書かないと。
アニメーションはノードの変形以外いじらなければまあなんとかなるだろ。