次のページにて C#/.NET で COLLADA を読み書きする方法が示されています。
Import and Export 3D Collada files with C#/.NET
この記事を読んでわかる方はこの先を読む必要はありません。
一番最初に気にしたのは COLLADA のファイルフォーマットです。
(どこに頂点データが格納されて、どこにインデックスリストが格納されるのか、など)
こういうことは公式ページに行ってドキュメントを読むのが一番ですね。
次のサイトから COLLADA フォーマットを理解してみます。
COLLADA - Digital Asset and FX Exchange Schema
なるほど、次のリファレンスカードにフォーマットが示されているそうです。
実は 2,3年前に一度は読んでいます。
その時は、情報量が多すぎて途中で読むことをやめてしまいました。
というより独自形式のフォーマットへ書き出すエクスポータを作ってみたかったので深く読みませんでした。
今回は COLLADA を理解しようという気があるので頑張って読んでみます。
いざ読んてみると、よくまとまった資料であることに気づきます。
読めない方(昔の自分)のため、またすぐに忘れるだろう未来の自分のために簡単にメモを残します。
まず COLLADA(.dae ファイル) は XML ファイルです。
XML Notepad で開いてみると分かります。
The parent of all library_* elements is COLLADA.
リファレンスカードに書いてあるとおりですね。
頂点情報やインデックスは名前から推察できる通り library_geometries の下に格納されています。
まずは頂点位置情報の格納場所を見てみましょう。
[geometry]→[mesh]→[source]→[float_array]の値として格納されています。
mesh には 2つ source タグがありました。
それぞれ位置と法線です。
float_array と同列に technique_common がありますが、ここにストライド情報など
アクセサ定義が記述されています。
続いて頂点インデックスを見てみます。
vertices タグには何も入っていませんが、きっと出力元が頂点リストではなかったからでしょう。
polylist には三角形リストの情報が入っています。
一対一でマテリアルが設定されている点からプリミティブリストと言えるでしょう。
input が2つありますが、それぞれが入力レイアウトと見て取れます。
インデックスリストは頂点と法線が混在しているリストというわけです。
ソースをどこから引くべきか、それぞれの offset は何番目か、必要十分な情報がここにあります。
vcount は面の構成頂点数を示しています。前から順番に4つずつ面として扱えば良いということを示します。
p はインデックスリストです。それぞれのソースに対するインデックスが振られています。
図を注意深く見るとわかると思いますが、面の法線のインデックスが4頂点ずつ同じになっています。
シェーダの基礎知識がある方なら、これがフラットシェーディングであると想像できるでしょう。
フォーマットの解説はこの辺にしておきましょう。
ここまでわかっていれば今のところ十分です。
次のページで紹介されている collada_schema_1_4.cs ファイルを入手します。
Import and Export 3D Collada files with C#/.NET
プロジェクトに追加して次のようにパーサーとしてアクセスするだけです。
(WPF でボタン押下でテキストボックスからパスを取得→ロード→セーブというコードです。WPF が分からない方はコチラ)
実行すると、次の結果が出力に表示されます。
ソース、入力レイアウト、インデックスリストが取得できていることが確認できます。
この情報を使って DirectX の頂点バッファを作れば SharpDX で COLLADA ファイルの表示ができるという算段です。
次回、SharpDX で COLLADA のモデルを表示できるかテストしてみる予定です。
お楽しみに!
2012/06/11 初記。