Логин: Пароль:    Регистрация Всеми возможностями сайта можно пользоваться
только после авторизации.
   Забыли пароль?

Поиск
L



Статистика
u
Пользователи онлайн: нет
Гостей онлайн: 1
Всего онлайн: 1
Зарегистрировано юзеров: 6358
Комментариев на сайте: 645
Новый юзер: Realtyvaday



Последние комментарии
c
Aqel прокомментировал "Урок 71 - Работа с сжатыми файлами":
GZip псевдоархив, на мой вопрос тоже не отвечают, как распаковать отдельные файлы/папки...
Pingitrus прокомментировал "Урок 71 - Работа с сжатыми файлами":
Есть еще кто нибудь живой на этом сайте, кто сможет помочь? Так то все работает, zip и rar распаковывает, но у меня есть файл dat который сжат GZip, почему то его не удается распаковать или так не получится так как этот файл не является архивом или является?)) пишет ошибку что неверная функция



Мы в соцсетях
c
Delphi
Урок 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;
  В следующем уроке мы познакомимся с нормалями.

Зарегистрируйтесь или авторизуйтесь, чтобы скачать.

Источник: www.thedelphi.ru
Автор: Клящицкий Виталий
Опубликовано: 17 Мая 2012
Просмотров:

Урок 2 - Простые примитивы Урок 4 - Нормали

Зарегистрируйтесь или авторизуйтесь, чтобы добавлять комментарии.



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




аватар Добавил: Admin [Сэнсэй] vk.com/savelev_a_y Дата: 2012-07-24
Все библиотеки подключаются записью в uses. Добавьте DGLUT в uses.




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




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




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




аватар Добавил: Admin [Сэнсэй] vk.com/savelev_a_y Дата: 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
А как нарисовать цилиндр?