1

Half-Edge データ構造に基づく独自のメッシュ構造を持つ 3D OpenGl (C++) アプリケーションに取り組んでいます。Wavefront obj ファイルをメッシュ構造にロードする簡単な方法を構築したいと考えています。もちろん、単純に 1 行ずつ実行することもできますが、もっと効率的な方法が必要です (プロのアプリケーションが単純に 1 行ずつファイルをロードしないことはわかっています。何百万もの頂点に対しては遅すぎるでしょう)。

チュートリアルや非常に高速な OBJ ローダーの例を誰か教えてもらえますか? ハーフエッジのデータ構造と関係がある場合は望ましいでしょう。

編集:

私が回避しようとしている2つの基本的な問題があります

1) ファイルから浮動小数点数を読み取る一般的な遅さを回避する

2)各エッジの「隣接する」ハーフエッジをその場でインテリジェントに決定するにはどうすればよいですか。作成中のエッジの対称エッジまたは次のエッジが既に存在するかどうかを判断し、存在する場合はそのポインターを使用するためのある種のハッシュ関数を想像しています。

4

2 に答える 2

2

エッジではなく共有頂点を検索していましたが、しばらく前にOBJファイルの読み込みで同様の問題が発生しました。ファイル形式自体には接続情報が含まれていないため、最良の方法はを使用することstd::setです。データ構造にエッジを追加するたびに、セットを検索して、それがすでに存在するかどうかを確認できます。セット検索は複雑さが対数であるため、データ構造のサイズに合わせて適切に拡張できます。これを回避する唯一の方法は、必要な接続情報を含むファイル形式を選択するか、MichaelSladeが提案したように独自の形式と変換ツールを作成することです。

于 2012-04-13T02:56:22.507 に答える
2

ascii ファイルの読み取りとデコードは、特にファイルに変換する浮動小数点数が 100 万個ある場合に時間がかかります。

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

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

于 2012-04-10T01:33:47.833 に答える