【2010.11.12】
囲われた領域にボールを閉じ込めよう
前回は、ボールを任意の方向に移動させるプログラムをつくりました。
今回は、これまでに学習した条件分岐文(if文)を使いこなすための課題として、ある囲われた領域に閉じ込められたボールのシミュレーションを行ないます。
直方体の描画は、下記の関数を使用します。
直方体を描画するための関数「drowCuboid()」
直方体の各辺の長さをはじめの3つの引数で表し、次の3つが直方体の中心の座標を表します。 最後が色を表します。
///////////////////////////////////////////// // 直方体 void drowCuboid(double a, double b, double c, double x, double y, double z, MaterialStruct color){ GLdouble vertex[][3] = { { -a/2.0, -b/2.0, -c/2.0 }, { a/2.0, -b/2.0, -c/2.0 }, { a/2.0, b/2.0, -c/2.0 }, { -a/2.0, b/2.0, -c/2.0 }, { -a/2.0, -b/2.0, c/2.0 }, { a/2.0, -b/2.0, c/2.0 }, { a/2.0, b/2.0, c/2.0 }, { -a/2.0, b/2.0, c/2.0 } }; int face[][4] = {//面の定義 { 3, 2, 1, 0 }, { 1, 2, 6, 5 }, { 4, 5, 6, 7 }, { 0, 4, 7, 3 }, { 0, 1, 5, 4 }, { 2, 3, 7, 6 } }; GLdouble normal[][3] = {//面の法線ベクトル { 0.0, 0.0, -1.0 }, { 1.0, 0.0, 0.0 }, { 0.0, 0.0, 1.0 }, {-1.0, 0.0, 0.0 }, { 0.0,-1.0, 0.0 }, { 0.0, 1.0, 0.0 } }; glPushMatrix(); glMaterialfv(GL_FRONT, GL_AMBIENT, color.ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, color.diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, color.specular); glMaterialfv(GL_FRONT, GL_SHININESS, &color.shininess); glTranslated( x, y, z);//平行移動値の設定 glBegin(GL_QUADS); for (int j = 0; j < 6; ++j) { glNormal3dv(normal[j]); //法線ベクトルの指定 for (int i = 0; i < 4; ++i) { glVertex3dv(vertex[face[j][i]]); } } glEnd(); glPopMatrix(); }