« Поставить закладку » « Сделать стартовой »

« Форумы » « Блоги » « Статьи » « Новости » « Файлы » « Realcoding IRC » « Site map » « Поиск »


Главная Главная
Анонсы Анонсы
Форумы Форумы
Каталог Каталог
Поиск Поиск
Опросы Опросы
Книжный магазин Книжный магазин
Реклама на сайте
Публикации Публикации
Партнеры Партнеры
Карта Карта сайта
Рассылки Рассылки
RSS экспорт
Настройки Настройки
О нас пишут О нас пишут
Контакты Контакты
Гостевая книга Гостевая книга

Тестирование 64-битных приложений

ПнВтСрЧтПтСбВс
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          
    Популярное
Редактирование созданной Web-страницы

Создание хранителя экрана на C++

Формирование файла проекта справочной системы

Продвинутый DHTML/Javascript календарь

Комплексные числа в .NET

Защита баз mdb

Функция AccessResource

Введение в Perl

Новое в CSS 3: анимация, трансформация, переменные

Описание функций C (Си) / C++ - free




    Архив файлов



    Сообщества



    Документация

Статьи:: Delphi :: OpenGL :: Использование библиотеки OpenGL


отправить ссылку другу версия для печати  Обсудить на форуме

Использование библиотеки OpenGL





Автор: delphiman@hotmail.com
 

Примеры 3d_1.rar

Содержание

Введение
Использование библиотеки OpenGL - Введение
Использование библиотеки OpenGL - Текстуры
Использование библиотеки OpenGL - Освещение
Использование библиотеки OpenGL - Туман
Список ссылок

Введение

Эта достаточно большая статья посвящена обзору библиотеки расширения OpenGL написанная Ricardo Sarmiento. Все примеры приведенные ниже написаны с использованием этой библиотеки - точнее я нашел примеры и написал статью. Cтатья скорее обзор возможностей технологии OpenGL, чем руководство к программированию. Хотя некоторые функции и процедуры Вы можете использовать и для своих приложений - например чтение файлов DXF.

Хочу разъяснить ситуацию со всевозможными версиями библиотек и заголовочных файлов OpenGL.

Начиная с Delphi 3 в каталоге Source можно найти файл OpenGL.pas - это и есть оригинальная версия заголовков библиотеки OpenGL. Она получена трансляцией файлов Gl.h и Glu.h, соответственно с языка C.

Существует еще одно практически стандартное расширение - Glut. В оригинале Glut.h и ее трансляция на Delphi Glut.pas. Это расширение создано для более быстрого построения различных объектов OpenGL и набор полезных процедур.

Все остальные версии библиотек и заголовков OpenGL являются расширениями стандартной версии и пишутся сторонними производителями. Как и та, о которой пойдет речь ниже.

Призываю использовать стандартную библиотеку OpenGL. Во первых вы получите наибольшую быстроту исполнения кода, и совместимость. Но в статье я использую обзор библиотеки расширения OpenGL, почему? Дело в том, что новичку порой сложно разобраться в дебрях программирования, а расширение стандартной библиотеки позволяет быстро написать код и получить зрелищный результат. Именно результат может подтолкнуть вас на дальнейшее изучение библиотеки OpenGL.
 

Итак начнем. Приведу иерархию объектов, использованных в данной библиотеке:

Использование библиотеки OpenGL - Введение
Пример 1

В этом примере рассмотрены следующие вопросы :

Создание сцены TSceneGL

 

...
Scene:TSceneGL;
...
Scene:=TSceneGL.create; // Создаем новую сцену ....
 

Создание объекта TEntity - куб, задание его с помощью TFace, установка цвета и добавление на сцену.

....
cube:Tentity; Face:TFace; ....
Cube:=TEntity.create; // Создаем пустой объект TEntity
Cube.SetColor(90,200,150); // Инициируем цвета R,G,B
Face:=cube.addFace;
// Создаем 1-й face в исходном кубе всего 6 граней ( в кубе )
Face.AddVertex(1.0, 1.0, 1.0,0.0, 0.0, 1.0); // добавляем 1-й vertex
Face.AddVertex(-1.0, 1.0, 1.0,0.0, 0.0, 1.0); // добавляем 2-й vertex
Face.AddVertex(-1.0, -1.0, 1.0,0.0, 0.0, 1.0);// добавляем 3-й vertex
Face.AddVertex(1.0, -1.0, 1.0,0.0, 0.0, 1.0);// добавляем 4-й vertex
....
Scene.Entities.add(cube);// добавим куб на сцену

Задание источника света Tlight и добавление на сцену.

light:=Tlight.create(1); // создадим источник света и добавим его на сцену
Scene.lights.add(light);

Инициализация сцены

// передадим Handle Panel1 нашей сцене, на ней будет происходить рендеринг
Scene.InitRC(panel1.handle);
Scene.UpdateArea(panel1.width,panel1.height);

Простейший поворот объекта

procedure TForm1.Timer1Timer(Sender: TObject);
begin
// изменяем rx, ry,rz
....
Tentity(Scene.Entities.Items[0]).Rotate(rx,ry,rz); // повернем куб
Scene.Redraw; // ... и обновим сцену
end;

Пример 2

Отличия от предыдущего примера:
Оъекта TEntity - дельфин задается не через TFace, а грузится из DXF файла - что очень упрощает жизнь.

...
Dolphin:=TEntity.create;
Dolphin.SetColor(100,100,160);
Dolphin.LoadDXF('..Dolphin.dxf',true);
with dolphin do
begin
  move(0,0,-15); // переместим немного назад
  rotate(-30,-30,-30); // и повернем
end;
Scene.entities.add(dolphin); // добавим дельфина на сцену
...

Пример 3

Изменения:
У объекта Dolphin ищутся нормали к TFace, при этом получается эффект объемного пространства:

....
Dolphin.CalcNormals; // высчитываем нормали векторов объекта
Dolphin.Center;
....

Пример 4

Добавили класс T3DMouse - теперь можно манипулировать объектами.

procedure TForm1.FormCreate(Sender: TObject);
....
Mouse:=T3DMouse.create(dolphin); // Создаем T3DMouse для нашего объекта
Mouse.scale(1,1,0.1,1,1,1); // задаем скорость перемещения и поворота
....
 

Перемещение объекта можно осуществить:

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Mouse.move(x,y,shift); // обновляем объект - дельфин в новых координатах
Scene.Redraw; // перерисуем сцену
end;

Можно установить блокировку на перемещение :

...
Mouse.Block(4,TspeedButton(sender).down); // блокировка поворота rx
...

Пример 5

Добавим управление отображением :

....
case dolphin.wireframe of
  0:begin
      speedbutton5.caption:='Линии';
      dolphin.wireframe:=1;
    end;
  1:begin
      speedbutton5.caption:='Заливка';
      dolphin.wireframe:=2;
    end;
  2:begin
      speedbutton5.caption:='Точки';
      dolphin.wireframe:=0;
    end;
end;
Scene.Redraw; // обновим сцену
...

Пример 6

Соберем все в один пример, добавим возможность печати и покажем FPS при повороте.

Ну вот, самая основа должна стать Вам понятна. Если у Вас не запускаются примеры, проверьте наличие библиотек Opengl32.dll и Glu32.dll. Исходники примеров находятся в каталогах Demo1-XXX.

Использование библиотеки OpenGL - Текстуры

Эта глава посвящена текстурированию объектов в OpenGL. В каждом примере я даю пояснения только к новому. По этому лучше посмотреть сначала пример 1 потом 2, а не начинать с примера 5. В этой главе описаны примеры использующие фильтрации текстур, и при использовании GL_linear нужен 3D ускоритель, иначе будет работать ОЧЕНЬ медленно.

Пример 1

Закрашиваем полигоны

....
point:TVertex;
....
begin
  // Получаем выбранный полигон при нажатии на панель Panel1
  mouse.FindVertex(x,panel1.height-y,Scene,point);
  for i:=1 to numFound do // Для всех полигонов найденных по Mouse.FindVertex
  begin
    poly:=VertexHits[i] shr 16;
    vert:=VertexHits[i] mod 65536;
    If (poly "<" Dolphin.Faces.count) and
       (vert"<"Tface(Dolphin.Faces.Items[poly]).Vertices.count) then
    begin
      // получаем составляющие цвета из ColorActual (TColor)
      ir:=(ColorActual) mod 256; // R
      ig:=(ColorActual shr 8) mod 256; // G
      ib:=(ColorActual shr 16) mod 256; // B
      Tvertex(Tface(Dolphin.Faces.Items[poly].
      Vertices.items[vert]).point.setcolor(ir,ig,ib);
    end;
  end;
end;

Пример 2

Формат DXF является очень неудобным для записи т.к. имеет большие размеры. Для этого автор создает другой формат записи. Добавлена функция чтения-записи.

 

 

Пример 3

Наложение текстур на объект

thing.CreateTexture; // добавим текстуры на объект
thing.texture.LoadTexture('texture.bmp');
thing.texture.automatic:=False;
...
// а далее идет рутинный процесс задания вершин для текстур у каждой поверхности объекта
with thing do
begin
  vertex:=Tvertex(Tface(thing.faces.items[1]).vertices.items[0]);// x,y,z =0,0,0
  vertex.tx:=1;
  vertex.tz:=0;
...
end;

Да в качестве эксперимента вы можете убрать все начиная с with thing do ..... end (задания точек для текстур ) и переписать thing.texture.automatic:=true.

Использование типов фильтрации текстур

thing.Texture.MagFilter:=GL_linear;
или
thing.Texture.MagFilter:=GL_nearest;

Пример 4

Установка прозрачности у текстур (альфа каналов)

thing.texture.EnvironmentMode:=GL_decal; // Установка transparent texturing
thing.texture.envblendcolor[3]:=scrollbar1.position; // Значение 0 - 255

При запуске программы сначала создается сцена с освещением, но объект создается только после установки, по выполнению процедуры FormCreate_partII.

Пример 5

Программная текстура :) Процесс прост - при нажатии на кнопки с цифрами мы создаем TBitmap и через его Canvas пишем эти цифры. Далее сохраняем этот ТBitmap в файл 'texture.bmp'. Удаляем с экрана компа старую текстуру и загружаем новую из ранее созданного 'texture.bmp'.

 

 

Исходные тексты всех примеров находятся в каталогах Demo2-XXX

Использование библиотеки OpenGL - Освещение
Пример 1

В этом примеры показано как задать параметры источника. Ранее источник света задавался по умолчанию. Создадим источник типа прожектор

 

(CLspot). Light:=Tlight.create(1);
Light.LightType:=CLspot;
Light.CutOffAngle:=5;
Light.SpotExponent:=100;

Параметр CutOffAngle - угол расхождения луча.
SpotExponent - параметр затухания источника.

Грубо говоря это коэфициент показывающий как далеко пройдет свет. Если SpotExponent=0, то пучек света уходит в бесконечность. Идем далее :

Light.SetOrientation(0,-1,0);
Light.Source.SetPosition(0,5,-20);

Задаем ориентацию прожектора и его положение в системе координат.
При изменении позиций полос прокрутки просто меняем компоненты цвета в источнике. Например для Ambient :

SBlightRed.position:=round(Light.Fambient[0] * 100);
SBlightGreen.position:=round(Light.Fambient[1] * 100);
SBlightBlue.position:=round(Light.Fambient[2] * 100);

 

 

Пример 2

Наиболее полно контролируем параметры освещения и даже перемещем источник в пространстве.

 

Все, исходные тексты всех примеров этой главы вы найдете в каталогах Demo3-XXX

Использование библиотеки OpenGL - Туман
Пример 1

Установить поддержку тумана в сцене очень просто :

scene:TSceneGL;
...
scene.fogEnabled:=True;

Все остальное в примере это установка параметров тумана :

Тип тумана может быть :

fogType:=Gl_Linear;
fogType:=GL_exp;
fogType:=GL_exp2;

Минимальная и максимальная дистанция :

fogMaxDist
fogMinDist

 

Интенсивность :

fogDensity

 

Цвет для каждой компоненты RGB :

scene.fogcolor[0]; R
scene.fogcolor[1]; G
scene.fogcolor[2]; B

После каждого изменения параметров не забывайте вызывать Redraw. Для нормального эффекта тумана очень важно подобрать правильный цвет фона и самого тумана. Они должны примерно совпадать /см картинку /.

 

Примеры находятся в каталоге Demo4-XXX.


Рубрика: OpenGL




Инструменты Internet Explorer 8 Beta 2 для разработчиков.

Вебмастеру

В марте этого года мы уже писали об инструментах для разработчика в IE8 Beta 1, но IE8 Beta2 позволяет более полно использовать инструменты за счет значительных изменений в имеющихся функциях, а также новых возможностей. В принципе инструменты для разработчика должны обладать следующими свойствами: Быть интегрированными и простыми в использовании; Иметь визуальный интерфейсC их помощью можно быстро протестировать сайт.


