2009年6月29日月曜日

一応ちゃんと表示


Blenderで出力した頂点を意味のある順番で表示するためには、Faceを使う必要がありそうです。
Faceには面を構成する頂点の位置が順番に保持されているので、この順で頂点を結んでやれば面として表示することができそうです。
ただ、これだと面単位で描画することになるので、GL_QUAD_STRIPTで一気に出力することができなくなりますが、後で考えることにして今のところはこれで進めます。

データのフォーマットを次のようにしました。
F 頂点数 頂点番号1 頂点番号2 頂点番号3..

1桁目のFは例によって識別子で、その後に頂点数とその数だけ頂点番号が並びます。今のところポリゴンは四角形にしてるので頂点数はなくてもいいんですが、とりあえずつけときます。
面の数だけこの行が出力されます。

面の数はオブジェクトの行に追加しときました。
O オブジェクト名 頂点数 面数

Pythonのソースは次のようになります。

:
for f in mesh.faces:
out.write("F %d" % len(f.verts))
for v in f.verts:
out.write(" %d" % v.index)
out.write("\n")

で、出力されたデータを読み取るC++のソースが次のようになります。

:
case 'F':
Face* f = faces[faceCount]; // Faceは面情報を保持する構造体
in >> f->numVerts;
if (in.fail()) break;
++faceCount;
f->verts = new int[f->numVerts];
for (unsigned int i=0; i<numVerts; i++) {
unsigned int v;
in >> v;
if (in.fail()) {
break;
} else {
f->verts[i] = v;
}
}
:

んー、ちょっとswich文の中が長くなってきたので、整理した方がよさそうです。

で、描画する処理は次のようになります。


glBegin(GL_QUADS);
for (unsigned int i=0; i<faceCount; i++) {
Face* f = faces[i];
for (unsigned int j=0; j<f->numVerts; j++) {
glVertex3f(v[faces[i]->verts[j]);
}
}
glEnd();

GL_QUAD_STRIPTからGL_QUADSになりました。頂点の数によってGL_TRIANGLESにすると三角形のポリゴンにも対応できます。スピードがあれですが...

ま、なんにしてもひとまず形のわかるものが表示できました。モデルの形状は前回から少し弄ってます。

0 件のコメント: