#include <gl/glut.h> #include <gl/gle.h> //---------- プロトタイプ宣言 --------------// void display(); void reshape(int w, int h); void DRAW_XYZ(); void timer(int value); //輪郭(三角形) double contour[3][2]= { {0,1}, {-1,-0.5}, {1,-0.5} }; //輪郭の法線 double cont_normal[3][2]= { {-0.554,0.832}, {0,-1}, {0.554,0.832} }; //面のどこを天上にするか? double upvec[3]={0,1,0}; //押し出しの軌道 double point_ary[5][3]= { {0,-0.5,-1}, {0,0,0}, {0,0.5,1}, {0,1,2}, {0,1.5,2.5} }; double twist_ary[]={0,20,40,50,0};//描画にかかわる2,3,4番目の要素に角度を設定 //------------ OpenGLの初期化 ------------------// void GLUT_CALL_FUNCs() { glutDisplayFunc(display); glutReshapeFunc(reshape); glutTimerFunc(0,timer,34); } void OtherMyInit() { glClearColor(1.0, 1.0, 1.0, 1.0); glEnable(GL_DEPTH_TEST); //光源の有効化 glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); //glColorによる材質設定 glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); //描画スタイル gleSetJoinStyle (TUBE_NORM_EDGE | TUBE_JN_ANGLE | TUBE_JN_CAP| TUBE_CONTOUR_CLOSED ); } void GLUT_INITs(int *argcp, char **argv) { glutInit(argcp,argv); glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(640,480); glutCreateWindow("GLE Twist Extrusion 1"); GLUT_CALL_FUNCs(); OtherMyInit(); } //--------- メイン関数 ----------------// int main(int argc, char **argv) { GLUT_INITs(&argc,argv); glutMainLoop(); return 0; } //------------- ここから各種コールバック -----------------// void display() { 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); static int r = 0; static float Light0Pos[]={10,10,10,0}; //光源の位置 glLightfv(GL_LIGHT0, GL_POSITION, Light0Pos);//位置だけ設定(あとはデフォルト) glRotatef(static_cast<float>(r),0,1,0); glColor3f(0,1,0); gleTwistExtrusion(3,contour,cont_normal,upvec,5,point_ary,NULL,twist_ary); DRAW_XYZ(); glutSwapBuffers(); if(++r > 360) r= 0; } void reshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0, (double)w / (double)h, 1.0, 200.0); glMatrixMode(GL_MODELVIEW); } void timer(int t) { glutPostRedisplay(); glutTimerFunc(t,timer,34); //タイマー関数 } void DRAW_XYZ() { glDisable(GL_LIGHTING);//光源の有効化 glDisable(GL_LIGHT0); glBegin(GL_LINES); glColor3f(0,1,0);//x glVertex2f(-100,0); glVertex2f(100, 0); glColor3f(1,0,0);//y glVertex2f(0,0); glVertex2f(0,100); glColor3f(0,0,1);//z glVertex3f(0,0,-100); glVertex3f(0,0, 100); glEnd(); glEnable(GL_LIGHTING);//光源の有効化 glEnable(GL_LIGHT0); }