#include #include #include GLdouble vertex[][3] = { { 1.0, 2.0, 1.0 }, { -1.0, 2.0, 1.0 }, { 1.0, 2.0, -1.0 }, { -1.0, 2.0, -1.0 }, { 1.0, 0.0, 1.0 }, { -1.0, 0.0, 1.0 }, { 1.0, 0.0, -1.0 }, { -1.0, 0.0, -1.0 },//ここまで上部立方体 { 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, -2.0, 0.0 }, { 0.0, -2.0, 0.0 }, { 0.0, -2.0, 0.0 }, { 0.0, -2.0, 0.0 } }; int face[][4] = { { 0, 2, 3, 1 }, { 1, 5, 4, 0 }, { 0, 4, 6, 2 }, { 2, 6, 7, 3 }, { 3, 7, 5, 1 }, { 4, 5, 7, 6 }//ここまで上部立方体 }; int tri[][3] = { { 12, 4, 8 }, { 12, 9, 4 }, { 12, 8, 9 }, { 13, 6, 9 }, { 13, 10, 6 }, { 13, 9, 10 }, { 14, 7, 10 }, { 14, 11, 7 }, { 14, 10, 11 }, { 15, 5, 11 }, { 15, 8, 5 }, { 15, 11, 8 } }; GLdouble normal[][3] = { { 0.0, 1.0, 0.0 }, { 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 } }; GLdouble normaltri[][3] = { { 0.0, 0.0, 1.0 }, { 1.0, 0.0, 0.0 }, {-1.0, 0.0,-1.0 }, { 1.0, 0.0, 0.0 }, { 0.0, 0.0,-1.0 }, {-1.0, 0.0, 1.0 }, { 0.0, 0.0,-1.0 }, {-1.0, 0.0, 0.0 }, { 1.0, 0.0, 1.0 }, {-1.0, 0.0, 0.0 }, { 0.0, 0.0, 1.0 }, { 1.0, 0.0,-1.0 } }; GLfloat light0pos[] = { 0.0, 3.0, 5.0, 1.0 }; GLfloat color[] = { 0.0, 0.6, 0.4, 1.0 }; //脚の位置を変更 void setleg(int a) { int sv[][3] = { { 1, 0, 1 }, { 1, 0, -1 }, { -1, 0, -1 }, { -1, 0, 1 } }; int i, j; int f, vf; for(i = 12; i < 16; i++) { for(j = 0; j < 3; j+=2) { f = 1; vertex[i][j] = sv[i - 12][j] * sin(a / 360.0 * M_PI) * 3.0; } } } void idle(void) { glutPostRedisplay(); } void display(void) { int i; int j; static double r = 0.0; /* 回転角 */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); /* 視点位置と視線方向 */ gluLookAt(6.0, 10.0, 15.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); /* 光源の位置設定 */ glLightfv(GL_LIGHT0, GL_POSITION, light0pos); /* 図形の回転 */ glRotated(r, 1.0, 0.6, 0.3); /* 図形の色 */ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); //立方体部分 glBegin(GL_QUADS); for (j = 0; j < 6; ++j) { glNormal3dv(normal[j]); for (i = 0; i < 4; ++i) { glVertex3dv(vertex[face[j][i]]); } } glEnd(); //脚の部分 glBegin(GL_TRIANGLES); for (j = 0; j < 12; ++j) { glNormal3dv(normaltri[j]); for (i = 0; i < 3; ++i) { glVertex3dv(vertex[tri[j][i]]); } } glEnd(); glutSwapBuffers(); r += 0.2; setleg(r); /* 一周回ったら回転角を 0 に戻す */ if (r >= 360.0) r = 0.0; } void resize(int w, int h) { glViewport(0, 0, w, h); /* 透視変換行列の設定 */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0); /* モデルビュー変換行列の設定 */ glMatrixMode(GL_MODELVIEW); } void mouse(int button, int state, int x, int y) { switch (button) { case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) { /* アニメーション開始 */ glutIdleFunc(idle); } else { /* アニメーション停止 */ glutIdleFunc(0); } break; default: break; } } void keyboard(unsigned char key, int x, int y) { switch (key) { case 'q': case 'Q': case '\033': /* '\033' は ESC の ASCII コード */ exit(0); default: break; } } void init(void) { glClearColor(0.3, 0.3, 0.3, 1.0); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow(argv[0]); glutDisplayFunc(display); glutReshapeFunc(resize); glutMouseFunc(mouse); glutKeyboardFunc(keyboard); init(); glutMainLoop(); return 0; }