Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Фото альбом
Карта сайта

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Раскрутка сайта
-Заработок в Net
-}{акинг
-Разное

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-Книги по }{акингу
-PHP Fusion MOD'ы
-Курсовые
-by Kest
Professional Download System
Услуги
Возможно выполнение лаб
работ
и курсовых на Delphi
и Turbo Pascal, обращаться сюда. Дешево
Программа для рисования блок-схем
Популярные статьи
Гостевая книга ... 16161
Панель случайны... 9319
OpenGL и Delphi... 8475
Создание отчето... 7624
Бип из системно... 6815
Invision Power ... 6076
Видео – залог у... 5540
Установка, нас... 5499
Учебник Паскаль 5391
Анимация в комп... 5385
АЙ СИК Ю? АЙ ХА... 5251
Визуальные фильтры 5174
Вызов хранимых ... 5078
Организация зап... 5017
21 ошибка прогр... 4993
Имитационное мо... 4985
Как зарабоатыва... 4841
ТЕХНОЛОГИИ ДОСТ... 4804
Добавление в фо... 4677
Создание дистри... 4405
Реклама
заказывайте люстры, светильники, бра , интернет магазин светильников на voltoff.ru .
Предлагаем деаэратор воды по лучшему соотношению цена-качество.
Сейчас на сайте
Гостей: 6
На сайте нет зарегистрированных пользователей

Пользователей: 1,182
новичок: altynay
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
OpenGL и Delphi (3D графика)
Cейчас уже ни кого не удивляет разнообразие игр с 3-х мерной графикой. За относительно небольшие сроки программисты умудряются создать небольшой виртуальный мир. Если посмотреть в его корень, то станут видны сложные математические формулы. Лет 10-15 назад, используя их, программисты с нуля разрабатывали 3-х мерные миры таких игр, как Wolf 3d, Rise Of the Triad, Doom. Тоже самое происходило и с CAD-ситемами для создания моделей будущих механизмов и машин. Сегодня же для этих целей используются готовые программные средства, берущие на себя заботы о прорисовке графики. Наверное, нет человека, который бы не слышал таких названий, как Direct3D, OpenGL. Они являются результатом сотрудничества крупных компьютерных компаний.

OpenGL появилась и сформировалась как стандарт 3-х мерной графики в 1992 г. Однако, разработка ее велась еще с 1982. Формированием этого стандарта занимались также такие фирмы, как: Microsoft, IBM сorporation, Sun Microsystems, Inc., Digital Equipment Corporation (DEC), Hewlett-Packard Corporation, Intel Corporation и др. Результат - это OpenGL - стандартная библиотека для многих 32-разрядных операционных систем (Windows, Linux в том числе), в отличие от Direct3D, которая характерна только для Windows. OpenGl содержит в себе более 100 процедур и функций для построения 3-х мерной графики. Они находятся в opengl32.dll (Windowssystem) и в расширении glu32.dll.

 

Чтобы вы могли хотябы немного (:-) представить их возможности, вспомните такие игры как: Quake 3, Return To the Castle Of Wolf, а также хранитель экрана в Windows под названием "Объемный текст" :-).

 

OpenGl можно использовать с разными языками программирования, поддерживающими работу с DLL. Но во многих уже есть поддержка OpenGl, "ограждающая" программиста от непосредственой работы с функциями и процедурами из DLL. Одним из таких языков программирования является Object Pascal, использующийся в среде Delphi. Да, да! Именно Delphi. Этот факт еще раз доказывает то, что в Delphi можно создавать не только скучные базы данных, но и полноценные мультимедийные приложения (игры, демо-програмки). Да и вообще в Delphi столько разных возможностей! Но сегодня поговорим об использовании OpenGl.

 

Delphi и OpenGl

 

