/* * 曲面 */ #include GLfloat ctrlpoints[48] = { -2.0, 2.0, 0.0, -2.0, 0.0, 0.0, -2.0, 0.0, 0.0, -2.0, -2.0, 0.0, 0.0, 2.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, -2.0, -1.0, 0.0, 2.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, -2.0, -1.0, 2.0, 2.0, 0.0, 2.0, 0.0, 0.0, 2.0, 0.0, 0.0, 2.0, -2.0, 0.0, }; /* 初期化 */ void init(void) { GLfloat lightPos[] = {0.0, 0.0, -1.0, 1.0}; GLfloat lightDif[] = {1.0, 1.0, 1.0, 1.0}; /* 背景色の指定 RGBA */ glClearColor(0.0, 0.0, 0.0, 0.0); /* 光源の設定 */ glLightfv(GL_LIGHT0, GL_POSITION, lightPos); glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDif); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); /* 曲面を使用可 */ glEnable(GL_MAP2_VERTEX_3); } void resize(int w, int h) { /* ビューポートの設定 */ glViewport(0, 0, w, h); /* 射影変換モードに */ glMatrixMode(GL_PROJECTION); /* 変換行列を単位行列に */ glLoadIdentity(); /* 透視射影の視野台形 左、右、下、上、手前、奥 */ glFrustum(-1.33, 1.33, -1.0, 1.0, 1.0, 5.0); /* モデル変換モードに戻す */ glMatrixMode(GL_MODELVIEW); } /* 画面表示 */ void display(void) { GLfloat red[] = {1.0, 0.0, 0.0, 1.0}; GLfloat yellow[] = {1.0, 1.0, 0.0, 1.0}; int i, j; /* 背景色でクリア */ glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glTranslated(0.0, 0.0, -3.0); glPushMatrix(); /* 曲面の指定 */ glMap2f(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4, ctrlpoints); /* 曲面の細かさを指定 u 方向 v 方向 */ glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, red); /* 曲面の描画 */ glEvalMesh2(GL_FILL, 0, 20, 0, 20); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, yellow); /* グリッド曲面の描画 */ for(j = 0; j <= 4; j++){ glBegin(GL_LINE_STRIP); for(i = 0; i <= 30; i++){ glEvalCoord2f((GLfloat)i/30.0, (GLfloat)j/4.0); } glEnd(); glBegin(GL_LINE_STRIP); for(i = 0; i <= 30; i++){ glEvalCoord2f((GLfloat)j/4.0, (GLfloat)i/30.0); } glEnd(); } glPopMatrix(); glFlush(); } int main(int argc, char *argv[]) { /* GLUT の初期設定 */ glutInit(&argc, argv); glutInitWindowPosition(100, 50); glutInitWindowSize(400, 300); glutInitDisplayMode(GLUT_RGBA); glutCreateWindow(argv[0]); /* 各関数の指定 */ glutDisplayFunc(display); glutReshapeFunc(resize); /* 初期設定 */ init(); /* メインループ */ glutMainLoop(); return 0; }