Создание компьютерной графики при помощи OpenGL

1.        Напишитепрограмму вывода графика функции y= tg(x)+5*cos(x), с помощью точек, азатем с помощью линий.
1.1     Спомощью точек
 
Решение:
#include
#include
#include
#include
#include
GLintwindW, windH;
voidCALLBACK Reshape(int width, int height)
{glViewport(0, 0, width, height);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluOrtho2D(-15,15,-15,15);
 glMatrixMode(GL_MODELVIEW);
}
voidCALLBACK Draw(void)
{       
glClearColor(1.0,1.0,1.0,1);
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINES);
         glColor3ub(190,190,190);
         for(int i=-4; i
                   {
                   glVertex2f(float(i),-6);//явное преобразование типа
                   glVertex2f(float(i),15);
                   }
         for(i=-6; i
                   {
                   glVertex2f(-4,float(i));
                   glVertex2f(4,float(i));
                   }
glEnd();
glColor3ub(0,0,0);
glBegin(GL_LINES);
         glVertex2f(-5, 0);
         glVertex2f(5,0);
         glVertex2f(0,16);
         glVertex2f(0,-7);
glEnd();
glPointSize(2);
glBegin(GL_POINTS);
         glColor3ub(0,0,255);
         intn;
         doublea,b,dx,x,y;
         a=-1.415;
         b=1.5;
         n=20;
         dx=(b-a)/(n-1);
         x=a;
         y=0;
         for(i=1; i
                   {
                   y=float(tan(x)+5*cos(x));
                  
                   glVertex2d (x, y);
                   x=x+dx;
                   }
glEnd();
glFinish();
auxSwapBuffers();
}
voidmain(int argc, char **argv)
{
windW= 800;
windH= 800;
auxInitPosition(100,100, windW, windH);
auxInitDisplayMode(AUX_RGB| AUX_DOUBLE);
auxInitWindow(«v11_01_1»);
glTranslated(0,-4,0);
auxReshapeFunc(Reshape);
auxMainLoop(Draw);
}

Результат:
/>
2.2     спомощью линий
 
Решение:
 
#include
#include
#include
#include
#include
GLintwindW, windH;
voidCALLBACK Reshape(int width, int height)
{glViewport(0, 0, width, height);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluOrtho2D(-15,15,-15,15);
 glMatrixMode(GL_MODELVIEW);
}
voidCALLBACK Draw(void)
{       
glClearColor(1.0,1.0,1.0,1);
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINES);
         glColor3ub(190,190,190);
         for(int i=-4; i
                   {
                   glVertex2f(float(i),-6);//явное преобразование типа
                   glVertex2f(float(i),15);
                   }
         for(i=-6; i
                   {
                   glVertex2f(-4,float(i));
                   glVertex2f(4,float(i));
                   }
glEnd();
glColor3ub(0,0,0);
glBegin(GL_LINES);
         glVertex2f(-5, 0);
         glVertex2f(5,0);
         glVertex2f(0,16);
         glVertex2f(0,-7);
glEnd();
glBegin(GL_LINE_STRIP);
         glColor3ub(0,0,255);
         intn;
         doublea,b,dx,x,y;
         a=-1.415;
         b=1.5;
         n=100;
         dx=(b-a)/(n-1);
         x=a;
         y=0;
         for(i=1; i
                   {
                   y=float(tan(x)+5*cos(x));
                  
                   glVertex2d(x, y);
                   x=x+dx;
                   }
glEnd();
glFinish();
auxSwapBuffers();
}
voidmain(int argc, char **argv)
{
windW= 800;
windH= 800;
auxInitPosition(100,100, windW, windH);
auxInitDisplayMode(AUX_RGB| AUX_DOUBLE);
auxInitWindow(«v11_01_1»);
glTranslated(0,-4,0);
auxReshapeFunc(Reshape);
auxMainLoop(Draw);
}
Результат:
/>

2.        Нарисуйтекаркас призмы, в основании которой лежит правильный 14-угольник
Решение:
//v11_02
#include
#include
#include
#include
#include
voidCALLBACK resize (int width, int height)
{
glViewport(0,0,width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-15,15,-10,10,-10,20);
gluLookAt(1,-1,1,0,0,0, 0,0,1);
glMatrixMode(GL_MODELVIEW);
}
voidCALLBACK display (void)
{
GLUquadricObj*quadObj;
quadObj= gluNewQuadric();
glClearColor(1.0,1.0,1.0,1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3d(0,0,1);
//каркас
gluQuadricDrawStyle(quadObj,GLU_SILHOUETTE);
//призма восновании которой лежит правильный 14-угольник
gluCylinder(quadObj,2, 2, 5, 14, 14);
glBegin(GL_LINES);
         glColor3ub(0,0, 0);
         glVertex2f(6,0);
         glVertex2f(-6,0);
         glVertex2f(0,6);
         glVertex2f(0,-6);
         glVertex3f(0,0, 0);
         glVertex3f(0,0, 8);
         for(int i=-5; i
                   {
                   if(i!=0)
                   {
                   glColor3ub(190,190,190);
                   glVertex2f(float(i),-5);
                   glVertex2f(float(i),5);
                   }
                   }
         for(i=-5; i
                   {
                   if(i!=0)
                   {
                   glColor3ub(190,190,190);
                   glVertex2f(-5,float(i));
                   glVertex2f(5,float(i));
                   }
                   }
glEnd();
glFinish();
auxSwapBuffers();
}
voidmain ()
{
auxInitPosition(100,100,800,600);
auxInitDisplayMode(AUX_RGB | AUX_DEPTH | AUX_DOUBLE);
auxInitWindow(«v11_02»);
glScaled(1.5,1.5, 1.5);
glTranslated(0,0,-1);
auxIdleFunc(display);
auxReshapeFunc(resize);
glEnable(GL_DEPTH_TEST);
auxMainLoop(display);
}

Результат:
/>

3.        Напишитепрограмму вывода графика функции x=2*sin(z)*cos(y)-3*tg(y) используя алгоритмплавающего горизонта. Модифицируйте программу таким образом, чтобы поверхностьсостояла из четырехугольников
Решение:
 
#include
#include
#include
#include
#include
// запретить выводпредупреждений о преобразовании данных
#pragmawarning(disable: 4305) // MIPS
#pragmawarning(disable: 4244) // MIPS
GLint windW,windH;
void CALLBACKReshape(int width, int height)
{
 windW =(GLint)width;
 windH =(GLint)height;
}
int alpha=0,beta=0;
void CALLBACKKey_LEFT(void)
{
 alpha -= 5;
}
void CALLBACKKey_RIGHT(void)
{
 alpha += 5;
}
void CALLBACKKey_UP(void)
{
 beta += 5;
}
void CALLBACKKey_DOWN(void)
{
 beta -= 5;
}
void CALLBACKInitViewport(int x, int y, int width, int height)
{
 glViewport(x,y, width, height);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 glOrtho(-windW,windW,-windH,windH, windH/1000,windH*1000);
 gluLookAt(0,0,windH,0,0,0, 1,0,0);
 glMatrixMode(GL_MODELVIEW);
}
void CALLBACKDraw(void)
{
         floatx,y,z;
         floatd=10;
         InitViewport(0,0,windW, windH);
 glColor3d(0,1,0);
 glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
 
         for(y=-windH/1.3; y
         {glBegin(GL_QUADS);
         for(z=-windW/1.3; z
         {
 
                   x=2*sin(z)*cos(y)-3*tan(y);
                   glVertex3f(x,y,z);
                   glVertex3f(x,y+d,z);
                  
                  
                   x=2*sin(z+d)*cos(y+d)-3*tan(y+d);
                   glVertex3f(x,y+d,z+d);
                   glVertex3f(x,y,z+d);
                                     
         }
glEnd();
         }
glFinish();
        
}
void CALLBACKTurn(void)
{
 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
 
 glPushMatrix();
 glRotated(alpha,0,1,0);
 glRotated(beta,-1,0,0);
 Draw();
 glPopMatrix();
 
 auxSwapBuffers();
 glFinish();
}
void main(intargc, char **argv)
{
 windW = 800;
 windH =600;
 auxInitPosition(0,0, windW, windH);
 auxInitDisplayMode(AUX_RGB| AUX_DEPTH | AUX_DOUBLE);
 if(auxInitWindow(«v11_03»)== GL_FALSE) {
 auxQuit();
 }
 auxExposeFunc((AUXEXPOSEPROC)Reshape);
 auxReshapeFunc((AUXRESHAPEPROC)Reshape);
 auxIdleFunc(Turn);
 auxKeyFunc(AUX_LEFT,Key_LEFT);
 auxKeyFunc(AUX_RIGHT,Key_RIGHT);
 auxKeyFunc(AUX_UP,Key_UP);
 auxKeyFunc(AUX_DOWN,Key_DOWN);
 auxMainLoop(Turn);
}
Результат:
/>
/>
 

4.        Напишитепрограмму вывода вращающего тора относительно своей оси x, с одновременнымдвижением по следующей траектории z=sin(y)
Решение:
//v11_04
#include
#include
#include
#include
#include
intflag=1;
voidCALLBACK resize (int width, int height)
{
glViewport(0,0,width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-15,15,-10,10,-10,20);
gluLookAt(1,-1,1,0,0,0, 0,0,1);
glMatrixMode(GL_MODELVIEW);
}
voidCALLBACK display (void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3d(0,1,0);
floatpos[4]={0,7.5,7.5,1};
staticdouble time=0;
floaty,z;
y=0;
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0,GL_POSITION, pos);
glPushMatrix();
y=float(time/100);
z=float(sin(y));     //float(); преобразование типа
//движениемпо следующей траектории z=sin(y)
glTranslated(0,y,z);
//вращающеготора относительно оси x
glRotated(time,1,0,0);
if(y>11 && flag==1)
{
flag=2;
}
if(y
{
flag=1;
}
if(flag==2)
{
time–;
}
else
{
time++;
}
auxSolidTorus(0.15,0.5);
glPopMatrix();
// системакоординат XYZ
glBegin(GL_LINES);
glColor3ub(255,0, 0);
glVertex3f(5,0, 0);
glVertex3f(-5,0, 0);
// х красный
glColor3ub(0,255, 0);
glVertex3f(0,11, 0);
glVertex3f(0,-4, 0);
//y зеленый
glColor3ub(0,0, 255);
glVertex3f(0,0, 0);
glVertex3f(0,0, 5);
//z синий
glEnd();     
glFinish();
auxSwapBuffers();
}
voidmain ()
{
auxInitPosition(100,100,800,600);
auxInitDisplayMode(AUX_RGB | AUX_DEPTH | AUX_DOUBLE);
auxInitWindow(«v11_04»);
glScaled(1.5,1.5, 1.5);
glTranslated(0,-3,0);
auxIdleFunc(display);
auxReshapeFunc(resize);
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
auxMainLoop(display);
}
Результат:
/>

5.        Напишитепрограмму мерцающего звездного неба
Решение:
 
#include
#include
#include
#include
#include
#include
#include
#include
#include
int t_sec()// считывание секунд с системных часов
{
structtm *newtime;
time_taclock;
time(&aclock);
newtime= localtime(&aclock);
asctime(newtime);
ints=newtime->tm_sec;
returns;
}
voidCALLBACK resize (int width, int height)
{
glViewport(0,0,width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-100,100,-100,100);
glMatrixMode(GL_MODELVIEW);
}
voidCALLBACK Draw (void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
intc, x, y, p;
srand(t_sec());
//заданиестартовой точки
//длягенерации случайных чисел
for(int i=0;i
{
c=rand()%255;//генерация случайных чисел от 0 до 255
x=rand()%200;//генерация случайных чисел от 0 до 200
y=rand()%200;//генерация случайных чисел от 0 до 200
p=rand()%3;
glPointSize(p);
glBegin(GL_POINTS);
glColor3ub(c,c,c);
glVertex2d(x,y);
glEnd();
}
auxSwapBuffers();
}
voidmain ()
{
auxInitPosition(100,100,800,800);
auxInitDisplayMode(AUX_RGB | AUX_DEPTH | AUX_DOUBLE);
auxInitWindow(«v11_06»);
glTranslated(-100,-100,0);
auxIdleFunc(Draw);
auxReshapeFunc(resize);
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
auxMainLoop(Draw);
}
Результат:
/>

6.        Изобразитерадугу состоящую из полигонов, которая освещается прожектором. Направлениесвета прожектора постоянно меняется и скользит вдоль радуги
Решение:
#include
#include
#include
#include
#include
#include
#include
#include
#include
intflag=1;
voidCALLBACK resize (int width, int height)
{
glViewport(0,0,width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//glOrtho(-20,20,-15,15,-10,25);
glOrtho(-6,6,-6,6,-20,20);
gluLookAt(1,-1,1,0,0,0, 0,0,1);
//gluLookAt(0,-5,0,0,0,0, 0,0,1);
glMatrixMode(GL_MODELVIEW);
}
voidCALLBACK Draw (void)
{
staticdouble time=0;
GLUquadricObj*quadObj;
quadObj= gluNewQuadric();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
floatx=time/100-2.2;
floatz=pow((pow(2.4,2)-pow(x,2)),0.5);
if(x>2.2 && flag==1)
{
flag=2;
}
if(x
{
flag=1;
}
if(flag==2)
{
time–;
}
else
{
time++;
}
floatdir[3]={x,0.1,z};
floatpos[4]={0,-1,0,1};
 //включение нулевой лампы
GLfloatlight_diffuse[]={3.0,3.0,3.0,1.0};
glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
glLightfv(GL_LIGHT0,GL_POSITION, pos);
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION, dir);
glLightf(GL_LIGHT0,GL_SPOT_CUTOFF, 90);
glLightf(GL_LIGHT0,GL_SPOT_EXPONENT, 9);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);        
glEnable(GL_DEPTH_TEST);
glPopMatrix();
glPushMatrix();
glRotated(90,1,0,0);
gluQuadricDrawStyle(quadObj,GLU_FILL);
//К
glColor3ub(255,0, 0);
gluPartialDisk(quadObj,2, 2.2, 30, 30, -90, 180);
//О
glColor3ub(255,125, 0);
gluPartialDisk(quadObj,2.2, 2.4, 30, 30, -90, 180);
//Ж
glColor3ub(255,255, 0);
gluPartialDisk(quadObj,2.4, 2.6, 30, 30, -90, 180);
//З
glColor3ub(0,255, 0);
gluPartialDisk(quadObj,2.6, 2.8, 30, 30, -90, 180);
//Г
glColor3ub(0,255, 255);
gluPartialDisk(quadObj,2.8, 3, 30, 30, -90, 180);
//С
glColor3ub(0,0, 255);
gluPartialDisk(quadObj,3, 3.2, 30, 30, -90, 180);
//Ф
glColor3ub(255,0, 255);
gluPartialDisk(quadObj,3.2, 3.4, 30, 30, -90, 180);
glPopMatrix();
glDisable(GL_LIGHTING);
auxSwapBuffers();
}
voidmain ()
{
auxInitPosition(100,100,800,800);
auxInitDisplayMode(AUX_RGB | AUX_DEPTH | AUX_DOUBLE);
auxInitWindow(«v11_06»);
glTranslated(3,-3,2);
glEnable(GL_COLOR_MATERIAL); // установка свойств материала
auxIdleFunc(Draw);
auxReshapeFunc(resize);
auxMainLoop(Draw);
}
Результат:
/>

7.        Напишитепрограмму вывода цилиндра, на котором наложена текстура. Создайте эффектсползания текстуры с цилиндра. Вокруг цилиндра вращается несколько полупрозрачныхнебольших сфер по спирали
Решение
#include
#include
#include
#include
#include
#include
#include
#include
#include
intflag0=1;
intflag1=1;
intflag2=1;
intflag3=1;
unsignedint image1_ID;
AUX_RGBImageRec*image1;
voidCALLBACK resize (int width, int height)
{
glViewport(0,0,width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-6,6,-6,6,-20,20);
gluLookAt(1,-1,1,0,0,0, 0,0,1);
glMatrixMode(GL_MODELVIEW);
}
voidCALLBACK Draw (void)
{
staticdouble time0=0;
staticdouble time1=0;
staticdouble time2=0;
staticdouble time3=0;
GLUquadricObj*quadObj;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3d(1,1,1);
floatpos[4]={3,-3,5,1};
glLightfv(GL_LIGHT0,GL_POSITION, pos);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);        
glEnable(GL_DEPTH_TEST);
quadObj= gluNewQuadric();
floats=0.9-(time0/800);
if(s
{flag0=2;}
if(s>0.9 && flag0==2)
{flag0=1;}
if(flag0==1)
{time0++;}
else
{time0–;}
constfloat p[4]={0,0,s,0};
glPushMatrix();
glEnable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glTexGeni(GL_S,GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGeni(GL_T,GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGenfv(GL_T,GL_OBJECT_PLANE,p);
glRotated(-180,1,0,0);
glTranslated(0,0,-3);
glColor3d(1,1,0);
gluCylinder(quadObj,1, 1, 3, 50, 50);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_2D);
glPopMatrix();
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glPushMatrix();
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
doublez1=time1/300;
glRotated(time1,0,0,1);
glTranslated(1.3,0,1);
glTranslated(0,0,z1);
if(z1>2 && flag1==1)
{flag1=2;}
if(z1
{flag1=1;}
glColor4d(0,1,0,0.1);
auxSolidSphere(0.2);//s1
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);
if(flag1==1)
{time1++;}
else
{time1–;}
glPopMatrix();
glPushMatrix();
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
doublez2=time2/600;
glRotated(time2*2,0,0,15);
glTranslated(1.8,0,1);
glTranslated(0,0,z2);
if(z2>2 && flag2==1)
{flag2=2;}
if(z2
{flag2=1;}
glColor4d(1,0,0,0.1);
auxSolidSphere(0.2);//s2
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);
if(flag2==1)
{time2++;}
else
{time2–;}
glPopMatrix();
glPushMatrix();
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
doublez3=time3/400;
glRotated(time3*3,0,0,1);
glTranslated(2.3,0,1);
glTranslated(0,0,z3);
if(z3>2 && flag3==1)
{flag3=2;}
if(z3
{flag3=1;}
glColor4d(0,0,1,0.2);
auxSolidSphere(0.2);//s3
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);
if(flag3==1)
{time3++;}
else
{time3–;}
glPopMatrix();
gluDeleteQuadric(quadObj);
auxSwapBuffers();
}
voidmain ()
{
auxInitPosition(100,100,800,800);
auxInitDisplayMode(AUX_RGB | AUX_DEPTH | AUX_DOUBLE);
auxInitWindow(«v11_07»);
glTranslated(0,0,-1);
glEnable(GL_COLOR_MATERIAL); // установка свойств материала
image1= auxDIBImageLoad(«v11_07.bmp»);
glGenTextures(1,&image1_ID);
glBindTexture(GL_TEXTURE_2D,image1_ID);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0, 3,
 image1->sizeX,
                    image1->sizeY,
                    0,GL_RGB, GL_UNSIGNED_BYTE,
                    image1->data);
auxIdleFunc(Draw);
auxReshapeFunc(resize);
auxMainLoop(Draw);
}
Результат:
/>