2009年7月1日水曜日

色をつけたり...


モデルに色をつけてみました。色の設定はBlenderからもってきます。
色はmeshのmaterialに設定されているのでこれを使います。識別子Mの行にマテリアルの属性として色を書き出します。
M R値 G値 B値

R, G, Bはそれぞれ赤(R)、緑(G)、青(B)の量を表す0〜1の範囲の値です。
これを、モデルで使われている色の数だけ出力します。

またマテリアルは面単位で設定されるので面の行(識別子:Fの行)にマテリアルの番号を追加しました。どの面がどの色を使っているかを、マテリアルの番号で指定します。
F マテリアル番号 頂点数 頂点番号1 頂点番号2...

Pythonスクリプトは次のようになります。

:
# マテリアルの数だけ繰り返し
for m in mesh.materials:
col = m.getRGBCol()
out.write("M %f %f %f\n" % (col[0], col[1], col[2]))
:
# 面の数だけ繰り返し
for f in mesh.faces:
out.write("F %d %d" % (f.mat, len(f.verts)))
for v in f.verts:
out.write(" %d" % v.index)
out.write("\n")
:


C++側の読み込みは次のような感じです。

/**
* マテリアル行の読み込み
*/
void Model::readMaterialLine(std::istream& in) {
Matrial *m = materials[matCount++]; // MatrialはRGB値を保持する構造体
in >> m->r >> m->g >> m->b;
}

/**
* フェース行の読み込み
*/
void Model::readFaceLine(std::istream& in) {
Face* f = faces[faceCount++]; // Faceは面情報を保持する構造体
in > f->mat >> f->numVerts;
if (in.fail()) {
std::cerr << "failed in readling face info" << std::endl;
}
:
}
:


switch文の中が長くなってきたので、各行の読み込みを関数にしました。

描画は次のようになります。

glBegin(GL_QUADS);
for (unsigned int i=0; i<faceCount; i++) {
Face* f = faces[i];
 Material* m = materials[f->mat];
glColor3f(m->r, m->g, m->b);
for (unsigned int j=0; j<f->numVerts; j++) {
glVertex3f(v[faces[i]->verts[j]);
}
}
glEnd();

glVertexの前にglColorの呼び出しを追加しています。

色もつけたし、いよいよアニメーションかなぁ、その前にテクスチャの方をやるか...うーむ。

0 件のコメント: