Статья: OpenGL и Delphi на практике

Статья: OpenGL и Delphi на практике




🛑 👉🏻👉🏻👉🏻 ИНФОРМАЦИЯ ДОСТУПНА ЗДЕСЬ ЖМИТЕ 👈🏻👈🏻👈🏻




























































Любая теория хороша, если она может быть реализована на Delphi :-). Поэтому предлагаю не откладывая в долгий ящик написать первую программу на OpenGL - а потом, окрылившись успехом, вернуться к теории и как следует проштудировать все книги и сайты по сабжу, чтобы уж стать настоящими монстрами трехмерного моделирования.
Для начала придется проделать подготовительную работу:
настроить формат пикселей с учетом отображаемой информации;
создать контекст OpenGL и подготовить сам движок OpenGL к работе.
Формат пикселей удобно вынести в отдельную процедуру, которую мы оформим следующим образом:
procedure SetDCPixelFormat (dc: HDC);
nPixelFormat:=ChoosePixelFormat (DC,@pfd);
SetPixelFormat (DC, nPixelFormat,@pfd);
Здесь при заполнении структуры TPixelFormatDescriptor мы задаем параметры будущего графического отображения, в том числе количество цветовых бит, а также тип пикселей (iPixelType). Мы также задаем флаги, которые, как видно из названия, указывают, что наша программа будет поддерживать OpenGL, а также что мы будем рисовать в окне и использовать двойную буферизацию (параметр, необходимый для воспроизведения движущихся объектов).
Далее посредством вызова ChoosePixelFormat система выбирает подходящий формат пикселя - и мы присваиваем его (через SetPixelFormat) нашему окну.
Теперь нужно инициализировать контекст самого OpenGL посредством функций, содержащихся в модуле Windows, и произвести дополнительную настройку движка:
procedure TForm1.FormCreate (Sender: TObject);
Как видим, сначала мы задали для нашей графики необходимый формат пикселей. Теперь при помощи функции wglCreateContext создаем OpenGL-контекст, а впоследствии делаем его текущим контекстом. Далее, используя уже универсальные функции**, произведем настройку "мира", который будем создавать. Для этого через glClearColor очистим контекст и заполним ее 60-процентным черным цветом. Далее выберем матрицу проекций, которая определяет, как будут проецироваться трехмерные объекты на плоскость экрана (в оконные координаты) и через glLoadIdentity установим единичную матрицу и зададим границы плана в "мировых координатах" при помощи вызова glFrustum. После чего загрузим модельно видовую матрицу и произведем ее смещение (glTranslatef).
Конечно, можно было нарисовать простую пирамиду или же куб. Но мы сделаем большее - нарисуем "признание в любви"** (рис. 1). Специально для этого методом "научного перебора" была разработана модель, описывающая соответствующую кривую:
Остается только перевести ее с языка математики на нормальный человеческий.
Подготовку сцены начнем с подключения разных дополнительных функций, без которых дальнейшая работа невозможна. Эти функции прописаны в методе BeginPaint, а также в методе FormResize (чтобы при изменении размера формы соответственно менялся размер объекта). Для этого используем функцию glEnable с соответствующими параметрами.
Далее в FormPaint используем подготовленные заранее методы DrawFace и DrawElement (см. листинг ниже) для отрисовки упомянутого объекта. А для придания ему еще большей "жары" используем возможности OpenGL по освещению сцены.
С точки зрения сложности освоения OpenGL сопоставим с другими подобными библиотеками. Так что с одной стороны нет разницы, в чем разбираться и что изучать. Но с точки зрения разумного подхода любой проект трехмерной графики должен как минимум поддерживать OpenGL в качестве одной из опций. Ведь серьезные вещи считаются и визуализируются, как правило, под Unix/IRIX/Linux/FreeBSD, и в то же время было бы неправильно игнорировать пользователей Windows. Так что OpenGL как раз и является тем универсальным языком и общим знаменателем, позволяющим вашим приложениям свободно мигрировать с одной платформы на другую.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,OpenGL, StdCtrls, ExtCtrls;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormResize(Sender: TObject);
const mat1_dif:Array[0..2] of Single = (0.8,0.8,0.0);
const mat1_amb:Array[0..2] of Single = (0.2,0.2,0.2);
const mat1_spec:Array[0..2] of Single = (0.6,0.6,0.6);
procedure DrawElement(A,b,R0,r1:Single);
procedure DrawFace(A,R:Single;Normal:Boolean);
procedure SetDCPixelFormat(dc:HDC);
nPixelFormat:=ChoosePixelFormat(DC,@pfd);
SetPixelFormat(DC,nPixelFormat,@pfd);
procedure TForm1.FormCreate(Sender: TObject);
procedure TForm1.FormDestroy(Sender: TObject);
procedure TForm1.Timer1Timer(Sender: TObject);
procedure DrawElement(a,b,r0,r1:Single);
x0b:=a*sin(t0)*sin(t0)*sin(t0)*sin(t0)*cos(t0);
x0e:=a*sin(t0+dt)*sin(t0+dt)*sin(t0+dt)*sin(t0+dt)*cos(t0+dt);
x1b:=b*sin(t0)*sin(t0)*sin(t0)*sin(t0)*cos(t0);
x1e:=b*sin(t0+dt)*sin(t0+dt)*sin(t0+dt)*sin(t0+dt)*cos(t0+dt);
glNormal((x0b+x1e)/2,(y0b+y1e)/2,(r1+r0)/2);
procedure DrawFace(A,R:Single;Normal:Boolean);
x:=a*sin(t0)*sin(t0)*sin(t0)*sin(t0)*cos(t0);
x:=a*sin(t0)*sin(t0)*sin(t0)*sin(t0)*cos(t0);
if Normal then glNormal3f(x,y,-r) else glNormal3f(x,y,r);
procedure TForm1.FormPaint(Sender: TObject);
var m,n:single;dm:Single;a:Single;df:Single;
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glMaterialfv(GL_FRONT,GL_AMBIENT,@mat1_amb);
glMaterialfv(GL_FRONT,GL_DIFFUSE,@mat1_dif);
glMaterialfv(GL_FRONT,GL_SPECULAR,@mat1_spec);
glMaterialf(GL_FRONT,GL_SHININESS,mat1_shininess);
DrawElement(Sqrt(a-m*m),Sqrt(a-(m+dm)*(m+dm)),m/df,(m+dm)/df);
DrawFace(Sqrt(a-(m)*(m)),(m)/df,True);
DrawFace(Sqrt(a-(m)*(m)),(m)/df,True);
procedure TForm1.FormResize(Sender: TObject);
const lm:Array[0..3] of Single = (0.5,0.5,0.5,1.0);
light_ambient:array[0..3] of glfloat = (0.0,0.0,0.0,1.0);
light_diffuse:array[0..3] of glfloat = (1.0,1.0,1.0,1.0);
light_specular:array[0..3] of glfloat = (2.0,2.0,2.0,1.0);
light_position:array[0..3] of glfloat = (2.0,1.0,3.0,1.0);
light_emission:array[0..3] of glfloat = (1.0,1.0,1.0,1.0);
light_spotdirection:array[0..3] of glfloat = (1.0,1.0,1.0,1.0);
glLightModel(GL_LIGHT_MODEL_LOCAL_VIEWER,Ord(True));
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,@lm);
glLightfv(GL_LIGHT0,GL_AMBIENT,@light_ambient);
glLightfv(GL_LIGHT0,GL_DIFFUSE,@light_diffuse);
glLightfv(GL_LIGHT0,GL_SPECULAR,@light_specular);
glLightfv(GL_LIGHT0,GL_POSITION,@light_position);
glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,8);
glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,170);
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,@light_spotdirection);

