Урок 3 - Объёмные фигуры

  В этом уроке мы нарисуем объёмные фигуры: куб, пирамида, сфера, конус, тор (плюшка), и включим освещение примитивов.
Сначала необходимо скачать (ссылка в конце урока) и подключить библиотеку DGLUT.pas.
Напомню, для того, что бы подключить библиотеку нужно ввести ее имя в секцию uses

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OpenGL, DGLUT;
В библиотеке DGLUT.pas записаны уже готовые алгоритмы построения объёмных фигур.
Например:
Алгоритм рисования куба вручную:
glBegin(GL_QUADS);
    // Лицевая сторона
    glVertex3f(-1.0, -1.0,  1.0);
    glVertex3f( 1.0, -1.0,  1.0);
    glVertex3f( 1.0,  1.0,  1.0);
    glVertex3f(-1.0,  1.0,  1.0);
    //Задняя сторона
    glVertex3f(-1.0, -1.0, -1.0);
    glVertex3f(-1.0,  1.0, -1.0);
    glVertex3f( 1.0,  1.0, -1.0);
    glVertex3f( 1.0, -1.0, -1.0);
    // Верхняя сторона
    glVertex3f(-1.0,  1.0, -1.0);
    glVertex3f(-1.0,  1.0,  1.0);
    glVertex3f( 1.0,  1.0,  1.0);
    glVertex3f( 1.0,  1.0, -1.0);
    // Нижняя сторона
    glVertex3f(-1.0, -1.0, -1.0);
    glVertex3f( 1.0, -1.0, -1.0);
    glVertex3f( 1.0, -1.0,  1.0);
    glVertex3f(-1.0, -1.0,  1.0);
    // Правая сторона
    glVertex3f( 1.0, -1.0, -1.0);
    glVertex3f( 1.0,  1.0, -1.0);
    glVertex3f( 1.0,  1.0,  1.0);
    glVertex3f( 1.0, -1.0,  1.0);
    // Левая сторона
    glVertex3f(-1.0, -1.0, -1.0);
    glVertex3f(-1.0, -1.0,  1.0);
    glVertex3f(-1.0,  1.0,  1.0);
    glVertex3f(-1.0,  1.0, -1.0);
  glEnd(); 
При помощи библиотеки:
glutSolidCube(Размер);
  В OpenGL есть буфер глубины, второе его название ZBuffer. В нем хранятся данные о расстоянии от каждого пиксела монитора до точек в объёмном пространстве OpenGL, принадлежащих этому пикселу. OpenGL выводит точки, расстояние до которых меньше всех расстояний до точек принадлежащие этому пикселу.


Удалите все примитивы прошлого урока в процедуре FormPaint и дополните её кодом:
glutSolidCube(1);

После компиляции мы увидим куб белого цвета. Белый, потому что он не освещается.

Что бы включить источник света, нужно добавить
glEnable(GL_LIGHTING); //включаем освещение
glEnable(GL_LIGHT0); //включаем источник света №0
в функцию создания формы. Источников света не может быть больше 8.
Давайте скомпилируем и посмотрим, что получилось.


Куб стал смотреться более объёмно, благодаря освещению.

  Теперь нарисуем сферу, но перед этим сдвинем куб в сторону. Сделаем это функцией glTranslatef(x, y, z) где x, y, z –вектор смещения всей системы координат. Существуют функции запоминания текущей системы координат glPushMatrix и восстановления glPopMatrix. Если просто использовать glTranslatef , то мы просто сдвинем всю систему координат со всеми примитивами, которые мы нарисовали, а нам надо сдвинуть ТОЛЬКО куб.
Вот здесь и пригодятся эти функции.

Запомним систему координат -> сдвинем куб -> восстановим систему координат.

Таким образом, получится, что мировая система координат останется на месте, а система координат куба будет смещена.

Изменим код вывода куба:
 glpushMatrix; //Запомнили
 glTranslatef(-5,0,0); //Сместили
 glutSolidCube(1);      //Рисуем куб
 glPopmatrix;  //Восстановили

Вот сейчас, когда стало много места, можно нарисовать сферу функцией glutSolidSphere(радиус, кол-во сегментов по X, кол-во сегментов по Y) и сдвинем в противоположную сторону.
 glpushMatrix; //Запомнили
 glTranslatef(5,0,0); //Сместили
 glutSolidSphere(2,20,20);  //Рисуем сферу
 glPopmatrix; //Восстановили

Двигаемся дальше и рисуем тор функцией glutSolidTorus(радиус сечения, радиус окружности, кол-во сегментов по X,кол-во сегментов по Y) и сдвинем его от нас на 5 единиц пространства.
 glpushMatrix; //Запомнили
 glTranslatef(0,5,0); //Сместили
 glutSolidTorus(1, 2, 20, 20);//Рисуем тор
 glPopmatrix; //Восстановили

