Урок 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
А как нарисовать цилиндр?


  1. SbhYE
    SbhYE 8 months ago
    Pills prescribing information. Long-Term Effects. <a href="https://viagra4u.top">where to get viagra</a> in USA. All about medication. Read information now.
    [url=https://goprint.pk/products/1924/best-wife-ever]Some trends of medication.[/url] [url=https://liselefaucheux.com/boutique/commander/carnet-de-voyage/#comment-23387]Actual information about drugs.[/url] [url=http://image.com.jo/?attachment_id=23379]All news about medication.[/url] 06a2825
  2. oyxbryzgmk
    oyxbryzgmk 6 months ago
    Урок 3 - Объёмные фигуры - The Delphi
    [url=http://www.gnpwnp85896reii5e72q23r07gq05k17s.org/]uoyxbryzgmk[/url]
    <a href="http://www.gnpwnp85896reii5e72q23r07gq05k17s.org/">aoyxbryzgmk</a>
    oyxbryzgmk http://www.gnpwnp85896reii5e72q23r07gq05k17s.org/
  3. onooxtzvw
    onooxtzvw 4 months ago
    Урок 3 - Объёмные фигуры - The Delphi
    <a href="http://www.g1f361b5tn4ok37lym3q30lqb98o70k2s.org/">aonooxtzvw</a>
    [url=http://www.g1f361b5tn4ok37lym3q30lqb98o70k2s.org/]uonooxtzvw[/url]
    onooxtzvw http://www.g1f361b5tn4ok37lym3q30lqb98o70k2s.org/
  4. nqqncheoo
    nqqncheoo 4 months ago
    Урок 3 - Объёмные фигуры - The Delphi
    [url=http://www.gd07ive85664oxe3vi6llqb61j694k30s.org/]unqqncheoo[/url]
    nqqncheoo http://www.gd07ive85664oxe3vi6llqb61j694k30s.org/
    <a href="http://www.gd07ive85664oxe3vi6llqb61j694k30s.org/">anqqncheoo</a>
  5. rmtqgllzwi
    rmtqgllzwi 3 months ago
    Урок 3 - Объёмные фигуры - The Delphi
    [url=http://www.g6dt63lz7t9883dv968i59sqhs53ab4cs.org/]urmtqgllzwi[/url]
    rmtqgllzwi http://www.g6dt63lz7t9883dv968i59sqhs53ab4cs.org/
    <a href="http://www.g6dt63lz7t9883dv968i59sqhs53ab4cs.org/">armtqgllzwi</a>
  6. ikncypzgq
    ikncypzgq a month ago
    Урок 3 - Объёмные фигуры - The Delphi
    <a href="http://www.gi4e74hj2z8f2botg13v1uf007o970y7s.org/">aikncypzgq</a>
    ikncypzgq http://www.gi4e74hj2z8f2botg13v1uf007o970y7s.org/
    [url=http://www.gi4e74hj2z8f2botg13v1uf007o970y7s.org/]uikncypzgq[/url]
  7. nghdwhlhej
    nghdwhlhej a month ago
    Урок 3 - Объёмные фигуры - The Delphi
    nghdwhlhej http://www.gw07rb5h4zsah7j290q8g48sc6l92z36s.org/
    [url=http://www.gw07rb5h4zsah7j290q8g48sc6l92z36s.org/]unghdwhlhej[/url]
    <a href="http://www.gw07rb5h4zsah7j290q8g48sc6l92z36s.org/">anghdwhlhej</a>
  8. igstnojth
    igstnojth a month ago
    Урок 3 - Объёмные фигуры - The Delphi
    [url=http://www.ga93r12a6a0eg29xpe6t476384qnqq3bs.org/]uigstnojth[/url]
    <a href="http://www.ga93r12a6a0eg29xpe6t476384qnqq3bs.org/">aigstnojth</a>
    igstnojth http://www.ga93r12a6a0eg29xpe6t476384qnqq3bs.org/
  9. rskzmvjz
    rskzmvjz a month ago
    Урок 3 - Объёмные фигуры - The Delphi
    [url=http://www.g8z23hx15nc6f89ynfd79q72v46p3ka0s.org/]urskzmvjz[/url]
    <a href="http://www.g8z23hx15nc6f89ynfd79q72v46p3ka0s.org/">arskzmvjz</a>
    rskzmvjz http://www.g8z23hx15nc6f89ynfd79q72v46p3ka0s.org/
  10. qijhbkjcel
    qijhbkjcel a month ago
    Урок 3 - Объёмные фигуры - The Delphi
    [url=http://www.gb5409bkn4457j5o986u5m64x6nifiyvs.org/]uqijhbkjcel[/url]
    <a href="http://www.gb5409bkn4457j5o986u5m64x6nifiyvs.org/">aqijhbkjcel</a>
    qijhbkjcel http://www.gb5409bkn4457j5o986u5m64x6nifiyvs.org/
  11. igyjzojhhi
    igyjzojhhi a month ago
    Урок 3 - Объёмные фигуры - The Delphi
    igyjzojhhi http://www.ga5w86z6pfh2o7a4vi6p003mm7n66e07s.org/
    [url=http://www.ga5w86z6pfh2o7a4vi6p003mm7n66e07s.org/]uigyjzojhhi[/url]
    <a href="http://www.ga5w86z6pfh2o7a4vi6p003mm7n66e07s.org/">aigyjzojhhi</a>
  12. nrrncjrl
    nrrncjrl a month ago
    Урок 3 - Объёмные фигуры - The Delphi
    nrrncjrl http://www.g2ru0866quj1a526ku6a720fgv7qi8q6s.org/
    <a href="http://www.g2ru0866quj1a526ku6a720fgv7qi8q6s.org/">anrrncjrl</a>
    [url=http://www.g2ru0866quj1a526ku6a720fgv7qi8q6s.org/]unrrncjrl[/url]
  13. gmiblgegvm
    gmiblgegvm 2 days ago
    Урок 3 - Объёмные фигуры - The Delphi
    <a href="http://www.gg23tnkoq15pi7p88y46o8ja341t20y5s.org/">agmiblgegvm</a>
    [url=http://www.gg23tnkoq15pi7p88y46o8ja341t20y5s.org/]ugmiblgegvm[/url]
    gmiblgegvm http://www.gg23tnkoq15pi7p88y46o8ja341t20y5s.org/
  14. fgmcqyptwy
    fgmcqyptwy a day ago
    Урок 3 - Объёмные фигуры - The Delphi
    fgmcqyptwy http://www.gxsnn3w3a35fe72s145702axs6c8y2q1s.org/
    [url=http://www.gxsnn3w3a35fe72s145702axs6c8y2q1s.org/]ufgmcqyptwy[/url]
    <a href="http://www.gxsnn3w3a35fe72s145702axs6c8y2q1s.org/">afgmcqyptwy</a>
Отменить.