2009年6月23日火曜日

とりあえずなんか表示?


昨日つくったデータを読み込む部分の実装です。と、その前に、頂点の数も予め分かった方がいいので、データに頂点数も出力するようにしました。次のようなフォーマットになります。
O オブジェクト名 頂点数
V x座標1 y座標1 z座標1
V x座標2 y座標2 z座標2
:

1行目のO(オーです。ゼロではありません。)で始まる行にオブジェクト(モデル)名と頂点数を出力するようにしました。オブジェクト名も出力するようにしたのはただなんとなくです。OではなくモデルのMでもよかったんですが、ゆくゆくマテリアルでMは使うかなと思い、Oにしときました。ま、気がかわったらまた直せばいいし。

pythonスクリプトに以下の処理を追加です。

out.write("O %d¥n" % (obj.name, len(mesh.verts))

で、次はC++のプログラムです。データを読み込む部分は次のような感じです。

std::string name; // オブジェクト名
Vertex *v; // 頂点の配列(Vertexはfloat型のx,y,zをメンバに持つ構造体)

int num = 0; // 頂点の数
unsigned int idx = 0;
// データファイルをオープン
std::ifstream fin("model.dat");
while (fin.eof()) {
char id; // 識別子
std::string line; // 1行分のデータ
getline(fin, line);
// ストリングストリームにした方が都合がいいので...
std::istringstream sin(line);
sin >> id;
if (sin.fail()) continue;
switch (id) {
case 'O':
sin >> name >> num;
if (!sin.fail()) v = new Vertex[num];
break;
case 'V':
if (idx < num) {
sin >> v[idx].x >> v[idx].y >> v[idx].z;
++idx;
}
break;
}
}
fin.close();

で、読み込んだデータをGL_QUAD_STRIPで一気に表示させてやります。

glBegin(GL_QUAD_STRIP);
for (unsigned int i=0; i<num; i++) {
glVertex3f(v[i].x, v[i].y, v[i].z);
}
glEnd();

結果は...ぐちゃぐちゃでした。どうも出力した頂点の並びがGL_QUAD_STRIPで想定する並びでは出力されてないようです。

うーむ...

0 件のコメント: