Delphi World - OpenGL - Рисование геометрических фигур
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
OpenGL - Рисование геометрических фигур

Автор: Саша Полозов
WEB-сайт: http://daddy.mirgames.ru

Ну, что ж приступим, надеюсь, у вас уже есть исходник от прошлой статьи, если нет то вам дорога назад за исходником. Так сегодня я научу вас рисовать геометрические фигуры, сдвигать их, крутить и конечно разукрашивать. Надеюсь, все сделали домашнее задание!!???

Открываем исходник прошлой статьи, и вписываем в procedure glDraw(), после слова begin следующий текст:

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

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

procedure glDraw();
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();

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

glTranslatef(-1.5,0.0,-7.0);

Функция glTranslate(x, y, z) перемещает положения фигуры на указанные значения. –1.5 перемещает ось X на 1.5 единиц влево и ось Z на 7 единиц в глубь экрана. Эту строчку пишут перед каждой новой фигурой. Следует заметить, что перевод осей координат осуществляется не относительно центра экрана, а от их текущего расположения.

glBegin(GL_POLYGON);
  glVertex3f(0.0, 1.0, 0.0); // Вверх
  glVertex3f(-1.0, -1.0, 0.0); // Слева снизу
  glVertex3f(1.0, -1.0, 0.0); // Справа снизу
glEnd();

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

Так теперь рисуем четырехугольник.

 glLoadIdentity();
 glTranslatef(1.5,0.0,-6.0);

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

  glBegin(GL_QUADS);
    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();

Вот здесь собственно мы и рисуем четырехугольник

Мы нарисовали две геометрические фигуры, но они как-то бледно выглядят, надобны их приукрасить, вспомните детство, как вы смешивали краски.

Давайте приукрасим наш треугольник. Чтобы фигура получилась цветной надо просто добавить одну строчку после glTranslatef(-1.5,0.0,-7.0) и до glBegin(GL_POLYGON). Эта строчка выглядит так:

glColor3f(0.0,1.0,0.0);

glColor3f это просто разукрашиватель ( какое я слова выдумал), а вот то что в скобочках это и есть указатель цвета. 0.0,1.0,0.0 – это зеленый цвет. Сначала давайте разберемся, что это за циферки. Цвет в OpenGl задается тремя параметрами, первое это наличие красного цвета ( в нашем примере это 0.0, то есть красного нет совсем), второе это наличие зеленого ( можно указать не только 1.0 но и 2.0, и даже 1.3), а третье это наличие синего цвета. Т.к. в нашем примере указан только зеленый цвет, наш треугольник окрасится в зеленый цвет. Надеюсь, все понятно, старался объяснять предельно ясно.

Вот вам описание некоторых цветов:

0.0,1.0,0.0 – зеленый 
1.0,0.0,0.0 – красный
0.0,0.0,1.0 – синий
1.0,1.0,0.0 – желтый
1.0,1.0,1.0 – белый
0.0,1.0,1.0 – бирюзовый
1.0,0.0,1.0 – фиолетовый
0.0,0.0,0.0 – черный

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

glBegin(GL_QUADS);
  glColor3f(0.0,1.0,0.0);
  glVertex3f(-1.0, 1.0, 0.0);
  glColor3f(0.0,1.0,1.0);
  glVertex3f( 1.0, 1.0, 0.0);
  glColor3f(1.0,0.0,1.0);
  glVertex3f( 1.0,-1.0, 0.0);
  glColor3f(0.0,0.0,1.0);
  glVertex3f(-1.0,-1.0, 0.0);
glEnd();

Но в этом случае перед glBegin(GL_QUADS) цвета указывать не надо!!!!!!

Настало время научить наших фигурок двигаться.

Вначале мы добавим две переменные для хранения угла вращения каждого объекта. Мы сделаем это вначале программы. Посмотрите ниже, я добавил две строки после объявления переменной ElapsedTime : Integer. В этих строках объявляются две переменные с плавающей запятой, которые мы можем использовать для очень точного поворота объектов. Числа с плавающей запятой учитывают значения меньше единицы. Вместо использования 1, 2, 3 для угла, мы можем использовать 1.1, 1.7, 2.3 или даже 1.015 для точности. Вы уведете, что числа с плавающей запятой неотъемлемая часть программирования на OpenGL. Вот как надо добавить:

var
  h_Wnd: HWND;
  h_DC: HDC;
  h_RC: HGLRC;
  keys: array[0..255] of Boolean;
  FPSCount: Integer = 0;
  ElapsedTime: Integer;
  rtri: GLfloat;
  rquad: GLfloat;

{$R *.RES}

Так с переменными мы закончили, осталось немного, теперь добавим функцию, которая и будет вращать, это надо сделать в glDraw. Вот что мы добавим для треугольника после glTranslatef(-1.5,0.0,-7.0) но перед glColor3f(0.0,1.0,0.0):

glRotatef(rtri,0.0,1.0,0.0);

А вот что для четырех угольника, также перед glTranslatef(1.5,0.0,-6.0) но до glBegin(GL_QUADS):

glRotatef(rquad,1.0,1.0,1.0);

Так теперь объясню что это значит. glRotatef(Angle,Xtrue,Ytrue,Ztrue) отвечает за вращения объекта вдоль оси. Вы многое получите от использования этой команды. Угол некоторое число (обычно переменная), которое задает насколько Вы хотите повернуть объект. Если один из параметров равен 1.0, OpenGL будет вращать объект вдоль соответствующей оси. Поэтому если Вы имеете glRotatef(10.0,0.0,1.0,0.0), объект будет поворачиваться на 10 градусов по оси Y. Если glRotatef(5.0,1.0,0.0,1.0), объект будет поварачиваться на 5 градусов по обеим осям X и Z.

Последнее на сегодня что мы должны добавить в glDraw после отрисовки четырехугольника но до end будет:

rtri := rtri + 0.2;
rquad := rquad - 0.15; 

Эти строчки увеличивают переменные вращения, первая для треугольника, вторая для четырехугольника. Пробуйте изменить + на - и объект будет вращаться в другом направлении. Попробуйте изменить значение с 0.2 до 1.0. С увеличением значения объект будет вращаться быстрее. С уменьшением значения будет вращаться медленнее.

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

Тут можно взять исходник и EXE

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования