/* sample8.c */ #include #include #include float param = 0.0; int flag = 0; float diffuse[] = {0.8, 0.8, 0.8, 1.0}; /* 拡散反射成分の反射強度*/ float specular[] = {1.0, 1.0, 1.0, 1.0}; /* 鏡面反射成分の反射強度 */ float ambient[] = {0.2, 0.2, 0.2, 1.0}; /* 環境光成分の反射強度*/ float shininess = 128.0; void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* zバッファを初期化 */ glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, specular); glMaterialfv(GL_FRONT, GL_AMBIENT, ambient); glMaterialf(GL_FRONT, GL_SHININESS, shininess); glEnable(GL_LIGHTING); glPushMatrix(); glTranslatef(0.0, 1.0, 0.0); glutSolidCube(2.0); glPushMatrix(); glTranslatef(-0.5, 0.5, 1.0); glutSolidSphere(0.2, 10, 10); glPopMatrix(); glPushMatrix(); glTranslatef(0.5, 0.5, 1.0); glutSolidSphere(0.2, 10, 10); glPopMatrix(); glPushMatrix(); glTranslatef(0.0, 0.0, 1.1); glutSolidCube(0.2); glPopMatrix(); glPopMatrix(); glDisable(GL_LIGHTING); glutSwapBuffers(); } void idle(void) { if(flag == 1){ param = fmod(param+1.0, 360.0); /* 回転角を0〜360度まで,1度ずつ増加 */ } glutPostRedisplay(); } void mouse(int button, int state, int x, int y) { if(state == GLUT_DOWN){ /* マウスがクリックされて */ switch(button){ case GLUT_LEFT_BUTTON: /*クリックされたのが左ボタンだったら */ flag = 1; /* 左ボタンがクリックされたときに行う処理 */ break; case GLUT_RIGHT_BUTTON: /*クリックされたのが右ボタンだったら */ flag = 0; /* 右ボタンがクリックされたときに行う処理 */ break; } } } void keyboard(unsigned char key, int x, int y) { static float col[4][4] = {{1.0, 0.0, 0.0, 1.0}, {0.0, 1.0, 0.0, 1.0}, {0.0, 0.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0}}; static int index = 0; static int smooth = 0; switch (key) { case 'q': /* qが入力されたら,プログラムを終了する */ exit(0); case 'r': param += 30.; break; case 'c': index++; index %= 4; glMaterialfv(GL_FRONT, GL_DIFFUSE, col[index] ); break; case 's': if( smooth ) glShadeModel(GL_SMOOTH); else glShadeModel(GL_FLAT); smooth = !smooth; break; default: break; } } void init(char *winname) { glutInitWindowPosition(0, 0); glutInitWindowSize(500, 500); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); /* zバッファ利用の宣言 */ glutCreateWindow(winname); glClearColor(0.2, 0.4, 0.4, 1.0); glMatrixMode(GL_PROJECTION); /* 投影法に関する座標変換を開始 */ glLoadIdentity(); gluPerspective( 30.0, 1.0, 1.0, 10.0 ); glMatrixMode(GL_MODELVIEW); /* 視点の移動やモデルの移動など投影法 以外の座標変換を開始 */ gluLookAt( 3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 ); glShadeModel(GL_FLAT); /* シェーディングの種類をフラットシェーディングに設定 */ glEnable(GL_LIGHT0); /* LIGHT0の光源を有効にする */ glEnable(GL_DEPTH_TEST); /* 隠面処理の開始を宣言 */ } int main(int argc, char *argv[]) { glutInit(&argc, argv); init(argv[0]); glutDisplayFunc(display); glutKeyboardFunc(keyboard); glutMouseFunc(mouse); /* マウス入力のコールバック関数mouseの指定 */ glutIdleFunc(idle); glutMainLoop(); return 0; }