^Back To Top
foto1 foto2 foto3 foto4 foto5 foto6 foto7 foto8 foto9 foto10 foto11 foto12 foto13 foto14 foto15 foto16 foto17 foto18 foto19 foto20 foto19

 

 

OpenGL в C++ для Ch--

 

 

Шар, освещённый белым светом

 

.....  Пространственное изображение на плоскости достигается при помощи теней от источников света. Описать языком программирования реальное освещение не просто. Тем не менее, создатели Графической библиотеки OpenGL добились успехов в этом направлении и разработали несколько интересных моделей освещения. При этом они использовали сложные приемы программирования, постичь которые дремучему чайнику трудно.

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

 

Создаём проект «sphere» - «сфера»


Для целей данной статьи необходимо встроить Графическую библиотеку GLUT в ОС Windows,
создать проект «sphere» и подключить его к упомянутой библиотеке.
Как это сделать подробно изложено в статье «Совершенствуем ОС Windows»


..... Итак, после несложных манипуляций с ОС Windows и библиотекой GLUT создан файл исходного кода  sphere.cpp. В файле всё стираем и помещаем туда программу «sphere», содержащую шапку и три функции.

 

Программа «sphere» - «сфера»


 #include "stdafx.h"
 #include <glut.h>
 

    void Light()
    {
      glEnable(GL_LIGHT0);
      glEnable(GL_LIGHTING);
      glEnable(GL_DEPTH_TEST);
 
  }

 void Draw()
    {
      glClear(GL_COLOR_BUFFER_BIT |                                                                 GL_DEPTH_BUFFER_BIT); 
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
     glutSolidSphere(0.7, 50, 40);
      glFlush();
    }

void main( int argc, char ** argv)
    {
      glutInit(&argc, argv);
      glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH);
     glutInitWindowPosition(100, 100);
     glutInitWindowSize(400, 400);
     glutCreateWindow("Шар");
     glClearColor(0.0, 0.0, 0.0, 0.0);
     Light();
     glutDisplayFunc(Draw);
      glutMainLoop();
   }

..... Шапка программы содержит две директивы #include. Первая встраивает программу в компилятор Visual Studio, а вторая - открывает библиотеку GLUT.

 

..... В каждой функции выделим «зеленую зону» с командами, которыми будем пользоваться в свое удовольствие! Операторы вне зеленой зоны трогать не будем, так как они находятся в опасной близости к аппендиксу Прекрасной Дамы по имени OpenGL.

 

..... Функция освещения шара Light() отвечает за освещение шара и состоит из трех «структурных» операторов, инициирующих глубинные параметры источника света LIGHT0. Зеленую зону оставим пустой. Её заполним при необходимости раскрасить шар или изменить направление источника света.

 

..... В функции Draw() операторы вне зеленой зоны настраивают процесс рисования. 

.....  Поскольку в Графической библиотеке OpenGL для создания проекций объёмных фигур на плоскость используется матричное исчисление, внутри зелёной зоны перед glOrtho() всегда находятся два оператора, связанные с проекционной матрицей. Свойства самого оператора glOrtho(x0, a, y0, b, z0, c) рассмотрены в статье «OpenGL в С++ для Ch--».

..... Суть заключается в следующем: в любую точку окна помещаем центр декартовой прямоугольной системы координат с параллельными границам окна осями Ox и Oy и перпендикулярной окну осью Oz.

..... Задавая длины отрезков  a, b и с, выделяем так называемый «параллелепипед видимости», внутри которого расположен шар. Точка A(x0, y0, z0 ) – это  нижняя левая ближняя вершина параллелепипеда в выбранной системе координат.

 

Чего только не придумаешь при конструировании Графических библиотек!

 

..... Оператор glutSolidSphere (0.7, 50, 40) рисует сферу радиуса 0.7, разбивая её на 50 сечений перпендикулярно и 40 сечений параллельно оси z.

..... На рисунке и в программе «sphere» использован «куб видимости»: x0 = y0 = z0 = -1, a = b = с = 1.

 

Главная функция программы main()

..... Всё, что не входит в зелёную зону этой функции (два аргумента и три оператора), встраивает OpenGL в ОС, запускает различные службы и саму программу.

..... Зелёная зона содержит стандартные операторы, подробно описанные в статье «OpenGL в С++ для Ch--».

..... Вспоминаем! Первые два оператора зелёной зоны задают размер окна 400 на 400 px и помещают его на расстоянии 100 px по вертикали от левого верхнего угла дисплея и 100 px по горизонтали.

..... Оператор glutCreateWindow("Sphere") даёт название окну и выводит его на дисплей.

..... Оператор glClearColor(0.0, 0.0, 0.0, 0.0, 0.0) делает фон окна тёмным.

..... Затем управление передаётся в функцию Light() для настройки параметров света и включается функция рисования Draw().

..... Заносим эту программу в файл sphere.cpp, нажимаем F5 и получаем шар, освещённый белым светом:

 

 

..... Как бы сказал Марк Твен: «Слухи о пустоте зеленой зоны функции Light() сильно преувеличены». В действительности внутри каждой программы по умолчанию действуют «команды-невидимки».

..... В данном случае эти команды отвечают за то, что шар освещён источником белого света (1), лучи света параллельны (2) и перпендикулярны плоскости рисунка (3). Наблюдатель смотрит в отрицательном направлении оси Oz куба видимости (4).