2

Boost Spirit ライブラリを使用して、基本的な OBJ ファイル ローダーを作成しようとしています。私は標準の std::ifstreams を使用して動作させましたが、ここに投稿されているように最高のパフォーマンスを提供するように見えるため、メモリ マップされたファイルを使用してファイル全体でphrase_parseを実行できるかどうか疑問に思っています。

私は次のコードを持っています。これはうまくいくようですが、ファイルにコメントがあると壊れます。それで、私の質問は、Spririt を使用して OBJ ファイル内の「#」で始まるコメントをどのように無視するのですか?

struct vertex {
    double x, y, z;
};

BOOST_FUSION_ADAPT_STRUCT(
                          vertex,
                          (double, x)
                          (double, y)
                          (double, z)
                          )
std::vector<vertex> b_vertices         
boost::iostreams::mapped_file mmap(
                                           path,
                                           boost::iostreams::mapped_file::readonly);
        const char* f = mmap.const_data();
        const char* l = f + mmap.size();


        using namespace boost::spirit::qi;

      bool ok = phrase_parse(f,l,(("v" >> double_ >> double_ >> double_) |
                               ("vn" >> double_ >> double_>> double_)) % eol ,
                               blank, b_vertices);

上記のコードは、コメントや頂点/法線以外のデータがない場合にうまく機能します。しかし、異なるタイプのデータがある場合、パーサーは(本来あるべきように)失敗し、すべての行の解析に戻らずに動作させる方法があるかどうか疑問に思っています(私のテストではほぼ2.5倍)。 . ありがとうございました!

4

2 に答える 2

3

頭に浮かぶ最も簡単な方法は、コメントをスキップ可能にすることです。

bool ok = qi::phrase_parse(
        f,l,
         (
               ("v"  >> qi::double_ >> qi::double_ >> qi::double_) |
               ("vn" >> qi::double_ >> qi::double_ >> qi::double_)
          ) 
          % qi::eol,
        ('#' >> *(qi::char_ - qi::eol) >> qi::eol | qi::blank), b_vertices);

#行内のどこかに表示される場合、これはコメントも「認識」することに注意してください。これはおそらく問題ありません (有効な入力行の末尾にコメントがない限り、解析が失敗するため)。

Coliruでライブを見る

または、「vn」または「v」行を処理するのと同じように、フェニックスの魔法を使用して「コメント行」を処理します。

于 2013-12-30T17:33:44.087 に答える
0

私のコメント/投稿は直接関連するコードではないことを認識していますが、可能であれば車輪を再発明しないことを望んでおり、このライブラリについて知りたいと思っていました. 私は手書きの OBJ/Wavefront ローダーを使用していましたが、調査の結果、このライブラリTiny Obj Loaderが見つかりました。このライブラリは、C++ STL を除いて依存関係のない C++ で書かれています。Wavefront 仕様のエッジ ケースをかなり適切に処理し、非常に高速です。ユーザーがしなければならないことは、Tiny OBJ オブジェクトをコードに変換することです。TinyObjLoader は、かなりの数のプロジェクトでも採用されています。質問に直接答えなかったことをお詫び申し上げます。私の望みは、この素晴らしいライブラリについての知識を広めることです。

于 2016-07-07T19:44:10.767 に答える