Начиная с 3-й версии в комплекте Delphi поставляется заголовочный файл, содержащий описания процедур и функций, содержащихся в opengl32.dll. А также файл помощи с описанием типов, процедур и функций (далее команд). В 3-й версии хэлп очень уж облегченный и почти полностью "стянутый" с СИ, в 5-й версии уже наблюдаются улучшения. Для того, чтобы использовать OpenGL в Delphi-проекте нужно дописать к списку подключаемых модулей opengl. После этого по любой ее команде можно получить подсказку или помощь обычным в Delphi способом. Для использования OpenGL вовсе не обязательно иметь 3d аксселератор (но не помешало бы). При работе с простенькими сценами и для изучения основ вполне достаточно даже S3 Trio с 1 мб. Сервер OpenGL перед началом работы определяет, на каком оборудовании его пользуют и, в соответствие с этим, подбирает оптимальные настройки. Для этого программист в своей программе должен сделать установку формата пикселя, которому соответствует тип TPixelFormatDescriptor. При установке формата пикселя можно задавать различные флаги, влияющие на вывод изображения. Например, если вы используете анимацию, то без установки флага PFD_DOUBLEBUFFER никак не обойтись. Он устанавливает режим двойной буферизации - изображение сначала рисуется в памяти (в буфере), а потом выводится на экран для устранения мерцания. Следует также отметить, что OpenGl является промежуточным звеном между программой и устройством вывода. Т.е. ему надо сообщать, куда будет производиться вывод. Для этого используется контекст устройства и контекст воспроизведения. Первому соответствует свойство canvas.handle формы или др. Для второго - в OpenGl существует специальный тип HGLRC (Handle openGL Rendering Context) - ссылка на контекст воспроизведения.

 

Команды и типы OpenGl

 

Мультиплатформенность OpenGl обусловлена наличием ее собственных типов данных. Начинаются они с префикса GL и приведены в заголовочном файле Delphi - opengl.pas. Многим соответствуют стандартные типы Delphi (например, GLfloat соответствует типу Single - числу с плавающей точкой). Команды OpenGl начинаются тоже с префикса GL, после которого идет обозначение действия команды. В окончании определяется количество требуемых аргументов и их тип. Например, glColor3f - команда OpenGl для установки цвета, использующая 3 аргумента - числа с плавающей точкой (f - от слова float). Если в окончании присутсвует симовол v (пример, 3fv), это значит, что в качестве аргумента будет использоваться массив (окончание 3fv указывает, что аргумент - массив 3-х чисел с плавающей точкой). Практически все команды для рисования размещаются в специальных программных скобках glBegin и glEnd. Они не имеют ничего общего с паскалевским begin, end. У glBegin есть аргумент, которым является константа, определяющая рисуемый далее (до glEnd) графический примитив. Например, между glbegin и glEnd есть команды, задающие координаты вершин примитива. Если аргументом glBegin является, к примеру, константа gl_quads, то построится прямоугольник на задаваемых далее вершинах, если gl_points - просто точки с координатами вершин и т.п. Рекомендуется использовать тип аргументов - GlFloat, но можно работать и с другими. Если вы используете GlFloat, то обратите внимание на то, что вывод будет осуществляться в область от -1 до +1 по x и по y. Так (-1,-1) - координата верхнего левого угла области вывода, а (-0.99,-1) - точка где-то рядом с ним. При задании цвета, 0 - минимальное значение его составляющей (rgb), а 1 - максимальное (вроде, как 255), 0.5 - среднее.


Чтобы разобраться со всем этим на практике давайте рассмотрим простой пример. Он рисует некое кубическое подобие коробка, которое вращается и освещается источником света. Первым делом пропишем процедуру, устанавливающую формат пиксела. Она имеет такой вид:


procedure SetDCPixelFormat (hdc : HDC);

var

pfd : TPixelFormatDescriptor;

nPixelFormat : Integer;

begin

FillChar (pfd, SizeOf (pfd), 0);

pfd.dwFlags :=PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;

nPixelFormat :=ChoosePixelFormat (hdc, @pfd);

SetPixelFormat(hdc, nPixelFormat, @pfd);

end;


Здесь во флагах pfd устанавливаются PFD_SUPPORT_OPENGL или PFD_DOUBLEBUFFER - это “говорит” серверу OpenGL, что система, на которой он будет работать поддерживает работу с ним, а также, что будет использоваться двойная буферизация. Далее ChoosePixelFormat подбирает формат пикселя, а SetPixelFormat - устанавливает этот формат. В качестве аргумента в процедуру передается ссылка на контекст устройства. Далее в обработчиках событий OnCreate и OnDestroy формы напишите следующее:


procedure Tform1.FormCreate(Sender: TObject);

begin

DC := GetDC (Handle);

SetDCPixelFormat(DC);

hrc := wglCreateContext(DC);

wglMakeCurrent(DC, hrc);

