Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Отображение полигонов

.doc
Скачиваний:
0
Добавлен:
28.03.2019
Размер:
44.03 Кб
Скачать

Отображение полигонов

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

Public Function DrawGLScene() As Boolean

glClear clrColorBufferBit Or clrDepthBufferBit

glLoadIdentity

glTranslatef -1.5, 0, -6

glBegin bmTriangles

glVertex3f 0, 1, 0

glVertex3f -1, -1, 0

glVertex3f 1, -1, 0

glEnd

glTranslatef 3, 0, 0

glBegin bmQuads

glVertex3f -1, 1, 0

glVertex3f 1, 1, 0

glVertex3f 1, -1, 0

glVertex3f -1, -1, 0

glEnd

DrawGLScene = True

End Function

glClear clrColorBufferBit Or clrDepthBufferBit – Очистка экрана и буфера глубины

glLoadIdentity – Сброс просмотра. Вызов функции gLoadIdentity устанавливает начало системы координат в центр экрана, причем ось X идет слева направо, ось Y вверх и вниз, а ось Z к и от наблюдателя. Центр OpenGL экрана находится в точке 0, 0, 0. Координаты, расположенные слева, снизу и вглубь от него, имеют отрицательное значение, расположенные справа, сверху и по направлению к наблюдателю – положительное.

Функция glTranslate x, y, z перемещает оси координат на указанные значения. Следующая строчка кода перемещает ось X на 1.5 единиц и ось Z на 6 единиц. Следует заметить, что перевод осей координат осуществляется не относительно центра экрана, а от их текущего расположения.

glTranslatef -1.5, 0, -6

Теперь, когда мы переместились в левую часть экрана и установили более удобный вид (в глубину на 6 единиц), отобразим геометрическую фигуру. Функция glBegin bmTriangles означает, что мы начинаем рисовать треугольник, и далее следует перечисление его вершин. После указания всех вершин, производится вызов функции glEnd. Обычно треугольники на большинстве видеокарт отображаются наиболее быстро, но если есть желание отобразить иную фигуру, вместо bmTriangles используется другое значение, например: для создания четырехугольника указывается bmQuads, если вершин больше чем 4, то bmPolygon.

В нашем примере рисуем только один треугольник. Если есть желание изобразить еще один треугольник, добавьте часть кода, следующую за описанием первого треугольника. В это случае все шесть строк кода следует размещать между glBegin bmTriangles и glEnd. Нет нужды выделять каждый треугольник этими командами, после обработки трех вершин OpenGL сам перейдет к созданию новой фигуры. Это же относится и к четырехугольникам. Полигоны (bmPolygon) в свою очередь могут иметь любое количество вершин, и поэтому нет разницы, сколько описателей располагалось между строками glBegin bmPolygon и glEnd.

Первая строка после glBegin описывает первую вершину нашего полигона. Функция glVertex3f получает в качестве параметров ее X, Y и Z координаты. Первая вершина треугольника смещена только от оси Y на 1, таким образом, мы расположим ее точно в центре и она будет самой верхней. Следующая вершина будет располагаться на оси Х слева от центра и на оси Y вниз от центра. Эта вершина будет расположена внизу слева. Третья вершина будет справа и снизу от центра. Функция glEnd указывает OpenGL, что вершин больше не будет. Результатом всего этого будет залитый цветом по умолчанию треугольник.

glBegin bmTriangles

glVertex3f 0, 1, 0

glVertex3f -1, -1, 0

glVertex3f 1, -1, 0

glEnd

Теперь у нас есть треугольник, изображенный в правой части экрана. Нам нужно переместиться в левую часть, для этого снова используем функцию glTranslate. Так как мы в прошлый раз перемещались влево на 1.5 единицы, необходимо переместиться на 3.0 единицы вправо (1.5 единицы – это будет центр, плюс еще 1.5 единицы для правого края).

glTranslatef 3, 0, 0

Здесь мы изобразим квадрат. Так как он является четырехсторонним полигоном, мы будем использовать bmQuads. Создание квадрата напоминает создание треугольника, правда указывать нужно четыре вершины. Они будут идти в следующем порядке – левая вверху, правая вверху, правая снизу и левая снизу.

glBegin bmQuads

glVertex3f -1, 1, 0

glVertex3f 1, 1, 0

glVertex3f 1, -1, 0

glVertex3f -1, -1, 0

glEnd

Отображение цветов

glColor3f – устанавливает цвет

glColor3f red, green, blue

Например glColor3f 1, 0, 0

Вращение полигонов

glRotatef Angle, Xtrue, Ytrue, Ztrue – отвечает за вращения объекта вдоль оси. Угол некоторое число (обычно переменная), которое задает насколько Вы хотите повернуть объект. Xtrue, Ytrue и Ztrue или 0 или 1. Если один из параметров равен 1, OpenGL будет вращать объект вдоль соответствующей оси. Поэтому если Вы имеете

glRotatef 10, 0, 1, 0 – объект будет поворачиваться на 10 градусов по оси Y.

Если glRotatef 5, 1, 0, 1 – объект будет поворачиваться на 5 градусов по обеим осям X и Z.

В следующей строке кода, если rtri равно 7, мы будем вращать на 7 градусов по оси Y (слева направо). Вы можете поэксперементировать с кодом. Изменяйте от 0 до 1, и от 1 до 0 вращение треугольника по осям X и Y одновременно.

glRotatef rtri, 0, 1, 0 – Вращение треугольника по оси Y

Следующая секция кода не изменена. Здесь будет нарисован закрашенный сглаженный треугольник. Треугольник будет нарисован с левой стороны экрана, и будет вращаться по оси Y слева направо.

glBegin bmTriangles

glColor3f 1, 0, 0 // Верхняя точка - красная

glVertex3f 0, 1, 0 // Первая точка

glColor3f 0, 1, 0 // Левая точка - зеленная

glVertex3f -1, -1, 0 // Вторая

glColor3f 0, 0, 1 // Правая - синия

glVertex3f 1, -1, 0 // Третья

glEnd // Конец рисования

Посмотрите на код ниже, там мы добавим вызов glLoadIdentity. Мы сделаем это для инициализации просмотра. Что будет если мы не сбросим просмотр? Если мы сдвинули объект после вращения, Вы получите очень неожиданные результаты. Поскольку оси вращаются, они будут указывать не в тех направлениях, о каких Вы думаете. Поэтому если мы сдвинулись влево по оси X (для установки треугольника), мы можем переместить квадрат в глубь экрана или вперед, в зависимости от того как много мы вращали по оси Y. Попробуйте убрать glLoadIdentity и вы поймете о чем я говорю. Квадрат будет вращаться вокруг своей оси X, но и вокруг центра координат синхронно вращению треугольника.

Так как сцена сброшена, поэтому X идет слева направо, Y сверху вниз, Z от нас и далее. Теперь мы перемещаем. Как Вы видите мы сдвигаем на 1.5 вправо, вместо 3.0, как мы делали в последнем уроке. Когда мы сбрасываем экран, наш фокус перемещается в центр экрана, это означает, что мы находимся не 1.5 единицы слева, мы вернулись в 0.0. Поэтому мы не должны сдвигаться на 3.0 единицы вправо (если бы не было сброса), мы должны только сдвинуться от центра вправо на 1.5 единицы.

После того как мы сдвинулись в новое место на правой стороне экрана, мы вращаем квадрат по оси X. Квадрат будет вращаться верх и вниз.

glLoadIdentity

glTranslatef 1.5, 0, -6 // Сдвиг вправо на 1.5

glRotatef rquad, 1, 0, 0 // Вращение по оси X

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

glColor3f 0.5, 0.5, 1.0 // Синий цвет

glBegin bmQuads // Начнем

glVertex3f -1.0, 1.0, 0.0 // Верх лево

glVertex3f 1.0, 1.0, 0.0 // Верх право

glVertex3f 1.0,-1.0, 0.0 // Низ право

glVertex3f -1.0,-1.0, 0.0 // Низ лево

glEnd // Окончим

Вначале нашей программы мы сделали

Dim rtri As GLfloat

Dim rquad As GLfloat

В конце DrawGLScene

rtri = rtri + 2 // Увеличение переменной вращения для треугольника

rquad = rquad – 1.5 // Уменьшение переменной вращения для квадрата

Соседние файлы в предмете Компьютерная Графика