Студопедия

Главная страница Случайная страница

Разделы сайта

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






OpenGL: рисование треугольников и многоугольников






 

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

Рисунок 1. Треугольник типа GL_TRIANGLES

 

Задание 1: Нарисуйте произвольный треугольник.

Из треугольников можно составить все другие геометрические фигуры. Например, многоугольники.

Задание 2: Нарисуйте квадрат из двух треугольников.

Перейдем к следующему примитиву, задаваемому константой GL_TRIANGLE_STRIP. Первые три вершины образуют первый треугольник, вершины со второй по четвертую – второй треугольник, с третей по пятую – третий и т.д (рис.2).

Рисунок 2. Лента треугольников (GL_TRIANGLE_STRIP)

 

Задание 3: Нарисуйте с помощью данного примитива флажок (рис.3)

 

Рисунок 3. Флажок

 

Поэкспериментируем с данной программой.

Задание 4: Перед заданием первой вершиной введите строку glColor3f(0.0, 0.0, 1.0), а перед третьей - glColor3f (1.0, 0.0, 0.0).

Команда glColor3f определяет цвет примитива.

Результат данного задания: у фигуры возникает плавный переход цветов.

Если перед командными скобками вызовите функцию glShadeModel(GL_FLAT)(данная функция задает правило тонирования – см. л.р.№1), то флаг закрасится в цвет второго примитива.

Задание 5: Перед командными скобками вызовите функцию glShadeModel(GL_FLAT).

Следующий примитив определяется константой GL_TRIANGLE_FAN. Этот примитив также задает последовательно связанные треугольники, однако по другому принципу: первая вершина является общей для всех остальных треугольников, задаваемых перечислением вершин, т.е. треугольников связанных на подобии веера (рис. 4).

Рисунок 4. Веер треугольников (GL_TRIANGLE_FAN)

 

Задание 6: Нарисуйте шестиугольник с использованием примитива GL_TRIANGLE_FAN.

Теперь рассмотрим режимы вывода многоугольников. Для устранения ступенчатости многоугольников используется команда:

glEnable с аргументом GL_POLYGON_SMOOTH.

Режим контурного рисования (рисуются только границы) включается, если перед командными скобками поместить команду:

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE).

Ширину линии можно варьировать с помощью команды glLineWigth, пунктирные линии контура задаются командой glLineStipple.

Задание 7: Введите режим контурного рисования в предыдущий пример.

Команда glPolygonMode позволяет выводить вместо заполненных и контурных многоугольников только их вершины, если ее вторым аргументом взять константу GL_POINT (не путать с GL_POINTS!). Размеры точек вершин и наличие сглаживания у них можно задавать так же, как и для обычных точек.

По умолчанию многоугольники строятся заполненными (включен режим GL_FILL).

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

Задание 8: Включите контурный режим только для лицевой стороны в предыдущем примере. Для этого замените в команде glPolygonMode аргумент:

glPolygonMode(GL_BACK, GL_LINE);

Вы увидите, что при этом треугольник остался сплошным.

Для рисования прямоугольника на плоскости можно воспользоваться командой glRectf. Ее аргументом являются координаты двух точек – противоположных углов рисуемого прямоугольника.

Задание 9: Нарисуйте прямоугольник с координатами точек [-0.3, -0.3] и [0.3, 0.3].

Кроме этого, есть примитив, задаваемый константой GL_QUADS. При этом внутри командных скобок вершины берутся по четыре и по ним строятся независимые четырехугольники (рис. 5 а).

Задание 10: Создайте два четырехугольника, их цвета задавайте случайным образом.

Примитив, задаваемый константой GL_QUAD_STRIP, состоит из связанных четырехугольников. Первый четырехугольник формируется из вершин номер один, два, три и четыре. Второй четырехугольник в качестве опорных точек берет третью, четвертую, пятую и шестую вершины. И так далее (рис.5. б).

Рисунок 5. Четырехугольники типа GL_QUADS (а) и GL_QUAD_STRIP(б)

Задание 11: В предыдущем примере поменяйте константу GL_QUAD на GL_QUAD_STRIP. Сколько четырехугольников рисуется в данном случае?

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

Задание 12: Нарисуйте шестиугольник с помощью примитива GL_POLYGON. Код рисования следующий:

glBegin (GL_POLYGON);

For i: = 0 to 6 do begin

glColor3f (random, random, random);

glVertex2f (0.5 * cos (2 * Pi * i / 6), 0.5 * sin (2 * Pi * i / 6));

end;

glEnd;

Задание 13: Попробуйте построить с помощью примитива GL_POLYGON следующую фигуру (рис. 6):

 

Рисунок 6. Вогнутый многоугольник

 

У вас вряд ли получится, т.к. примитив GL_POLYGON предназначен для рисования выпуклых многоугольник. Поэтому для рисования данной фигуры необходимо разбить ее на две части, каждая из которых представляет собой выпуклый многоугольник. Например, как на рис. 7.

 

Рисунок 7. Два выпуклых многоугольника

 

Режим вывода многоугольников glPolygonMode позволяет рисовать контуры или только точки в опорных вершинах фигуры. Когда сложная фигура разбивается на части, контурный режим может испортить картинку: станет заметным поэтапное построение фигуры. В такой ситуации решение может состоять в исключении некоторых вершин из построения границы фигуры, что осуществляется вызовом команды glEdgeFlag. Аргумент этой команды имеет тип Boolean, если точнее – GLBoolean. Команда дает эффект только в режиме контурного или поточечного вывода многоугольников. Данную команду можно использовать внутри командных скобок.

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

Задание 14: Нарисуйте фигуру (рис. 8).

 

Рисунок 8. Вогнутый многоугольник в режиме отображения линий

Задание 15 (дополнительно): Нарисуйте круг.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.