Название: OpenGL и Delphi на практике
Раздел: Рефераты по информатике, программированию
Тип: статья
Добавлен 18:09:10 18 марта 2007 Похожие работы
Просмотров: 88
Комментариев: 16
Оценило: 3 человек
Средний балл: 5
Оценка: неизвестно   Скачать

Срочная помощь учащимся в написании различных работ. Бесплатные корректировки! Круглосуточная поддержка! Узнай стоимость твоей работы на сайте 64362.ru
Если Вам нужна помощь с учебными работами, ну или будет нужна в будущем (курсовая, дипломная, отчет по практике, контрольная, РГР, решение задач, онлайн-помощь на экзамене или "любая другая" учебная работа...) - обращайтесь: https://clck.ru/P8YFs - (просто скопируйте этот адрес и вставьте в браузер) Сделаем все качественно и в самые короткие сроки + бесплатные доработки до самой сдачи/защиты! Предоставим все необходимые гарантии.
Привет студентам) если возникают трудности с любой работой (от реферата и контрольных до диплома), можете обратиться на FAST-REFERAT.RU , я там обычно заказываю, все качественно и в срок) в любом случае попробуйте, за спрос денег не берут)
Да, но только в случае крайней необходимости.

Статья: OpenGL и Delphi на практике
Дневник Практики Юриста В Полиции
Реферат На Тему Употребление Алкоголя
Реферат: Diego Maradona Soccer Superstar Essay Research Paper
Реферат: Египет и Русь: Солнечная связь. Скачать бесплатно и без регистрации
Реферат: England in the Middle Ages
Характеристика Прохождения Практики В Доу
Дипломная работа по теме Оптимизация систем автоматического регулирования с дифференцированием сигнала
Реферат: Вольтер о свободе и равенстве. Скачать бесплатно и без регистрации
Реферат: Soldiers Home Essay Research Paper He knew
Комедия А. Грибоедова "Горе от ума" в русской критике
Курсовая работа по теме Стратегия и планирование рекламной деятельности
Реферат: Материальный баланс холодильника-конденсатора. Скачать бесплатно и без регистрации
Реферат: Наделение полномочиями - теория и практика
Дипломная работа по теме Лингвокультурологический анализ устойчивых сравнений русского языка
Реферат по теме Бактерии в организме человека
Игнатий Брянчанинов Собрание Сочинений
Курсовая работа по теме Общая характеристика психологии как науки: предмет, объект и методы
Книга На Тему Political Economy And Republican Virtue: The Principle Of Federal Authority
Дипломная работа по теме Древний Египет эпохи Нового царства
Отчет по практике по теме Анализ деятельности предприятия ЗАО 'Самарский завод 'Электрощит-Стройиндустрия'
Дипломная работа: Против религии и атеизма (в связи с философией Фейербаха)
Реферат: Патентное право
Реферат: Советское брачное право

Report Page