glClearColor (0.0, 0.0, 0.75, 1.0);

glMatrixMode (GL_PROJECTION);

glLoadIdentity;

glFrustum (-1, 1, -1, 1, 2, 20);

glMatrixMode (GL_MODELVIEW);

glLoadIdentity;

glTranslatef(0.0, 0.0, -6.0);

end;

procedure Tform1.FormDestroy(Sender: TObject);

begin

wglMakeCurrent(0, 0);

wglDeleteContext(hrc);

ReleaseDC (Handle, DC);

DeleteDC (DC);

end;


В первом случае при создании формы получаем GetDC контекст устройства (в данном случае формы), устанавливаем формат пикстела, с помощью wglCreateContext создаем контекст воспроизведения и делаем его основным (можно использовать несколько контекстов). Переменная hrc имеет тип HGLRC, а DC - HDC. Рекомендуется определять их в разделе private. Затем определяем цвет фона и устанавливаем матрицу преобразования координат для построения объемного изображения. glTranslatef "сдвигает в глубину" рисуемый далее объект.

Теперь создайте на форме кнопку - для запуска анимации. А в ее обработчике события OnCLick наберите такой текст:


procedure Tform1.Button1Click(Sender: TObject);

begin

glEnable (GL_LIGHTING);

glEnable (GL_LIGHT0);

glEnable (GL_DEPTH_TEST);

timer1.enabled:=true;

end;


glEnable позволяет включать разные опции. В данном случае - использование источников света.

 

Далее этой же командой включаем источник света GL_LIGHT0. Их может быть несколько, но в данном случае ограничимся одним. glEnable (GL_DEPTH_TEST) - включает режим проверки глубины изображения. Позднее попробуйте ее убрать - сразу поймете, что к чему.

 

Поместите на форму таймер, установите его интервал 100 и enable=false, а обработчик его события приведите к таком виду:


procedure Tform1.Timer1Timer(Sender: TObject);

begin

glRotatef(1.0, 1.0, 1.0, 1.0);

glRotatef(1.0, 1.0, 1.0, 0.0);

glRotatef(1.0, 1.0, 1.0, 1.0);

SwapBuffers(DC);

InvalidateRect(Handle, nil, False);

end;


На каждый тик таймера будет происходить поворот командой glRotatef на угол 1 (первый аргумент).

 

Затем SwapBuffers(DC) картинку из памяти отобразит на форме. Для перерисовки формы лучше использовать функцию API InvalidateRect - это быстрее, чем repaint. Теперь осталось последнее - задать, что же будет вырисовываться. В обработчике события формы Onpaint каждый раз рисуется одна и та же картинка, но так как по таймеру происходит поворот координатных осей, создается эффект анимации и вращения именно объекта. В OpenGl есть также возможность изменять точку наблюдателя - glLookAt.


procedure Tform1.FormPaint(Sender: TObject);

begin

glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glBegin(GL_QUADS);

glNormal3f(0.0, 0.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;

glBegin(GL_QUADS);

glNormal3f(-1.0, 0.0, 0.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;

glBegin(GL_QUADS);

glNormal3f(0.0, 1.0, 0.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;

glBegin(GL_QUADS);

glNormal3f(1.0, 0.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;

glBegin(GL_QUADS);

glNormal3f(0.0, 0.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;

end;


GlClear - очищает буфер. А далее заданием коодинат вершин (glVertex) строим стороны куба. glNormal - задает так называемый вектор нормали, требующийся для корректного изменения цвета объекта при освещении. Теперь все готово - можете запускать и любоваться сиим творением.

Данная статья только знакомит с некоторыми основами OpenGL, но не рассматривает многочисленных нюансов и возможностей этой замечательной библиотеки, т.к. для это потребовалось бы несколько десятков журналов, посвященных только ей. Да и вообще, зачем превращать замечательный журнал в узкоспециализированное учебное поссобие - ведь информации по OpenGL достаточно и в Интернет и на книжных рынках. Могу посоветовать книгу "OpenGL: графика в проектах Delphi", М.Краснов, 2000 г. издательство bhv. Вообще, со слов специалистов, OpenGL более легкий в изучении, чем Direct3D, а по мощности и возможностям не уступает. Причина, по которой многие используют Direct3d в основном заключается в том, что в придачу к нему есть еще библиотеки для работы со звуком, музыкой, сеткой, вводом/выводом. Но вы же видели, что создают парни из Id Software? На мой взгляд, (без лишних слов) OpenGL - rulez! Так, что изучайте. Пригодится не только для создания игр, но и для серьёзных вещей, вроде моделирования работы различных механизмов и т.п.

Статьи по теме >> [изучение основных приемов работы с библиотекой OpenGL на языке Object Pascal (Delphi), приобретение навыков по ее инициализации]

Опубликовал Kest Октябрь 25 2008 15:37:32 · 9 Комментариев · 8475 Прочтений · Для печати
Комментарии
Admer Март 30 2009 19:58:34
В Delphi 7 этот пример у меня не работает, выдает обычное окно с серым фоном, который после нажатия на кнопку меняется на черный. И ничего больше этого черного окна у меня нет.
А статья написана хорошо, читать приятно и информации много, . и тем более обидно что пример не работает. Надеюсь это не так и задумано ?
Kest Март 30 2009 23:24:31
Что то ты неправильно сделал.. У меня все получилосьsmiley. Вот скрин:

DeadDDante Апрель 08 2009 15:53:37
Спс! Очень актуально в предверии курсовой))
fantaradist Март 18 2010 12:45:07
3D анимация - это круто smiley
grim Апрель 04 2010 12:12:57
а у меня почему то без граней получился(
Tim Kruz Июнь 28 2010 21:43:37
У меня тоже чёрное окно и всё. smiley
Хотя я у меня Дэлфи 7 и 2D OpenGL работает нормально.
Kest Июнь 28 2010 22:42:59
Tim Kruz
У меня тоже чёрное окно и всё.
Хотя я у меня Дэлфи 7 и 2D OpenGL работает нормально.


Попробуй установить эту - codingrus.ru/infusions/pro_download_panel/download.php?did=70
Alex Июль 04 2010 13:55:13
С OpenGL работаю в-первые, вообще в Делфи мало работалsmiley пример получилсяsmiley, но понимаю что полноценные проги в 3D пока очень сложноваты для меня
дупар Август 06 2010 11:51:40
Таки не понял что кнопка то делает smiley
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* 8 + 4=
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Отлично! Отлично! 100% [1 Голос]
Очень хорошо Очень хорошо 0% [Нет голосов]
Хорошо Хорошо 0% [Нет голосов]
Удовлетворительно Удовлетворительно 0% [Нет голосов]
Плохо Плохо 0% [Нет голосов]
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Загрузки
Новые загрузки
База данных: Книж...
Пример работы с р...
Добавление басса ...
Моделирование дви...
Черный круг двига...

Случайные загрузки
Приемы программир...
WebReg v1.3
Алгоритмы шифрова...
Microsoft SQL Ser...
PHP 5
Adapter [Исходник...
Шкрыль А. - Разра...
Delphi Russian Kn...
Фундаментальные а...
Переработанный пл...
Мониторинг сервер...
MpegPlay
PHP 5. Практика с...
Язык программиров...
Assembler. Практикум
Zoom [Исходник на...
ActiveX в Delphi
Аватары в комме...
Язык программиров...
Globus VCL Extent...

Топ загрузок
Converter AMR<-... 13141
FreeSMS v1.3.1 2550
WebReg v1.3 882
Delphi 7 Enterp... 845
Turbo Pascal fo... 765
GamesBase 3.0 636
RxLIB 291
Borland Delphi ... 287
CoolControls v3... 278
RbControls 263
Случайные статьи
Постоянно продолжа...
IP адрес, его опре...
Фреймова модель пр...
Как вывести на стр...
Определить номера ...
Лицензирование акт...
Представления дере...
Абстрактные типы д...
Оптимизация сайта
Тематические интер...
9.4. Присоединени...
Триада PHP - MySQL...
Вычисление значени...
Отправить письмо н...
Логическое «ИЛИ» (...
Задание таблицы дл...
Создание дистрибут...
DQTABLE (РАЗНОСТНА...
Введение в PHP5
Получение аннотаци...
Разрыв страницы
Проектирование алг...
ФУНКЦИОНАЛЬНАЯ СТР...
Этап 6 - выделение...
АМ-MSK модулятор
Статистика



Друзья сайта
Бесплатные программы
Программы, игры
Создание игр, графика, программирование