//コンパイル: gcc *.c -lglut -lGLU -lGL -lm
//-----------------------------------------------------------
#include #include /*立方体の座標*/ GLdouble vertex[][3] = { { 0.5, 0.5, 0.5 }, { 1.0, 0.5, 0.5 }, { 1.0, 1.0, 0.5 }, { 0.5, 1.0, 0.5 }, { 0.5, 0.5, 1.0 }, { 1.0, 0.5, 1.0 }, { 1.0, 1.0, 1.0 }, { 0.5, 1.0, 1.0 } }; /*頂点のグループ(辺)*/ 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 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 } }; GLfloat light0pos[] = { 0.0, 3.0, 5.0, 1.0 }; GLfloat light1pos[] = { 5.0, 3.0, 0.0, 1.0 }; GLfloat green[] = { 0.0, 1.0, 0.0, 1.0 }; GLfloat red[] = { 0.8, 0.2, 0.2, 1.0 }; GLfloat blue[] = { 0.2, 0.2, 0.8, 1.0 }; void cube(void) { int i; int j; glBegin(GL_QUADS); for (j = 0; j < 6; ++j) { glNormal3dv(normal[j]); for (i = 0; i < 4; ++i) { glVertex3dv(vertex[face[j][i]]); } } glEnd(); } void idle(void) { glutPostRedisplay(); } void display(void) { int i,j; static int r = 0; /* 回転角 */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* 光源の位置設定 */ glLightfv(GL_LIGHT0, GL_POSITION, light0pos); glLightfv(GL_LIGHT1, GL_POSITION, light1pos); /* モデルビュー変換行列の保存 */ glPushMatrix(); /* 図形の回転 */ glRotated((double)r, 0.0, 1.0, 0.0); /* 図形の色 (赤) */ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, red); //図形の材質パラメータを設定 /* 図形の描画 */ cube(); /* 二つ目の図形の描画 */ glPushMatrix(); glTranslated(1.0, 0.0, 0.0); // glRotated((double)(2 * r), 0.0, 1.0, 0.0); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, blue); cube(); glPopMatrix(); /* モデルビュー変換行列の復帰 */ glPopMatrix(); glutSwapBuffers(); //ダブルバッファリング /* 一周回ったら回転角を 0 に戻す */ if (++r >= 360) r = 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); glLoadIdentity(); gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.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); //陰影付け glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); glLightfv(GL_LIGHT1, GL_DIFFUSE, green); //光源のパラメータを設定 glLightfv(GL_LIGHT1, GL_SPECULAR, green); } int main(int argc, char *argv[]) { glutInitWindowSize(720, 480); 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; }