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

1. Напишите программу вывода графика функции y = tg ( x )+5* cos ( x ), с помощью точек, а затем с помощью линий.

1.1 С помощью точек

Решение :

#include <windows. h>

#include <gl\gl. h>

#include <gl\glu. h>

#include <gl\glaux. h>

#include <math. h>

GLint windW, windH;

Void CALLBACK Reshape(int width, int height)

{ glViewport(0, 0, width, height);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(-15,15,-15,15);

glMatrixMode(GL_MODELVIEW);

}

Void CALLBACK 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<=4; i++)

{

glVertex2f(float(i), -6);//явное преобразование типа

GlVertex2f(float(i), 15);

}

for (i=-6; i<=15; 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);

int n;

double a, 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<=n; i++)

{

y=float(tan(x)+5*cos(x));

GlVertex2d (x, y);

X=x+dx;

}

GlEnd();

GlFinish();

AuxSwapBuffers();

}

Void main(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 <windows. h>

#include <gl\gl. h>

#include <gl\glu. h>

#include <gl\glaux. h>

#include <math. h>

GLint windW, windH;

Void CALLBACK Reshape(int width, int height)

{ glViewport(0, 0, width, height);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(-15,15,-15,15);

glMatrixMode(GL_MODELVIEW);

}

Void CALLBACK 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<=4; i++)

{

glVertex2f(float(i), -6);//явное преобразование типа

GlVertex2f(float(i), 15);

}

for (i=-6; i<=15; 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);

int n;

double a, 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<=n; i++)

{

y=float(tan(x)+5*cos(x));

glVertex2d (x, y);

x=x+dx;

}

GlEnd();

GlFinish();

AuxSwapBuffers();

}

Void main(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 <windows. h>

#include <GL/gl. h>

#include <GL/glu. h>

#include <GL/glaux. h>

#include <math. h>

Void CALLBACK 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);

}

Void CALLBACK 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<=5; i++)

{

if (i!=0)

{

glColor3ub(190,190,190);

glVertex2f(float(i), -5);

glVertex2f(float(i), 5);

}

}

for (i=-5; i<=5; i++)

{

if (i!=0)

{

glColor3ub(190,190,190);

glVertex2f(-5, float(i));

glVertex2f(5, float(i));

}

}

GlEnd();

GlFinish();

AuxSwapBuffers();

}

Void main ()

{

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 <windows. h>

#include <gl\gl. h>

#include <gl\glu. h>

#include <gl\glaux. h>

#include <math. h>

// запретить вывод предупреждений о преобразовании данных

#pragma warning(disable: 4305) // MIPS

#pragma warning(disable: 4244) // MIPS

GLint windW, windH;

Void CALLBACK Reshape(int width, int height)

{

windW = (GLint)width;

windH = (GLint)height;

}

Int alpha=0, beta=0;

Void CALLBACK Key_LEFT(void)

{

alpha -= 5;

}

Void CALLBACK Key_RIGHT(void)

{

alpha += 5;

}

Void CALLBACK Key_UP(void)

{

beta += 5;

}

Void CALLBACK Key_DOWN(void)

{

beta -= 5;

}

Void CALLBACK InitViewport(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 CALLBACK Draw(void)

{

float x, y,z;

float d=10;

InitViewport(0,0, windW, windH);

glColor3d(0,1,0);

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

for (y=-windH/1.3; y<=windH/1.3; y+=10)

{glBegin(GL_QUADS);

for (z=-windW/1.3; z<=windW/1.3; z+=10)

{

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 CALLBACK Turn(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(int argc, 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 <windows. h>

#include <GL/gl. h>

#include <GL/glu. h>

#include <GL/glaux. h>

#include <math. h>

Int flag=1;

Void CALLBACK 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);

}

Void CALLBACK display (void)

{

GlClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

GlColor3d(0,1,0);

Float pos[4]={0,7.5,7.5,1};

Static double time=0;

Float y, 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<-4 &;&; flag==2)

{

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();

}

Void main ()

{

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 <windows. h>

#include <GL/gl. h>

#include <GL/glu. h>

#include <GL/glaux. h>

#include<time. h>

#include <stdio. h>

#include <iostream. h>

#include <conio. h>

#include <math. h>

Int t_sec() // считывание секунд с системных часов

{

Struct tm *newtime;

Time_t aclock;

Time(&;aclock);

Newtime = localtime(&;aclock);

Asctime(newtime);

Int s=newtime->tm_sec;

Return s;

}

Void CALLBACK resize (int width, int height)

{

GlViewport (0,0,width, height);

GlMatrixMode (GL_PROJECTION);

GlLoadIdentity();

GluOrtho2D(-100,100,-100,100);

GlMatrixMode(GL_MODELVIEW);

}

Void CALLBACK Draw (void)

{

GlClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Int c, x, y, p;

Srand(t_sec());

//задание стартовой точки

//для генерации случайных чисел

For(int i=0; i<1000; 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();

}

Void main ()

{

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 <windows. h>

#include <GL/gl. h>

#include <GL/glu. h>

#include <GL/glaux. h>

#include<time. h>

#include <stdio. h>

#include <iostream. h>

#include <conio. h>

#include <math. h>

Int flag=1;

Void CALLBACK 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);

}

Void CALLBACK Draw (void)

{

Static double time=0;

GLUquadricObj *quadObj;

QuadObj = gluNewQuadric();

GlClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

GlPushMatrix();

Float x=time/100-2.2;

Float z=pow((pow(2.4,2)-pow(x,2)),0.5);

If (x>2.2 &;&; flag==1)

{

Flag=2;

}

If (x<-2.2 &;&; flag==2)

{

Flag=1;

}

If (flag==2)

{

Time–;

}

Else

{

Time++;

}

Float dir[3]={x,0.1,z};

Float pos[4]={0,-1,0,1};

// включениенулевойлампы

GLfloat light_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();

}

Void main ()

{

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 <windows. h>

#include <GL/gl. h>

#include <GL/glu. h>

#include <GL/glaux. h>

#include<time. h>

#include <stdio. h>

#include <iostream. h>

#include <conio. h>

#include <math. h>

Int flag0=1;

Int flag1=1;

Int flag2=1;

Int flag3=1;

Unsigned int image1_ID;

AUX_RGBImageRec* image1;

Void CALLBACK 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);

}

Void CALLBACK Draw (void)

{

Static double time0=0;

Static double time1=0;

Static double time2=0;

Static double time3=0;

GLUquadricObj *quadObj;

GlClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

GlColor3d(1,1,1);

Float pos[4]={3,-3,5,1};

GlLightfv(GL_LIGHT0, GL_POSITION, pos);

GlEnable(GL_LIGHTING);

GlEnable (GL_LIGHT0);

GlEnable (GL_DEPTH_TEST);

QuadObj = gluNewQuadric();

Float s=0.9-(time0/800);

If (s<0.01 &;&; flag0==1)

{flag0=2;}

If (s>0.9 &;&; flag0==2)

{flag0=1;}

If (flag0==1)

{time0++;}

Else

{time0–;}

Const float 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);

Double z1=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<-1 &;&; flag1==2)

{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);

Double z2=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<-1 &;&; flag2==2)

{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);

Double z3=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<-1 &;&; flag3==2)

{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();

}

Void main ()

{

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);

}

Результат:


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