2つの玉がクリックしている間くるくる回ります。 コンパイル: cc *.c -lglut -lGLU -lGL -lm ----------------------------------------------------------> #include #include #include #define R 0.5 static double pbx = 1.0; static double pbz = 0.0; GLfloat light0pos[] = { -10.0, 10.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 }; GLfloat gray[] = { 1.0, 1.0, 1.0, 1.0 }; void idle(void) { glutPostRedisplay(); } void display(void) { int i; int j; const static GLfloat bcolor[] = { 0.8, 0.0, 0.4, 1.0 }; /* ビー玉の色    */ const static GLfloat lightpos[] = { -40.0, -4.0, 5.0, 1.0 }; /* 光源の位置    */ static int r = 0;/*回転角*/ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //ウィンドウ塗りつぶし。引数は塗りつぶすバッファを指定 glLoadIdentity(); gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); /* 光源の位置設定 */ glLightfv(GL_LIGHT0, GL_POSITION, lightpos); glLightfv(GL_LIGHT1, GL_POSITION, light1pos); /* モデルビュー変換行列の保存 */ // glPushMatrix(); /*図形の回転*/ glRotated((double)r,0.0,1.0,0.0); /* ビー玉 */ glPushMatrix(); glTranslated(pbx+0.5, 0.0, pbz); glRotated((double)(2 * r), 1.0, 1.0, 0.0); glMaterialfv(GL_FRONT, GL_DIFFUSE, bcolor); glutSolidSphere(R, 32, 16); glPopMatrix(); glPushMatrix(); glTranslated(pbx/2.0, 0.0, pbz); glRotated((double)r, 1.0, 1.0, 0.0); glMaterialfv(GL_FRONT, GL_DIFFUSE, blue); glutSolidSphere(R/2.0, 32, 16); glPopMatrix(); glutSwapBuffers(); 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(0.2,0.2,0.2,1.0); //ウィンドウ塗りつぶしの色設定。引数は(R,G,B,不透明度)、値は0から1 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[]) { glutInit(&argc,argv); //OpenGL環境を初期化 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); //表示設定。引数にカラーモードを設定。(GLUIT_RGBA;RGBで設定。GLUT_INDEX:インデックスカラーモード) glutCreateWindow(argv[0]); //ウィンドウを開く。引数にはウィンドウの名前 glutDisplayFunc(display); //ウィンドウ内に描く関数 glutReshapeFunc(resize); glutMouseFunc(mouse); glutKeyboardFunc(keyboard); init(); glutMainLoop(); //イベントの受け待ち。無限ループ return 0; }