Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Основные возможности OpenGL. Пример 1: Простое GLUT-приложение


Пример 1: Простое GLUT-приложение

Этот простой пример предназначен для демонстрации структуры GLUT-приложения и простейших основ OpenGL. Результатом работы программы является случайный набор цветных прямоугольников, который меняется при нажатии левой кнопки мыши. С помощью правой кнопки мыши можно менять режим заливки прямоугольников.

Пример №1

#include <stdlib.h>#include <gl/glut.h> #ifdef random#undef random#endif #define random(m) (float)rand()*m/RAND_MAX /* ширина и высота окна */GLint Width = 512, Height = 512;/* число прямоугольников в окне */int Times = 100;/* с заполнением?*/int FillFlag = 1; long Seed = 0; /* функция отображает прямоугольник */void DrawRect(float x1, float y1, float x2, float y2, int FillFlag){ glBegin(FillFlag? GL_QUADS: GL_LINE_LOOP); glVertex2f(x1, y1); glVertex2f(x2, y1); glVertex2f(x2, y2); glVertex2f(x1, y2); glEnd();} /* управляет всем выводом на экран */void Display(void){ int i; float x1, y1, x2, y2; float r, g, b; srand(Seed); glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); for(i = 0; i < Times; i++) { r = random(1); g = random(1); b = random(1); glColor3f(r, g, b); x1 = random(1) * Width; y1 = random(1) * Height; x2 = random(1) * Width; y2 = random(1) * Height; DrawRect(x1, y1, x2, y2, FillFlag); } glFinish();} /* Вызывается при изменении размеров окна */voidReshape(GLint w, GLint h){ Width = w; Height = h; glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, w, 0, h, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();} /* Обрабатывает сообщения от мыши */void Mouse(int button, int state, int x, int y){ if(state == GLUT_DOWN) { switch(button) { case GLUT_LEFT_BUTTON: Seed = random(RAND_MAX); break; case GLUT_RIGHT_BUTTON: FillFlag =!FillFlag; break; } glutPostRedisplay(); }} /* Обрабатывает сообщения от клавиатуры */voidKeyboard(unsigned char key, int x, int y){#define ESCAPE '\033' if(key == ESCAPE) exit(0);} int main(int argc, char *argv[]){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB); glutInitWindowSize(Width, Height); glutCreateWindow("Rect draw example (RGB)"); glutDisplayFunc(Display); glutReshapeFunc(Reshape); glutKeyboardFunc(Keyboard); glutMouseFunc(Mouse); glutMainLoop();}

Пример 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.

Что предоставляет библиотека в распоряжение программиста? Основные возможности:

  • Геометрические и растровые примитивы. На основе геометрических и растровых примитивов строятся все объекты. Из геометрических примитивов библиотека предоставляет: точки, линии, полигоны. Из растровых: битовый массив(bitmap) и образ(image)
  • Использование В-сплайнов. B-сплайны используются для рисования кривых по опорным точкам.
  • Видовые и модельные преобразования. С помощью этих преобразований можно располагать обьекты в пространстве, вращать их, изменять форму, а также изменять положение камеры из которой ведётся наблюдение.
  • Работа с цветом. OpenGL предоставляет программисту возможность работы с цветом в режиме RGBA (красный-зелёный-синий-альфа) или используя индексный режим, где цвет выбирается из палитры.
  • Удаление невидимых линий и поверхностей. Z-буферизация.
  • Двойная буферизация. OpenGL предоставляет как одинарную так и двойную буферизацию. Двойная буферизация используется для того, чтобы устранить мерцание при мультипликации, т.е. изображение каждого кадра сначала рисуется во втором(невидимом) буфере, а потом, когда кадр полностью нарисован, весь буфер отображается на экране.
  • Наложение текстуры. Позволяет придавать объектам реалистичность. На объект, например шар, накладывается текстура(просто какое-то изображение), в результате чего наш объект теперь выглядит не просто как шар, а как разноцветный мячик.
  • Сглаживание. Сглаживание позволяет скрыть ступенчатость, свойственную растровым дисплеям. Сглаживание изменяет интенсивность и цвет пикселей около линии, при этом линия смотрится на экране без всяких зигзагов.
  • Освещение. Позволяет задавать источники света, их расположение, интенсивность, и т.д.
  • Атмосферные эффекты. Например туман, дым. Всё это также позволяет придать объектам или сцене реалистичность, а также "почувствовать" глубину сцены.
  • Прозрачность объектов.
  • Использование списков изображений.



<== предыдущая лекция | следующая лекция ==>
Демонстрационные программы | 

Дата добавления: 2015-10-19; просмотров: 686. Нарушение авторских прав; Мы поможем в написании вашей работы!




Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...


Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...


ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...


Теория усилителей. Схема Основная масса современных аналоговых и аналого-цифровых электронных устройств выполняется на специализированных микросхемах...

Условия приобретения статуса индивидуального предпринимателя. В соответствии с п. 1 ст. 23 ГК РФ гражданин вправе заниматься предпринимательской деятельностью без образования юридического лица с момента государственной регистрации в качестве индивидуального предпринимателя. Каковы же условия такой регистрации и...

Седалищно-прямокишечная ямка Седалищно-прямокишечная (анальная) ямка, fossa ischiorectalis (ischioanalis) – это парное углубление в области промежности, находящееся по бокам от конечного отдела прямой кишки и седалищных бугров, заполненное жировой клетчаткой, сосудами, нервами и...

Основные структурные физиотерапевтические подразделения Физиотерапевтическое подразделение является одним из структурных подразделений лечебно-профилактического учреждения, которое предназначено для оказания физиотерапевтической помощи...

Потенциометрия. Потенциометрическое определение рН растворов Потенциометрия - это электрохимический метод иссле­дования и анализа веществ, основанный на зависимости равновесного электродного потенциала Е от активности (концентрации) определяемого вещества в исследуемом рас­творе...

Гальванического элемента При контакте двух любых фаз на границе их раздела возникает двойной электрический слой (ДЭС), состоящий из равных по величине, но противоположных по знаку электрических зарядов...

Сущность, виды и функции маркетинга персонала Перснал-маркетинг является новым понятием. В мировой практике маркетинга и управления персоналом он выделился в отдельное направление лишь в начале 90-х гг.XX века...

Studopedia.info - Студопедия - 2014-2025 год . (0.012 сек.) русская версия | украинская версия