Нарисуем додекаэдр функцией glutSolidDodecahedron и сдвинем его в нашу сторону.
 glpushMatrix; //Запомнили
 glTranslatef(0,-5,0); //Сместили
 glutSolidDodecahedron (); //Рисуем додекаэдр
 glPopmatrix; //Восстановили

И наконец, нарисуем конус функцией glutSolidCone(радиус базы, высота, кол-во сегментов по X,кол-во сегментов по Y) и сдвинем его вверх на 2 единицы.
 glpushMatrix; //Запомнили
 glTranslatef(0,0,2); //Сместили
 glutSolidCone (2, 3, 10, 10); //Рисуем конус
 glPopmatrix; //Восстановили

Всё. Таким образом, процедура FormPaint должна содержать следующий код:
 glpushMatrix;
 glTranslatef(-5,0,0);
 glutSolidCube(1);      //Куб
 glPopmatrix;

 glpushMatrix;
 glTranslatef(5,0,0);
 glutSolidSphere(2,20,20);  //Сфера
 glPopmatrix;

 glpushMatrix;
 glTranslatef(0,5,0);
 glutSolidTorus(1,2,20,20);  //Тор
 glPopmatrix;

 glpushMatrix;
 glTranslatef(0,-5,0);
 glutSolidDodecahedron();   //Додекаэдр
 glPopmatrix;

 glpushMatrix;
 glTranslatef(0,0,2);
 glutSolidCone(2,3,10,10);   //Конус
 glPopmatrix;
  В следующем уроке мы познакомимся с нормалями.



Добавил(а): wagner Дата: 2012-07-23
можно было бы и написать, как подключается эта библиотека..., а без не смысла нет дальше продолжать



Добавил(а): Admin Дата: 2012-07-24
Все библиотеки подключаются записью в uses. Добавьте DGLUT в uses.



Добавил(а): wagner Дата: 2012-07-24
Нееееет))) то что подключать библиотеки в разделе uses это понятно, я немного не так пояснил проблему) куда "засунуть" скачанный файл, чтобы библиотека привязалась? просто в папку с проектом?



Добавил(а): Admin Дата: 2012-07-24
По-моему да, просто в папку с проектом. Если не выходит, киньте в папку C:\Program Files (x86)\Borland\Delphi7\Lib



Добавил(а): Drimer Дата: 2012-12-05
немогу скачать файл DGLUT.PAS вибрасиваєт мне как текст ((( што мне зделать?)))



Добавил(а): Admin Дата: 2012-12-06
Нажми ПКМ и выбери "Сохранить как..."



Добавил(а): Doggy Дата: 2013-01-12
thank you!!!



Добавил(а): gasmator Дата: 2013-05-11
у меня вместо куба квадрат рисует



Добавил(а): Klesh Дата: 2013-05-11
Для куба надо использовать glutSolidCube, попробуй повернуть на 45 градусов куб, сразу станет ясно.



Добавил(а): Joker1999obp Дата: 2013-10-17
почему у меня после освешения куб просто стал не белым а серим и всю



Добавил(а): Joker1999obp Дата: 2013-10-19
и как повернуть куб или другой 3D объект ?



Добавил(а): kordalk Дата: 2014-01-06
glRotatef(x,y,z,Angle);



Добавил(а): romankononovich Дата: 2014-04-28
Как можно сделать отсечение сферы и получить полусферу?



Добавил(а): Dionis Дата: 2014-09-26
а как реализовать рисование фигур с помощью кнопок????



Добавил(а): revolution Дата: 2014-10-02
Хм... При добавлении кода glutSolidCube(1); ничего не происходит. Все делал в точности как и в уроке, ошибок нет. Подскажите пожалуйста что делать



Добавил(а): Dionis Дата: 2014-10-03
всё должно работать, если ты с кнопкой или таймером работаешь, то её процедура должна описана как и форм_паинт на предыдущих уроках: например: FormResize(Sender);//процедура обновления if GetAsyncKeyState(VK_LEFT)<>0 then angle:=angle+0.5; if GetAsyncKeyState(VK_RIGHT)<>0 then angle:=angle-0.5; glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT ); glRotatef(angle,0,0,1); glpushMatrix; glTranslatef(-5,0,0); glutSolidCube(1); //Куб glPopmatrix; SwapBuffers(Canvas.Handle);



Добавил(а): postfedor Дата: 2015-09-18



Добавил(а): Ultimate.Warrior Дата: 2015-12-26
Можно ли наложить текстуры на эти фигуры?



Добавил(а): Episkop Дата: 2016-04-20
А как нарисовать цилиндр?


    No results found.
Отменить.