Подробнее... | Рубрика: Вебмастеру | Добавлено: 05.09.2008

Google Developer Day 2008 в Москве.

Мероприятия

Дата проведения: 28 октября 2008 г.; Место проведения: Амбер Плаза, Москва, Россия. Конференция для веб-разработчиков и разработчиков мобильных приложений в Москве. Узнайте, как наилучшим образом использовать инструменты разработки и API от Google, чтобы создавать социальные, мобильные и картографические приложения, как использовать AJAX/JavaScript инструменты и библиотеки от Google и многое другое из первых уст.


Подробнее... | Рубрика: Мероприятия | Добавлено: 05.09.2008

ТОП 10 самых раздражающих факторов для программиста.

Разное

Совсем недавно наткнулся в интернете на забавный "хит-парад" наиболее раздражающих вещей для программиста. Поскольку он был на английском — решил перевести текст и несколько адаптировать к нашим реалиям…


Подробнее... | Рубрика: Разное | Добавлено: 03.09.2008

Остальные статьи:

Windows Server 7, 8 и 9
jQuery для JavaScript-программистов
Инновационный веб-броузер Google Chrome стартует уже сегодня
Windows 7: подход к производительности системы
Trac + Subversion @ Ubuntu: Revisited
[g]Vim в режиме Python: Рекомпиляция в Windows
Java + JSON. Пути к дружбе
Драйвер SQL Server 2005 для PHP
Типы данных в MySQL (сжатый справочник для PHP программиста)
PHP класс для работы с Яндекс.XML
Ошибки начинающих PHP разработчиков
Наследование шаблонов в Smarty
Особенности хранения сессий PHP в memcached
Internet Explorer 8 beta 2
9 правил для начинающего Ajax-разработчика
ExtJS 2.2 - полная поддержка Firefox 3, новые виджеты и другие нововведения


Цитата дня (все,добавить):



    Рубрикатор

Программирование

C/С++
Обучение
Windows API
XAML
Моделирование
Паттерны
Visual Basic 7 .NET
WxWidgets
Функции WinApi
Функции С++
Разработка под Mac OS
Eiffel
Visual Studio 2008
UI дизайн
Алгоритмы
Конкурсные статьи
Turbo Pascal
Visual Studio
CASE-средства
Visual Studio 2005
Без VCL
Delphi
Тех. документация
Тестирование
Software Testing
ООП
TCP/IP
Google Android
Windows Installer
.NET Framework
Драйвера
C# C Sharp
Справка
Проектирование
Информ. системы
Visual Basic
Assembler
Оптимизация кода
Gtk+
Компоненты
Реинжиниринг
Управление проектами
Extreeme programming
Lotus Notes
Алгебраическое проектирование

Интернет технологии

PHP
Perl
ASP
WAP
Cookies
SSI
CGI
Web Servers
VB Script
DNS
CSS
XML
Html
Java Script
Java2ME
Firewall
Flash
.htaccess
Apache
VRML
Протоколы
Поисковые системы
Технология JAVA
Учебник по PHP
Учебник по JavaScript
Учебник по XML
Java Q&A
AJAX
DHTML
XHTML
Dreamweaver
Web 2.0
Python
Вебмастеру
Cisco
Ruby on Rails
Silverlight

Базы данных

Access
InterBase
MySQL
Oracle
ADO .NET
Основы SQL
Учебник по Access 2002
MS
Microsoft FoxPro
Доступ к данным
XML в MS SQL Server 2000
ODBC и MyODBC
Обучение
Caché
DB2
PostgresSQL
Sybase
Теория
Хранилища данных
Безопасность
Реляционные данные
MySQL и mSQL

Остальное:

Разное
Обзоры книг
Безопасность
Графика и дизайн
Юмор
Linux
Фракталы
Microsoft Axapta
Многоядерность
Сети
Microsoft Office
Работа
MS-DOS
Криптография
Графика и игроделание
Новости SDK
Системы защиты
Учебник по AutoCad
CVS
Windows XP
Windows Server 2003
Windows Vista
Windows 7
Мероприятия

    Кто на сайте
Вы не зарегистрированы.
Имя:

Пароль:

Запомнить

Регистрация позволит Вам пользоваться дополнительными сервисами.
Сейчас на сайте:
Гостей: 90
Пользователей: 0