//gcc *.c -lglut -lGLU -lGL -lm #include #include #include GLdouble vertex[][3] = { { 0.0, 0.0, 0.0 }, /* A */ { 1.0, 0.0, 0.0 }, /* B */ { 1.0, 1.0, 0.0 }, /* C */ { 0.0, 1.0, 0.0 }, /* D */ { 0.0, 0.0, 1.0 }, /* E */ { 1.0, 0.0, 1.0 }, /* F */ { 1.0, 1.0, 1.0 }, /* G */ { 0.0, 1.0, 1.0 } /* H */ }; int face[][4] = { { 0, 1, 2, 3 }, { 1, 5, 6, 2 }, { 5, 4, 7, 6 }, { 4, 0, 3, 7 }, { 4, 5, 1, 0 }, { 3, 2, 6, 7 } }; GLdouble color[][3] = { { 1.0, 0.0, 0.0 }, { 0.0, 1.0, 0.0 }, { 0.0, 0.0, 1.0 }, { 1.0, 1.0, 0.0 }, { 1.0, 0.0, 1.0 }, { 0.0, 1.0, 1.0 } }; //int edge[][2] = { // { 0, 1 }, /* ア (A-B) */ // { 1, 2 }, /* イ (B-C) */ // { 2, 3 }, /* ウ (C-D) */ // { 3, 0 }, /* エ (D-A) */ // { 4, 5 }, /* オ (E-F) */ // { 5, 6 }, /* カ (F-G) */ // { 6, 7 }, /* キ (G-H) */ // { 7, 4 }, /* ク (H-E) */ // { 0, 4 }, /* ケ (A-E) */ // { 1, 5 }, /* コ (B-F) */ // { 2, 6 }, /* サ (C-G) */ // { 3, 7 } /* シ (D-H) */ //}; /*地面 void scene(void){ static GLfloat ground[][4] ={ {0.6, 0.6, 0.6, 1.0}, {0.3, 0.3, 0.3, 1.0} }; int i,j; glBegin(GL_QUADS); glNormal3d(0.0, 1.0, 0.0); for (j = -5; j < 5; j++) { for (i = -5; i < 5; i++) { glMaterialfv(GL_FRONT, GL_DIFFUSE, ground[(i + j) & 1]); glVertex3d((GLdouble)i, -0.5, (GLdouble)j); glVertex3d((GLdouble)i, -0.5, (GLdouble)(j + 1)); glVertex3d((GLdouble)(i + 1), -0.5, (GLdouble)(j + 1)); glVertex3d((GLdouble)(i + 1), -0.5, (GLdouble)j); } } glEnd(); }*/ void idle(void){ glutPostRedisplay(); } void display(void){ int i; int j; static int r=0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(0.0, 5.0,10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // scene(); glRotated((double)r, 0.0, 1.0, 0.0); glColor3d(1.0, 0.0, 0.0); glBegin(GL_QUADS); for (j = 0; j < 6; ++j) { glColor3dv(color[j]); for (i = 0; i < 4; ++i) { glVertex3dv(vertex[face[j][i]]); } } glEnd(); glutSwapBuffers(); if(++r >= 360)r=0; } /* void kaiten(){ int i; static int r=0; glRotated((double)r, 0.0, 1.0, 0.0); glColor3d(0.0, 0.0, 0.0); glBegin(GL_LINES); for (i = 0; i < 12; ++i) { glVertex3dv(vertex[edge[i][0]]); glVertex3dv(vertex[edge[i][1]]); } glEnd(); if(++r >= 360)r=0; } */ void resize(int w,int h){ glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); // glOrtho(-2.0, 2.0, -2.0, 2.0, -2.0, 2.0); gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0); // gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glMatrixMode(GL_MODELVIEW); /* glTranslated(0.0, 0.0, -5.0); glViewport(0,0,w,h); glLoadIdentity(); glOrtho(-w / 200.0, w / 200.0, -h / 200.0, h / 200.0, -1.0, 1.0); */ } 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; case GLUT_RIGHT_BUTTON: if (state == GLUT_DOWN) { /* コマ送り (1ステップだけ進める) */ glutPostRedisplay(); } 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(1.0,1.0,1.0,1.0); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); } int main(int argc,char *argv[]){ // glutInitWindowPosition(100, 100); // glutInitWindowSize(320, 240); 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; }