boost spirit qiでmqo(メタセコイア)ファイル解析&とりあえず描画

ポリゴンが描画できるようになったので、今度はモデルデータファイルを読み込んで表示してみる。モデルデータは、データ作成と解析が簡単にできるmqoファイル(メタセコイアの出力ファイル、テキスト形式)を使用する。

とりあえずmqoファイル表示
とりあえずmqoファイル表示

ファイル解析
Boost Spirit ライブラリのQiを使って解析。かなり特殊な使い方をするライブラリですが興味があったので使ってみます。主に使う関数は
bool boost::spirit::qi::parse(開始, 終了, 文法, 属性,,,属性);
開始終了: イテレータで解析範囲指定
文法: 解析方法、一致していればtrueを返す
属性: 解析結果を受け取る。詳しくはソースコードで

spiritの準備

includeとコードを短縮するための定義。

mqoヘッダの解析 単純なparse使用例 

指定した文字列と一致しているかどうか調べてmqoファイル判定。

空白スキップ 簡単な文法と属性の使用例 

space : ライブラリに用意されている文法、空白文字(タブ、改行も含む)を表す
* : 演算子 *spaceは0回以上空白文字が続く
attr_str : 属性 *spaceの結果(文法に一致した空白文字列)

mqoチャンクの解析 >>演算子と属性での数値取得 

Materialチャンクの解析。>>は複数の文法を連結する演算子。
Material文字列の後に空白(blank、改行含まず)1回以上、その後に整数値(int_)、その後・・・。
>>で連結した場合、それぞれの項に対応する属性を複数引数で指定し、結果を受け取る。unusedは結果を受け取らない属性。int_に対応する属性でマテリアルの個数を取得。
elineはライブラリではなく独自に定義した文法、改行コード(\r\n)を表す。

“文字列”の解析 独自の文法定義 

すでにある文法を組み合わせて新しい文法を定義できる。
dqstringはC言語などで使う”文字列”表記を表現する文法定義。

独自文法を使った解析

定義した文法を使うには、インスタンス化してparse関数で使用。spaceやint_などはboostライブラリ側でインスタンス化した文法。

mqoファイルの解析
今回はspiritライブラリの基本的な部分のみ使用してmqoファイルを解析しました。他にもいろいろな機能がありますが、特に必要ではなく、無理に使っても意味不明なソースコードになりそうなので使いませんでした。
とりあえず使ってみましたが

  • コンパイルが遅すぎる!
  • 実行速度も遅い!

たぶん今後使うことはなさそうです。
(コンパイル40秒、数Mのファイル解析に約1分)

解析結果の表示
とりあえず表示してみる。最初のObjectのみ表示、テクスチャは固定。
mqoファイルをいくつか解析して表示すると、文法間違いを多数発見。その都度修正。
それなりに頂点数の多い複雑なモデルも何とか表示できているみたい。
次は、複数オブジェクトの表示と姿勢計算、テクスチャ対応の予定。

サンプルダウンロード とりあえずmqoファイル表示

Boost C++ Library
Metasequoia 3Dポリゴンモデラー

広告

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

認証:数字を入力してください(必須) * Time limit is exhausted. Please reload CAPTCHA.