2011-12-05 20 views
0

3Dモデルの頂点、法線、および接続情報を定義するファイルがあります。C++ - 3Dモデルの読み込み

サンプル:で読み、この情報を格納するための最良の方法だろう

v   vertex coordinate (x, y, z position) 
vt  texture coordinate (u, v coordinate) 
f   polygon connectivity information with vertex and texture indices 

何:

v -2.491060 -2.491060 0.000000 
v 2.491060 -2.491060 0.000000 
v -2.491060 2.491060 0.000000 
v 2.491060 2.491060 0.000000 
vt 0.000000 0.000000 
vt 1.000000 0.000000 
vt 0.000000 1.000000 
vt 1.000000 1.000000 
f 1/1 2/2 3/3 
f 3/3 2/2 4/1 

?各頂点と接続情報の内部配列を持つカスタムクラス/構造体?私はデータをC++で区切られた形で読み込む前に一度も考えていたが、同じデータ型であったため、多次元配列にチャンクした。私はちょうどstringstreamsとカスタムの構造体/クラスを使うべきでしょうか?

EDIT開示は、これは私の3Dグラフィックスクラスのためですが、

+1

¤一度に1行ずつ、 ''の 'std :: getline'を使って読み込みます。次に、あなたが気に入っているものを使って、各行を解析します。 'std :: istringstream'は簡単ですが、おそらく非効率です。あなたが書いているように、いくつかの "カスタムクラス"が必要になります。基本的な要素の種類として。しかし、ゼロからできるだけ少なく考えてください。代わりに、 'vector'や' map'やC++ 11 'array'などの標準ライブラリのコンテナを活用してください。どこでも明確な 'new'を持たないことを目標にしてください。乾杯&乾杯。 –

答えて

3

1つの事実がありますまず、あなたがダイナミックにそれらを格納する必要があり、私はちょうどなど、完全に書かれたプロジェクトを、ここに助言を求めていませんよアレイ。私が知っているように、Wavefrontは、3D-Objファイルにいくつの頂点があるかについての情報は保持していません。 vertexnormals、texturecoordinates、facesについても同じです。

私はそれらを(頂点、法線など)構造体に読み込んで、三角形を定義した後にそれらを削除する傾向があります。 Stringstreamsとカスタム構造体は私にとってうまくいくので、正規表現を使用して必要な頂点/面データを読み出すことができます。

私は、私が間違っている場合はとても残念のJavaプログラマ(長すぎるではない)だ:/

これはおそらく、私のプロジェクトで私の.objローダーの少し複雑なバージョンです:それはJavaのhttps://github.com/Chrise55/Llama3D/blob/master/src/llama/zoo1/llgeometry/LLLoadGeometry.java おそらくそれはあなたを助けるかもしれない? :/

関連する問題