2009年7月26日日曜日

そして時は動き出す


残すは表示処理のみです。とはいっても表示のための座標変換は既に終わっているのでそのまま出力するだけです。
void Model::draw() const {
for (unsigned int faceIdx = 0; faceIdx < numFaces; faceIdx++) {
Face *f = &faces[faceIdx];
bool useTexture;
int lastImgIdx = -1;
// テクスチャの準備
:
// 描画
glBegin(GL_QUADS);
std::vector<unsigned int>::iterator itv;
for (unsigned int i=0; i<f->numVerts; i++) {
FaceVertex* fv = &f->verts[i];
if (useTexture) glTexCoord2f(fv->u, fv->v);
Vertex *v = &vertices [fv->idx];
if (curAction) {
// アニメーション中
glVertex3f(v->anim.x, v->anim.y, v->anim.z);
} else {
// 静止中
glVertex3f(v->rest.x, v->rest.y, v->rest.z);
}
}
glEnd();
}
}

テクスチャの処理は前と変わっていないので省いています。アニメーション中かどうかで、表示する頂点を切り替えているぐらいで他は特に変わっていません。

結果は上の動画で見られます。この動きは一応想定したものです。壊れたり暴走しているわけではありませんので、念のため。

しかし、最初はなかなかうまく動かず苦労しました。考え方がおかしいのかと疑ったり、ソースを最初から見直したりしてて、結局今回使った実例で学ぶゲーム3D数学の行列クラスのソースが本に書いてあることと食い違っていることに気づきました。クォータニオンを行列に変換する部分です。

void Matrix4x3::fromQuaternion(const Quaternion &q) {
:
m11 = 1.0f - yy*q.y - zz*q.z;
m12 = xx*q.y + ww*q.z;
m13 = xx*q.z - ww*q.x;

m21 = xx*q.y - ww*q.z;
m22 = 1.0f - xx*q.x - zz*q.z;
m23 = yy*q.z + ww*q.x;

m31 = xx*q.z + ww*q.y;
m32 = yy*q.z - ww*q.x;
m33 = 1.0f - xx*q.x - yy*q.y;
:
}

問題の箇所の抜粋ですが、ここの
m13 = xx*q.z - ww*q.x;

は、書籍の本文に書かれてる内容だと、どうみても
m13 = xx*q.z - ww*q.y;

なんですよねぇ。で、直してやってみたら動きました。ヤレヤレだぜ。でもこれサポートサイトの正誤表にも載ってないんですよね。せっかくなので教えてやろうと思い辞書をひきひき英文書いてメール送ってみたら、エラーメールが返ってきましたよ。トホホ。

とにかくボーンアニメーションの基本部分ができたので、もちょっとましなモデルを作って歩かせたりしてみたいと思います。

0 件のコメント: