//2つの球体のアルファ値を変化させるプログラム #include #include #include #include #include static double ex = 0.0, ez = 0.0, ey = 0.0; /* 視点の位置 */ static double the = 0.0, phi = 0.0; /* 視点の向き */ static GLfloat lit_amb[4]={0.2, 0.2, 0.2, 1.0}; /* 環境光 */ static GLfloat lit_dif[4]={0.5, 0.5, 0.5, 1.0}; /* 拡散光 */ static GLfloat lit_spc[4]={0.5, 0.5, 0.5, 1.0}; /* 鏡面光 */ static GLfloat lit_pos[4]={0.0, 0.5, 0.0, 1.0}; /* 光源の位置 */ static GLfloat lit_shi[1]={30.0}; /* ハイライト */ static GLfloat lit_emi[4]={0.0,0.0,0.0,0.0}; /* 発光係数 */ static GLfloat spotDirrection[]={0.0, 0.0, -1.0}; /* 光源の向き */ static GLfloat green1[] = { 0.2, 0.8, 0.2, 0.5 }; static GLfloat green2[] = { 0.2, 0.8, 0.2, 1 }; static int check = 1; void scene(void) { glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, lit_amb); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, lit_dif); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, lit_spc); glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, lit_shi); glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, lit_emi); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glDisable(GL_DEPTH_TEST); /* 緑の玉1 */ glPushMatrix(); glTranslated(-0.03, 0.0, -3.0); glMaterialfv(GL_FRONT, GL_DIFFUSE, green1); glutSolidSphere(0.5,30,30); glPopMatrix(); /* 緑の玉2 */ glPushMatrix(); glTranslated(0.03, 0.0, -3.0); glMaterialfv(GL_FRONT, GL_DIFFUSE, green2); glutSolidSphere(0.5,30,30); glPopMatrix(); switch(check){ case 0: green1[3]+=0.01; green2[3]=1.0-green1[3]; if(green1[3] > 1){ green1[3]=1.0; check = 1; } break; case 1: green1[3]-=0.01; green2[3]=1.0-green1[3]; if(green1[3] < 0){ green1[3]=0.0; check = 0; } break; } } void display(void) { /* 画面クリア */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); /* 光源設定 */ glLightfv(GL_LIGHT0, GL_AMBIENT, lit_amb); glLightfv(GL_LIGHT0, GL_DIFFUSE, lit_dif); glLightfv(GL_LIGHT0, GL_SPECULAR, lit_spc); glLightfv(GL_LIGHT0, GL_POSITION, lit_pos); glLightfv(GL_LIGHT0, GL_SHININESS, lit_shi); glLightfv(GL_LIGHT0, GL_EMISSION, lit_emi); glLightf( GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.01); glLightfv( GL_LIGHT0, GL_SPOT_DIRECTION, spotDirrection ); //スポットライトの向ける方向(デフォルト (0,0,-1.0)) glLightf( GL_LIGHT0, GL_SPOT_CUTOFF, 25.0 );// スポットライトの絞り(デフォルト 180.0) glLightf( GL_LIGHT0, GL_SPOT_EXPONENT, 0.1 );// スポットライトの中心からの減衰の度合い(デフォルト 0) glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glEnable(GL_BLEND); /* シーンの描画 */ scene(); glutSwapBuffers(); glDepthMask(GL_TRUE); } void idle(void) { glutPostRedisplay(); } void movedisplay(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glPushMatrix(); scene(); glPopMatrix(); glutSwapBuffers(); glDepthMask(GL_TRUE); } 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(); } void timer(int value) { glutPostRedisplay(); glutTimerFunc(20 , timer , 0); } void keyboard(unsigned char key, int x, int y) { switch (key) { case '\033': // ESC 終了 exit(0); break; default: break; } } void init(void) { /* 初期設定 */ glClearColor(1.0, 1.0, 1.0, 0.0); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); 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); glutTimerFunc(20, timer , 0); glutReshapeFunc(resize); glutKeyboardFunc(keyboard); init(); glutMainLoop(); return 0; }