ガガッ..ピー..どうも、星姫です。
C#アプリの作成途中でしたね。
「沈黙の艦隊」よりカイエダ艦長…のマネをする星姫。
さっぱり更新が進まないと思ったら「デモンズソウル」に続いて
沈黙の艦隊を全巻読んでいたからでした…重ねて申し訳ない。
ここから本題に入ります。
諸君、前回作成したC#アプリのプロジェクト「SimpleConverter」を開いているかな?
続いて中間XMLファイルを読み込み、描画用モデルデータを作成しますよ。
まずはXMLファイルの読み込みです。
XML ファイルは仕様が決められているファイル形式なので
読み込み用クラスが用意されています。
俗に言う「XMLパーサ」です。
C#には最初からXMLパーサが用意されています。
今回はC#からXMLファイルにアクセスするための
・XmlDocumentクラス
・XmlNodeListクラス
・XmlElementクラス
について、その使用方法をまとめてみます。
XMLはタグが属性を持ち、タグの中にテキストが書かれているだけなので
タグ名で検索をかけて、そのタグの属性、タグの中のテキストを取得することができればOKかと感じてます。
とりあえず、実装方法から書いてみましょう。
プロジェクトを右クリック、「追加」→「新しい項目」→「code」カテゴリの「クラス」を選択して
Converterクラスのファイルを作成します。
ファイルオープンのイベントで、ファイルパスを追加情報に渡してあげます。
以下のコードは、XMLファイルのパスから、そのファイルを読み込む関数です。
マジックコードとバージョン番号の確認をしています。
ルートのタグが持つ、属性(attribute)を取得して、マジックコードのチェック
コンバータのバージョンと一致するか見ています。
さて、オブジェクト名を指定して、モデルデータファイルを出力する関数を作りました。
その際に、オブジェクトの情報を XML ファイルから取り出します。
どうやって取り出すかを、以下に示します。
タグ名"Object"で検索して、一致したタグリストの中から、オブジェクト名が一致するモノを探します。
あとは、メッシュタグの中の頂点情報タグとインデックスリストタグの属性データを取得しています。
次に、タグ内のテキストデータを取得する方法を示します。
バイナリ形式でファイルに書き込む操作も一緒に示します。
あまり C# を分かっていないので、頭の悪い書き方をしていると思いますが、そこは気にしないでください。
頂点の出力の順番が 0 2 1 になっているのは仕様です。
理由は Blender の座標系がZ up の右手系で
DirectX の座標系が Y up の左手系だからです。
ファイルヘッダ情報は、以下に書いたとおりです。
.smplファイルを使いたいという方がもしいましたら、このファイルヘッダ情報を参考にしてください。
で、作成してみたデータ変換器がこちら↓
現在はメッシュ情報しか出力しません、今後拡張していく予定です。
使い方ですが、オブジェクトのプロパティを確認して変換ボタンを押すだけで
バイナリ形式のモデルデータを出力します。
こちらがシンプルコンバータのUIのイメージです。
え!?、いきなり超初心者が C# を使い、このレベルの GUI は作れないって?
大丈夫!、前回にて C# を用いた GUI 作成の基礎を学べますので
あとは、次のサイトで必要な実装方法を調べれば1日、2日で完成します。
ユーザコントロールの作成方法と delegate を使ったイベント処理が書けるようになれば、きっと大丈夫なはず!(また雑でゴメンネ…)
ウィンドウサイズを変えた時に、コントロールが伸び縮みするにはどうしたらいいのかだけは、調べ方に困ると思うので
先にキーワードを残しておきます。
ユーザコントロールに対して「Dock」プロパティを Fill に、コントロール追加先にてプロパティ「アンカー」をいじります。
これだけは、触ってみないとちょっと理解できないので、頑張ってもらいたい。
コンバータを使って作成されるバイナリデータを確認するにはバイナリエディタを使用します。
私は「Stirling」を使っています。
え、入手できない? うーん、Vector とかで落とせなかったかな?
まぁバイナリエディタなら何でもいいです。
出力されるバイナリデータの中身は以下のようになっています。
ファイルヘッダに32byte
頂点情報(float型が 3 つ ) * 頂点数
インデックスリスト(プリミティブトポロジはTriangleList unsigned int 型が 3 つ ) * 三角面の数
さて、テストでもしてみましょうか。
Blender にて次のようなモデルを作成し、SimpleStarExporter を使って XML ファイルを出力します。
今回作成した SimpleConverter を使って.smpl ファイルに変換します。
バイナリエディタで見てみると、こんな感じ↓(ファイルヘッダが32byteまであって、その先が頂点バッファなのがわかるかな?)
これを読み込んで、DirectX10のチュートリアル05を動かすと次のように
Blenderで作成したデータをDirectXで表示できるようになります。
DirectX10 の説明も含めて、詳細は次回にやります。
お楽しみに!
今回でBlender独自フォーマット出力が完了しました。
2010/09/19 初記.
2010/10/10 追加。