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

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

Основные возможности 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. Нарушение авторских прав; Мы поможем в написании вашей работы!




Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...


Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...


Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...


Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Способы тактических действий при проведении специальных операций Специальные операции проводятся с применением следующих основных тактических способов действий: охрана...

Искусство подбора персонала. Как оценить человека за час Искусство подбора персонала. Как оценить человека за час...

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

Лечебно-охранительный режим, его элементы и значение.   Терапевтическое воздействие на пациента подразумевает не только использование всех видов лечения, но и применение лечебно-охранительного режима – соблюдение условий поведения, способствующих выздоровлению...

Тема: Кинематика поступательного и вращательного движения. 1. Твердое тело начинает вращаться вокруг оси Z с угловой скоростью, проекция которой изменяется со временем 1. Твердое тело начинает вращаться вокруг оси Z с угловой скоростью...

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

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