Опубликован: 02.12.2011 | Доступ: свободный | Студентов: 889 / 69 | Оценка: 5.00 / 4.00 | Длительность: 09:26:00
Специальности: Программист
Теги: .net, open source, opengl
Лекция 5:

Основные графические примитивы OpenGL и их свойства

< Лекция 4 || Лекция 5: 123456 || Лекция 6 >

Ширина и сглаживание линии

Для всех типов отрезков могут быть заданы такие параметры как ширина и сглаживание линий.

Для установки ширины линии используется команда LineWidth. В качестве параметра команде передается ширина линии в пикселах. В библиотеке OpenTK команда LineWidth реализуется с помощью статического метода класса GL (C#):

void LineWidth(float width);

В Object Pascal команда реализуется с помощью процедуры:

procedure glLineWidth (width: GLfloat);

Библиотека OpenGL имеет ограничение на максимальную ширину линии. Это значение, как и для размера точки, зависит от конкретной реализации библиотеки OpenGL. Алгоритм измерения ширины линии зависит от установленного режима сглаживания линий. По умолчанию режим сглаживания линий отключён. В этом случае ширина линии вычисляется вдоль оси OX или оси OY проекции в зависимости от угла наклона линии. Если координаты концов отрезка на проекции (x1, y1) и (x2, y2), то ширина отрезка будет вычисляться вдоль оси OY если |y1 – y2| < |x1 – x2| и в направлении оси OX если |y1 – y2| > |x1 – x2|. Поэтому при отключенном режиме сглаживания (режим по умолчанию) визуальная ширина линии может меняться в зависимости от угла наклона проекции линии.

При включенном режиме сглаживания линий толщина отрезка измеряется перпендикулярно линии. Для включения и отключения режима сглаживания линий используются соответственно команды Enable и Disable со значением параметра GL_LINE_SMOOTH на Object Pascal и значением LineSmooth перечисления EnableCap на C#.

Многоугольники

Многоугольник представляет собой замкнутую форму, поверхность которой может быть закрашена и границы которой определяются набором вершин, соединённых отрезками. Многоугольники являются основными компонентами, из которых формируются трехмерные закрашенные объекты. Библиотека позволяет формировать несколько типов многоугольников: треугольники, четырехугольники, многоугольники.

У всех многоугольников выделяют лицевую и обратную грани. Библиотека позволяет для каждой из граней задавать различные свойства, например, такие как: свойства материала, видимость, освещённость, режим отображения. По умолчанию лицевой гранью является та, которая получается при обходе вершин против часовой стрелки.

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

Библиотека реализует три примитива для рисования треугольников: несвязанные треугольники, треугольники с общей гранью, треугольники с общей вершиной.

Несвязанные треугольники

Для задания этого примитива используется константа GL_TRIANGLES в Object Pascal и значение Triangles перечисления BeginMode в библиотеке OpenTK на C# в качестве значения параметра команды Begin. Для построения каждого очередного треугольника требуется три вершины. Если задано количество вершин не кратное трем, то последние вершины игнорируются и не используются для построения треугольника.

Порядок обхода вершин совпадает с порядком задания их вершин.

В пример 4.3 (C#) и пример 4.4 (Object Pascal) приведены примеры формирования двух треугольников, имеющих различные направления обхода вершин. Последняя седьмая вершина игнорируется, так как для построения третьего треугольника необходимо еще две вершины. На рис. 4.5 показаны контуры формируемых треугольников и порядок обхода вершин каждого треугольника. Для первого треугольника (расположен слева на рис. 4.5) порядок обхода совпадает с направлением часовой стрелки и видимая сторона треугольника считается обратной. Для второго треугольника (расположен справа на рис. 4.5) порядок обхода соответствует направлению против часовой стрелки и видимая сторона треугольника является лицевой.

GL.Begin(BeginMode.Triangles);
  // треугольник 1
  GL.Vertex3(-0.7, -0.7, 0);
  GL.Vertex3(-0.7, 0.7, 0);
  GL.Vertex3(-0.1, -0.7, 0);
  // треугольник 2
  GL.Vertex3(0.0, 0.2, 0);
  GL.Vertex3(0.5, -0.5, 0);
  GL.Vertex3(0.7, 0.3, 0);
  // отдельная вершина игнорируется
  GL.Vertex3(0.9, -0.9, 0);
GL.End()
Листинг 4.3. Пример формирования отдельных треугольников на языке С#
glBegin(GL_TRIANGLES);
  // треугольник 1
  glVertex3f(-0.7, -0.7, 0);
  glVertex3f(-0.7, 0.7,  0);
  glVertex3f(-0.1, -0.7, 0);
  // треугольник 2
  glVertex3f(0.0, 0.2, 0);
  glVertex3f(0.5, -0.5, 0);
  glVertex3f(0.7, 0.3,  0);
  // отдельная вершина игнорируется
  glVertex3f(0.9, -0.9, 0);
glEnd;
Листинг 4.4. Пример формирования отдельных треугольников на языке Object Pascal
Схема формирования отдельных треугольников

Рис. 4.5. Схема формирования отдельных треугольников
Треугольники с общей гранью

Для задания этого примитива в качестве параметра команды Begin используется константа GL_TRIANGLE_STRIP в Object Pascal и значение TriangleStrip перечисления BeginMode в библиотеке OpenTK на C#. Первые три вершины определяют первый треугольник. Каждая следующая вершина создает очередной треугольник на основе последних двух вершин предыдущего треугольника и новой вершины.

На рис. 4.6 приведен результат формирования треугольников для фрагментов программ из пример 4.3 и пример 4.4, если в листинге 4.3 (фрагмент программы на C#) значение параметра метода GL.Begin заменить на BeginMode.TriangleStrip, а в листинге 4.4 (фрагмент программы на Object Pascal) значение параметра процедуры glBegin заменить на константу GL_TRIANGLE_STRIP.

Схема формирования  треугольников с общей гранью

Рис. 4.6. Схема формирования треугольников с общей гранью

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

Причиной такого порядка обхода вершин является применение этого примитива. Он обычно используется для формирования фрагмента поверхности сложной фигуры в виде "ленты". Для этого в программе обычно используются циклические конструкции, которые поочередно задают вершины на верхней и нижней стороне такой "ленты". В результате используемого порядка обхода вершин ( рис. 4.6) направление обхода вершин всех треугольников совпадает с направлением обхода первого треугольника.

Треугольники с общей вершиной

Для формирования этого примитива значение параметра команды Begin при использовании библиотеки OpenTK должно быть равно значению TriangleFan перечисления BeginMode, в Object Pascal значение параметра должно быть равно константе GL_TRIANGLE_FAN.

Каждая следующая вершина создает очередной треугольник на основе первой вершины первого треугольника и последних двух вершин.

В пример 4.5 и пример 4.6 приведены фрагменты программы на C# с использованием библиотеки OpenTK и Object Pascal, формирующие 3 треугольника с общей вершиной. Схематичное изображение получаемых треугольников и направление обхода вершин треугольников отображено на рис. 4.7

GL.Begin(BeginMode.TriangleFan);
  GL.Vertex3(-0.5, -0.5, 0);
  GL.Vertex3(0, 0.8, 0);
  GL.Vertex3(0.5, 0.6, 0);
  GL.Vertex3(0.8, 0.1, 0);
  GL.Vertex3(0.7, -0.6, 0);
GL.End();
Листинг 4.5. Пример формирования треугольников с общей вершиной на C#
glBegin(GL_TRIANGLE_FAN);
  glVertex3f(-0.5, -0.5, 0);
  glVertex3f(0, 0.8,  0);
  glVertex3f(0.5, 0.6, 0);
  glVertex3f(0.8, 0.1, 0);
  glVertex3f(0.7, -0.6, 0);
glEnd;
Листинг 4.6. Пример формирования треугольников с общей вершиной на Object Pascal
Схема формирования  треугольников с общей вершиной

Рис. 4.7. Схема формирования треугольников с общей вершиной

Порядок обхода вершин треугольников соответствует порядку задания вершин, используемых для их построения: от первой вершины первого треугольника к последней вершине последнего сформированного треугольника, затем к новой вершине, и затем к первой вершине первого треугольника. В результате направление обхода вершин каждого треугольника совпадает с направлением обхода вершин первого треугольника.

< Лекция 4 || Лекция 5: 123456 || Лекция 6 >
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Лариса Парфенова
Лариса Парфенова

1) Можно ли экстерном получить второе высшее образование "Программная инженерия" ?

2) Трудоустраиваете ли Вы выпускников?

3) Можно ли с Вашим дипломом поступить в аспирантуру?

 

Игорь Хан
Игорь Хан
Узбекистан, Ташкент, Ташкентский педагогический институт иностранных языков, 1990