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 件のコメント:
コメントを投稿