Основные возможности OpenGL. Пример 1: Простое GLUT-приложение
Пример 1: Простое GLUT-приложение Этот простой пример предназначен для демонстрации структуры GLUT-приложения и простейших основ OpenGL. Результатом работы программы является случайный набор цветных прямоугольников, который меняется при нажатии левой кнопки мыши. С помощью правой кнопки мыши можно менять режим заливки прямоугольников. Пример №1
Пример 2 координатная плоскость, треугольник, обработка клавиш(Автор Солодовников Павел пми2009) #include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> #include <GL/glut.h> const double EPSILON = 0.00005; // константа для точности(...)
GLint Width = 600, Height = 600; GLint cW,cH;
GLfloat RESIZE_FACTOR_X = 60, RESIZE_FACTOR_Y = 60; GLfloat Multiplication_Marks = 1; GLfloat Mult;
// структура, описывающая точку struct Point { float x,y; }point1,point2,point3; // точки треугольника
// приготовления к рисовке void init() { glDisable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH);
glClearColor(255, 255, 255, 1); glClear(GL_COLOR_BUFFER_BIT); }
// функция отрисовки координатной плоскости GLvoid GetDisplay(GLvoid) { // координаты центра окна cW = Width / 2; cH = Height / 2;
init(); // выполняем начальную инициализацию glEnable(GL_LINE_SMOOTH); glEnable(GL_POLYGON_SMOOTH); glEnable(GL_POINT_SMOOTH); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glLineWidth(1.5); //рамка внутренняя glColor3f(0.5,0.5,0.5); glBegin(GL_LINE_LOOP); glVertex2i(Width-20,Height-20); glVertex2i(Width-20,20); glVertex2i(20,20); glVertex2i(20,Height-20); glEnd();
//рамка внешняя glColor3f(0.3,0.3,0.3); glBegin(GL_LINE_LOOP); glVertex2i(Width-3,Height-3); glVertex2i(Width-3,3); glVertex2i(3,3); glVertex2i(3,Height-3); glEnd();
//рисование осей координат glLineWidth(1);
glBegin(GL_LINES); glColor3f(0.4,0.4,0.4); glVertex2i(20,cH); glVertex2i(Width-20,cH);
glVertex2i(cW,20); glVertex2i(cW,Height-20); glEnd(); // стрелки glBegin(GL_TRIANGLES); glColor3f(0.4,0.4,0.4); glVertex2i(Width-20,cH); glVertex2i(Width-35,cH-5); glVertex2i(Width-35,cH+5);
glVertex2i(cW,Height-20); glVertex2i(cW-5,Height-35); glVertex2i(cW+5,Height-35); glEnd();
//насечки по вертикали и горизонтали glLineWidth(2); glBegin(GL_LINES); int sw = Width/15; for(int i = 0;i < Width/2;i+=sw) { glVertex2i(Width/2+i,0); glVertex2i(Width/2+i,5); glVertex2i(Width/2-i,0); glVertex2i(Width/2-i,5); glVertex2i(Width/2+i,Height); glVertex2i(Width/2+i,Height-5); glVertex2i(Width/2-i,Height); glVertex2i(Width/2-i,Height-5); } sw = Height/15; for(int i = 0;i < Height/2;i+=sw) { glVertex2i(Width,Height/2+i); glVertex2i(Width-5,Height/2+i); glVertex2i(Width,Height/2-i); glVertex2i(Width-5,Height/2-i); glVertex2i(0,Height/2+i); glVertex2i(5,Height/2+i); glVertex2i(0,Height/2-i); glVertex2i(5,Height/2-i); } glEnd();
// сетка
glLineWidth(1); glColor3f(0.85,0.85,0.85); glEnable(GL_LINE_STIPPLE); glLineStipple(1,255); glBegin(GL_LINES); sw = Width/15; for(int i = sw;i < Width/2-20;i+=sw) { glVertex2i(Width/2+i,20); glVertex2i(Width/2+i,Height-20); glVertex2i(Width/2-i,20); glVertex2i(Width/2-i,Height-20); } sw = Height/15; for(int i = sw;i < Height/2-20;i+=sw) { glVertex2i(20,Height/2+i); glVertex2i(Width-20,Height/2+i); glVertex2i(20,Height/2-i); glVertex2i(Width-20,Height/2-i); } glEnd(); glDisable(GL_LINE_STIPPLE);
// текст масштаба у насечек glColor3f(1.0,0.0,0.0); Mult = 0; sw = Width / 15; char * tempc = (char*)malloc(10*sizeof(char)); int lent; float k = Multiplication_Marks; for(int i = 0;i < Width/2-10;i+=sw) { glRasterPos2i(cW + i,5); _gcvt((double)Mult,5,tempc);// преобразовывает значение с //плавающей точкой в символьную строку и запоминает эту строку в буфере Mult+=k; lent = strlen(tempc); for(int j = 0;j<lent;j++) glutBitmapCharacter(GLUT_BITMAP_9_BY_15,tempc[j]);
glRasterPos2i(cW-i-sw,5); _gcvt((double)-Mult,5,tempc); lent = strlen(tempc); for(int j = 0;j<lent;j++) glutBitmapCharacter(GLUT_BITMAP_9_BY_15,tempc[j]); } Mult = 0; sw = Height / 15; k = Multiplication_Marks; for(int i = 0;i < Height/2-10;i+=sw) { glRasterPos2i(Width-30,cH+i); _gcvt((double)Mult,5,tempc); lent = strlen(tempc); Mult+=k; for(int j = 0;j<lent;j++) glutBitmapCharacter(GLUT_BITMAP_9_BY_15,tempc[j]);
glRasterPos2i(Width-40,cH-i-sw); _gcvt((double)-Mult,5,tempc); lent = strlen(tempc); for(int j = 0;j<lent;j++) glutBitmapCharacter(GLUT_BITMAP_9_BY_15,tempc[j]); } // точки glPointSize(5); glBegin(GL_POINTS); glVertex2i(cW + point1.x*RESIZE_FACTOR_X,cH + point1.y*RESIZE_FACTOR_Y); glVertex2i(cW + point2.x*RESIZE_FACTOR_X,cH + point2.y*RESIZE_FACTOR_Y); glVertex2i(cW + point3.x*RESIZE_FACTOR_X,cH + point3.y*RESIZE_FACTOR_Y); glEnd();
//треугольник glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glColor4f(0.0,0.0,1.0,0.4); glBegin(GL_TRIANGLES); glVertex2i(cW + point1.x*RESIZE_FACTOR_X,cH + point1.y*RESIZE_FACTOR_Y); glVertex2i(cW + point2.x*RESIZE_FACTOR_X,cH + point2.y*RESIZE_FACTOR_Y); glVertex2i(cW + point3.x*RESIZE_FACTOR_X,cH + point3.y*RESIZE_FACTOR_Y); glEnd(); glDisable(GL_BLEND);
glFlush(); glFinish(); }
// перерисовка окна в связи с изменением его размеров GLvoid GetReshape(GLint gW, GLint gH) { Width = gW; Height = gH; cW = Width/2; cH = Height/2; RESIZE_FACTOR_X = gW / 15 / Multiplication_Marks; RESIZE_FACTOR_Y = gH / 15 / Multiplication_Marks;
glViewport(0,0,gW,gH);
glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0,gW,0,gH,-1.0,1.0);
glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }
// обработка нажатий клавиш с клавиатуры GLvoid GetKey(unsigned char key,int _x, int _y) { switch(key) { case 'q': case 'Q': exit(0); break; case 't': case 'T': Multiplication_Marks *= 2; RESIZE_FACTOR_X /= 2; RESIZE_FACTOR_Y /= 2; glutPostRedisplay(); break; case 'r': case 'R': Multiplication_Marks /= 2; if(Multiplication_Marks == 0) Multiplication_Marks = 0.5; RESIZE_FACTOR_X *= 2; RESIZE_FACTOR_Y *= 2; glutPostRedisplay(); break; default: break; } } int main(int argc, char* argv[]) {
unsigned int diff = INT_MAX;
point1.x=-1,point1.y=-1; point2.x=3,point2.y=3; point3.x=2,point3.y=0;
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE); glutInitWindowSize(Width, Height); glutCreateWindow("Triangle");
glutDisplayFunc(GetDisplay); glutKeyboardFunc(GetKey); glutReshapeFunc(GetReshape);
glutMainLoop();
return 0; } Основные возможности OpenGL. Что предоставляет библиотека в распоряжение программиста? Основные возможности:
|