Урок 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.