2012-04-10 11 views
0

私はHalf-Edgeデータ構造に基づいて独自のMesh構造を持つ3D OpenGl(C++)アプリケーションを開発しています。 Wavefront objファイルをメッシュ構造にロードする簡単な方法を構築したいと思います。もちろん、私はそんなに素直に行うことはできますが、もっと効率的なやり方が必要です(プロフェッショナルなアプリケーションがファイルを順番にローディングしていないことは知っています。HalfEdge Meshの.objファイルローダーを高速化する方法はありますか?

誰かがチュートリアルや本当に高速OBJローダーの例を教えてもらえますか? Half Edgeのデータ構造と関係があるのであれば、それが望ましいでしょう。

編集:

私の周り

1を得るために探しています二つの基本的な問題があります)ファイル

2から浮動小数点数を読み取る一般的な遅さを避けてください)どのように私はインテリジェントに決定かオンザフライで各エッジの「隣接する」ハーフエッジ。私は、作成されているエッジの対称または次のエッジが既に存在するかどうかを判断するための何らかのハッシング関数を想像しています。

答えて

1

私はエッジとは対照的に共有頂点を探していましたが、OBJファイルを読み込むのと同様の問題がありました。ファイル形式自体には接続情報が含まれていないので、最も良い方法はstd::setです。データ構造にエッジを追加するたびに、そのセットがすでに存在するかどうかを調べることができます。セット検索は複雑さが対数であるため、データ構造のサイズに合わせて拡張されます。これを避ける唯一の方法は、私が考えることができる唯一の方法は、必要な接続情報を含むファイル形式を選択することです。または、マイケル・スレードが独自の形式と変換ツールを作成することを提案しました。

+0

'std :: unordered_set'はあなたにO(1)ルックアップを与えます。 –

+0

真ですが、要素を頻繁に挿入または消去する必要があるときは、ハッシュマップを避ける傾向があります。多くのデータを読み込むとき、 'std :: unordered_set'(ハッシュマップ)を頻繁に再ハッシュする必要がありますが、これは非常に高価な操作です。いくつのプリミティブが共有されているか分かっていればスペースを予約できますが、OBJファイルではそれが分かりません。どのコンテナが異なるファイルサイズに最も適しているかは興味深いでしょう。 – PeddleSpam

1

asciiファイルの読み込みとデコードは、特にファイルに変換する浮動小数点数が100万個の場合は遅いです。

私の考え:あなたが望む任意の言語でプログラムを書くと、.objファイルをバイナリ形式に変換して、プログラムが多かれ少なかれ直接メモリに読み込むことができます。次に、ロードする.objファイルでそのプログラムを実行し、プログラムに変換されたファイルをロードさせます。

追加ポイントについては、あなたのOpenGLプログラムがこの変換をオンザフライで行い、結果をキャッシュし、ファイルの修正時間をチェックし、必要に応じてキャッシュを更新するようにすることができます。

+0

これはどういう意味ですか?そのプログラムはあなたが避けようとしているのと同じ仕事をしないでしょうか? –

+0

はい、プログラムを実行するたびに実行するのではなく、事前に実行できます。 –

+0

プログラムの実行中にOBJファイルを読み込む必要があります。問題は数値を読み込むコストではなく、顔をインテリジェントにリンクする方法です。 –

関連する問題