Задание:
Необходимо создать сцену, состоящую из двух перемещающихся в пространстве фигур. Одну из них нужно нарисовать с помощью треугольников самостоятельно, для построения второй можно использовать библиотечные функции GLU/GLUT.
Обе фигуры должны перемещаться в пространстве и вращаться вокруг своей оси. Направление и форма движения на ваше усмотрение.
Пользователь должен иметь возможность интерактивно выбирать режим отображения: каркас или закрашенные фигуры, а также менять проекцию с ортогональной на перспективную и обратно.
Пользователь должен иметь возможность изменять положение камеры с помощью клавиатуры или мыши (одно из двух).
Пользователь должен иметь возможность изменять цвет фигур. Лучше всего воспользоваться для этого диалоговым окном выбора цвета (у каждой фигуры свой цвет). Добавить рассеянное освещение.
Пользователь должен иметь возможность менять цвет и интенсивность рассеянного освещения. Добавить источники света, два прожектора.
Пользователь может включать/выключать источники света, задавать цвет и интенсивность излучаемого света. Прожекторы тоже перемещаются в пространстве, их следует представить визуально в виде конусов. Реализовать зеркальное отражение — на поверхности фигур должны появляться блики от источников света.
По варианту необходимо нарисовать следующие фигуры:
Четырехугольная усеченная пирамида и сфера.
Фрагмент программы, рисующий изображение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
void Render() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); static float Shininess=127; glMatrixMode(GL_MODELVIEW); glPushMatrix(); glTranslatef(dx,dy,dz); glRotatef(SceneAngleY,0.0f,1.0f,0.0f); glRotatef(SceneAngleX,-1.0f,0.0f,0.0f); static const float cutoff=25; static const float cutoff180=180; static const float exponent=10.0f; glPushMatrix(); glTranslatef(-5.0f,0.0f,0.0f); glRotatef(alpha,0.0f,1.0f,0.0f); glMaterialiv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,Colors[SPHERE_COLOR]); glMaterialiv(GL_FRONT,GL_SPECULAR,Colors[SPHERE_COLOR]); glMaterialfv(GL_FRONT,GL_SHININESS,&Shininess); if (IsSolid) glutSolidSphere(2.0f,GRAPH_QUALITY,GRAPH_QUALITY); else glutWireSphere(2.0f,GRAPH_QUALITY,GRAPH_QUALITY); glPopMatrix(); glPushMatrix(); glRotatef(theta,0.0f,1.0f,0.0f); glTranslatef(-5.0f,0.0f,0.0f); glMaterialiv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,Colors[PYRAMID_COLOR]); glMaterialiv(GL_FRONT,GL_SPECULAR,Colors[PYRAMID_COLOR]); glBegin(GL_TRIANGLE_FAN); glNormal3f(0.0f,-1.0f,0.0f); glVertex3f(-3.0f,-3.0f,-3.0f); glVertex3f(-3.0f,-3.0f,3.0f); glVertex3f(3.0f,-3.0f,3.0f); glVertex3f(3.0f,-3.0f,-3.0f); glEnd(); glBegin(GL_TRIANGLE_FAN); glNormal3f(0.0f,1.0f,0.0f); glVertex3f(-2.0f,3.0f,-2.0f); glVertex3f(-2.0f,3.0f,2.0f); glVertex3f(2.0f,3.0f,2.0f); glVertex3f(2.0f,3.0f,-2.0f); glEnd(); glBegin(GL_TRIANGLE_FAN); glNormal3f(0.0f,1.0f,6.0f); glVertex3f(-2.0f,3.0f,2.0f); glVertex3f(-3.0f,-3.0f,3.0f); glVertex3f(3.0f,-3.0f,3.0f); glVertex3f(2.0f,3.0f,2.0f); glEnd(); glBegin(GL_TRIANGLE_FAN); glNormal3f(0.0f,1.0f,-6.0f); glVertex3f(-2.0f,3.0f,-2.0f); glVertex3f(2.0f,3.0f,-2.0f); glVertex3f(3.0f,-3.0f,-3.0f); glVertex3f(-3.0f,-3.0f,-3.0f); glEnd(); glBegin(GL_TRIANGLE_FAN); glNormal3f(-6.0f,1.0f,0.0f); glVertex3f(-2.0f,3.0f,-2.0f); glVertex3f(-3.0f,-3.0f,-3.0f); glVertex3f(-3.0f,-3.0f,3.0f); glVertex3f(-2.0f,3.0f,2.0f); glEnd(); glBegin(GL_QUADS); glNormal3f(6.0f,1.0f,0.0f); glVertex3f(2.0f,3.0f,-2.0f); glVertex3f(2.0f,3.0f,2.0f); glVertex3f(3.0f,-3.0f,3.0f); glVertex3f(3.0f,-3.0f,-3.0f); glEnd(); glPopMatrix(); glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0,GL_POSITION,pos); static GLfloat dir[]={0.0f,-1.0f,0.0f}; glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,dir); glLightiv(GL_LIGHT0,GL_DIFFUSE,Colors[LIGHT0_COLOR]); glLightiv(GL_LIGHT0,GL_SPECULAR,Colors[LIGHT0_COLOR]); if (Spot) { glLightfv(GL_LIGHT0,GL_SPOT_CUTOFF,&cutoff); glLightfv(GL_LIGHT0,GL_SPOT_EXPONENT,&exponent); } else { glLightfv(GL_LIGHT0,GL_SPOT_CUTOFF,&cutoff180); } glEnable(GL_LIGHT1); static GLfloat dir1[]={1.0f,0.0f,0.0f}; glLightfv(GL_LIGHT1,GL_POSITION,pos1); glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,dir1); glLightiv(GL_LIGHT1,GL_DIFFUSE,Colors[LIGHT1_COLOR]); glLightiv(GL_LIGHT1,GL_SPECULAR,Colors[LIGHT1_COLOR]); if (Spot) { glLightfv(GL_LIGHT1,GL_SPOT_CUTOFF,&cutoff); glLightfv(GL_LIGHT0,GL_SPOT_EXPONENT,&exponent); } else { glLightfv(GL_LIGHT1,GL_SPOT_CUTOFF,&cutoff180); } glTranslatef(-dx,-dy,-dz); glMaterialiv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,&(Colors[SCENE_COLOR][0])); glMaterialiv(GL_FRONT,GL_SPECULAR,&(Colors[SCENE_COLOR][0])); const float SIZE=100.0f; const float SIZER=100.0f/float(GRAPH_QUALITY)+1.0f; glNormal3f(0.0f,1.0f,0.0f); for (float n=-SIZE;n<SIZE;n+=SIZER) { for (float m=-SIZE; m<SIZE; m+=SIZER) { glBegin(GL_POLYGON); glVertex3i(n,-30,m); glVertex3i(n,-30,m+SIZER); glVertex3i(n+SIZER,-30,m+SIZER); glVertex3i(n+SIZER,-30,m); glEnd(); } } glPopMatrix(); glFlush(); } |
Вывод:
OpenGL является хорошей библиотекой для создания трёхмерной графики.