Название: Компьютерная графика(Е.Н. Павенко)

Жанр: Информатика

Просмотров: 1428


2. точки

Вы можете нарисовать столько точек, сколько вам нужно. Вызывая glVertex3d, вы устанавливаете новую точку. Размер точки можно устанавливать с помощью функции:

void glPointSize(GLfloat size);

Режим сглаживания можно устанавливать вызовом функции

glEnable(GL_POINT_SMOOTH);

Отключается, соответственно, вызовом glDisable() c этим параметром. Последние функции – glPointSize и glEnable/glDisable надо вызывать вне glBegin/glEnd, иначе они будут проигнорированы.

Примеры рисования точек:

 // рисуем точки

  glPointSize(2); 

  glBegin(GL_POINTS); 

   glColor3d(1,0,0); 

   glVertex3d(-4.5,4,0); // первая точка

   glColor3d(0,1,0); 

   glVertex3d(-4,4,0);   // вторая точка

   glColor3d(0,0,1);     // третья

   glVertex3d(-3.5,4,0);

  glEnd();

 

  glPointSize(5); 

  glBegin(GL_POINTS); 

   glColor3d(1,0,0); 

   glVertex3d(-2,4,0); // первая точка

   glColor3d(0,1,0); 

   glVertex3d(-1,4,0);   // вторая точка 

   glColor3d(0,0,1);     // третья точка

   glVertex3d(0,4,0);

  glEnd();

3. Линии

Для линий Вы также можете изменять ширину, цвет, размер, сглаживание. Если вы зададите разные цвета для начала и конца линии, то ее цвет будет переливающимся. OpenGL по умолчанию делает интерполяцию. Так же Вы можете рисовать прерывистые линии, делается это путем наложения маски при помощи следующей функции:

void glLineStipple(GLint factor, GLushort pattern   );

Второй параметр задает саму маску. Например, если его значение равно 255(0x00FF), то, чтобы вычислить задаваемую маску, воспользуемся калькулятором. В двоичном виде это число выглядит так: 0000000011111111, т.е. всего 16 бит. Старшие восемь установлены в ноль, значит, тут линии не будет. Младшие установлены в единицу, тут будет рисоваться линия. Первый параметр определяет, сколько раз повторяется каждый бит. Скажем, если его установить равным 2, то накладываемая маска будет выглядить так:

00000000000000001111111111111111

 

Далее приведен исходный текст с комментариями

 glLineWidth(1);       // ширину линии  устанавливаем 1

 glBegin(GL_LINES);

   glColor3d(1,0,0);     // красный цвет

  glVertex3d(-4.5,3,0); // первая линия

  glVertex3d(-3,3,0);

  glColor3d(0,1,0);     // зеленый

  glVertex3d(-3,3.3,0); // вторая линия

  glVertex3d(-4,3.4,0);

 glEnd();

  glLineWidth(3);      // ширина 3

 glBegin(GL_LINE_STRIP); // см. ниже

  glColor3d(1,0,0);

  glVertex3d(-2.7,3,0);

  glVertex3d(-1,3,0);

  glColor3d(0,1,0);

  glVertex3d(-1.5,3.3,0);

  glColor3d(0,0,1);

  glVertex3d(-1,3.5,0);

 glEnd();

  glLineWidth(5);

 glEnable(GL_LINE_SMOOTH);

 glEnable(GL_LINE_STIPPLE); // разрешаем рисовать  прерывистую линию

 glLineStipple(2,58360);    // устанавливаем маску

 glBegin(GL_LINE_LOOP);

  glColor3d(1,0,0);

  glVertex3d(1,3,0);

  glVertex3d(4,3,0);

  glColor3d(0,1,0);

  glVertex3d(3,2.7,0);

  glColor3d(0,0,1);

  glVertex3d(2.5,3.7,0);

   glEnd();

 glDisable(GL_LINE_SMOOTH);

 glDisable(GL_LINE_STIPPLE);

4. Треугольники

Для треугольника можно задавать те же параметры, что и для линии, плюс есть еще одна функция glPolygonMode. Она устанавливает опции для отрисовки многоугольника. Первый параметр может принимать значения – GL_FRONT, GL_BACK и GL_FRONT_AND_BACK. Второй параметр указывает, как будет рисоваться многоугольник. Он принимает значения: GL_POINT(рисуются только точки), GL_LINE(рисуем линии) и GL_FILL(рисуем заполненный многоугольник). Первый параметр указывает: к лицевой, тыльной или же к обеим сторонам применяется опция, заданная вторым параметром. Треугольники можно рисовать, передав GL_TRIANGLE_STRIP или GL_TRIANGLE_FAN в glBegin. В первом случае, первая, вторая и третья вершины задают первый треугольник. Вторая, третья и четвертая вершины – второй треугольник. Третья, четвертая и пятая вершина – третий треугольник и т.д. Вершины n, n+1 и n+2 определят n-й треугольник. Во втором случае, первая, вторая и третья вершины задают первый треугольник. Первая, третья и четвертая вершины задают второй треугольник и т.д. Вершины 1, n+1, n+2 определяют n-й треугольник. Далее следует пример с комментариями.

glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // см. выше

 glBegin(GL_TRIANGLES);

  glColor3d(1,0,0);      // рисуем треугольник

  glVertex3d(-4,2,0);

  glVertex3d(-3,2.9,0);

  glVertex3d(-2,2,0);

 glEnd();

glLineWidth(2);

 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); //рисуем  проволочные треугольники

glBegin(GL_TRIANGLE_STRIP); // обратите внимание на порядок вершин

  glColor3d(0,1,0);

  glVertex3d(1,2,0);

  glVertex3d(0,2.9,0);

  glVertex3d(-1,2,0);

  glVertex3d(0,1.1,0);

 glEnd();

 glEnable(GL_LINE_STIPPLE);

 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

 glBegin(GL_TRIANGLE_FAN);

  glColor3d(0,0,1);

  glVertex3d(4,2,0);

  glVertex3d(2.6,2.8,0);

  glVertex3d(2,2,0);

  glVertex3d(3,1.1,0);

 glEnd();

 glDisable(GL_LINE_STIPPLE);

5. Четырехугольники

Четырехугольники рисуются вызовом функции glBegin с параметром GL_QUADS или GL_QUAD_STRIP. Для первого случая каждые четыре вершины определяют свой четырехугольник. Во втором случае рисуются связанные четырехугольники. Первая, вторая, третья и четвертая вершины определяют первый четырехугольник. Третья, четвертая, пятая и шестая вершины – второй четырехугольник и т.д. (2n-1), 2n, (2n+1) и (2n+2) вершины задают n-й четырехугольник. Многоугольники задаются вызовом glBegin с параметром GL_POLYGON. Все вершины определяют один многоугольник. Для многоугольников можно задавать стили при помощи вышеописанной функции glPolygonMode, толщину линии, толщину точек и цвет.

Задание  на лабораторную работу

1. Изобразить точки, линии, треугольники, многоугольники в одном окне.

2. Построить изображение фигуры, заданной преподавателем.

Контрольные вопросы

1. Определение примитива. Примитивы OpenGL.

2. Рисование точек и линий средствами OpenGL.

3. Рисование треугольников и многоугольников средствами OpenGL.

4. Полосы из треугольников и прямоугольников.