ふと
COLLADAでも読んでやるかと思った。XMLパーサ書くの面倒だなと調べたら
COLLADA DOMていう専用のパーサがありましたと。
バカでかいのはこの際いいとしても、初見じゃビルドできないときた。
グーグル先生に聞いたら
素敵なサイトを教えてくれた。
v1.5という形式がどうやら最新の形式であることが判明。
というわけでこの環境を構築したわけだが・・・。
試しにネットから拾ってきたCOLLADAファイル(*.dae)をロードしてみる。
すると、ロードエラーで躓くときた。
原因はどうもDOMのバージョンとCOLLADAファイルのバージョンに差異があるということで
これで弾かれているらしい。
なんてこった!
そこでDOMを騙してやる作戦としてCOLLADAファイルのバージョンを変更してみた。
ロードは成功したが、特定のエレメント名に対するオブジェクトが生成されないと警告が出る。
仕方ないのでv1.4の環境を用意することにした・・・。
というのもお手軽にファイルを入手できる
Google 3Dギャラリーで何ファイルか摘んでみると
どれもv1.4だったからという・・・。
ただ、DOMをv1.4、ファイルをv1.4にしても警告が完全に無くならないファイルもあるわけだが。
見なかったことにしよう。
で、とりあえず見ているわけだが、<geometry><mesh>~</mesh></geometry>内部にある
<source>~</source>
最大でも位置、法線、テクスチャ座標、色が入るということだろう(最低は1)。
疑問点は、
(1)並び順
固定?
数少ないサンプルファイルしか見てないので断定もできない。
ただ、XMLということを考慮すると固定というわけでもない気がするのと
エクスポータ次第な気もするんだけど。
(2)source要素の意味
つまり、取得したsource要素が頂点、法線、テクスチャ座標、色の内どれなのか。
あるファイルには
<source id="***-position">
<source id="***-Position">
<source id="***-Normals">
<source id="***-normal">
<source id="***-UV">
<source id="***-uv">
なんて記述されている。
これも仕様かどうかは調べないといけないが、ハイフン以降で判別自体はできるってことなのか?
では大文字、小文字は百歩譲って、Normalsとnormalの違いってどこから来てるんだろう。
バージョン差異ならまぁいいとしてもエクスポータ次第なら困るとこ。
[追記その1]
COLLADA 1.5.0 Specification in Japanese (Last updated: May 2009) *NEW*
のaccessor項目を見るとどうも違うらしい。
(1) ネーミングが異なる(2) Textureが2個ある
(1)は良く分からんな・・・やっぱりエクスポータ次第か?
とすると、純粋に何かという判別は、各プリミティブにあるsemanticでしか
判別できないということになり、そうすると存在するプリミティブをすべて見ないといけない
ことになる。
(2)はマルチテクスチャを考慮するとテクスチャが複数あるのは自然
だけど、他の要素については重複云々については特に触れていない。
ということは極端な話、POSITIONが複数あってもフォーマット的には問題ないということか。
で、pdfを見ていると分かったことが1つ。
vertices、オフセット、ストライド、最低でもこれらを全て考慮しないといけない。
柔軟にも程がある!
[追記その2]
<mesh>周りのまとめ
<mesh>
<source> ... 出現回数1以上
<vertices> ... 出現回数1
<lines> ... 出現回数0以上
<linestrips> ... 出現回数0以上
<polygons> ... 出現回数0以上
<polylist> ... 出現回数0以上
<triangles> ... 出現回数0以上
<trifans> ... 出現回数0以上
<tritristrips> ... 出現回数0以上
<extra> ... 出現回数0以上
<vertices>
<input> ... 出現回数1以上
<extra> ... 出現回数0以上
<accessor>のサンプルを見ると<mesh>に<vertices>が存在しないケースがあるが
これは矛盾していないのだろうか?
またその際、<triangles>の<input>のsemanticは"POSITION"。
<vertices>の解説では1つの<input>要素は semantic="POSITIONを指定する必要がある
と明記されている。
この解説が正しいならprimitive_typesの中に出現する<input>のsemanticにはPOSITIONが
出現することはないと思うのだが。
また<vertices>の<input>出現回数が1以上ということは
<vertices id="verts">
<input semantic=~POSITION" source="#position"/>
</vertices>
<triangles>
<input semantic=~VERTEX" source="#verts"/ offset=0>
<input semantic=~NORMAL" source="#nrms"/ offset=1>
<input semantic=~TEXCORD" source="#tc/" offset=2>
</triangles>
と
<vertices id="verts">
<input semantic=~POSITION" source="#position"/ offset=0>
<input semantic=~NORMAL" source="#nrms"/ offset=1>
<input semantic=~TEXCORD" source="#tc/" offset=2>
</vertices>
<triangles>
<input semantic=~VERTEX" source="#verts"/>
</triangles>
と
<vertices id="verts">
<input semantic=~POSITION" source="#position"/>
</vertices> <triangles>
<input semantic=~VERTEX" source="#verts"/ offset=0>
<input semantic=~NORMAL" source="#position"/ offset=0>
<input semantic=~TEXCORD" source="#position/" offset=0>
</triangles> ※最後は各<source>内部でストライドを調整しているケース
同じ意味を指すケースもあるわけだろうか?
・・・ないとは言い切れないだろうなぁ。
あらゆる可能性(仕様の範囲内) を想定して上手くロードすることはできるのだろうか・・・。