Назад в библиотеку

Использование библиотеки GLScene для создания 3D-приложений

Автор: Ю. А. Трофимов
Источник: Известия Пензенского государственного педагогического университета им. В.Г. Белинского. 2008. № 12. С. 121-124.

Аннотация

В данной статье рассматриваются вопросы, связанные с возможностью реализации 3D-графики при создании различных приложений с помощью среды программирования Borland Delphi. Даются начальные сведения по графическим стандартам, 3D-движкам, подробно рассматривается установка библиотеки GLScene, приводятся примеры простейших программ.

Введение

В настоящее время компьютерная индустрия в области разработки программного обеспечения, особенно игровая индустрия, все чаще и в большем количестве создает приложения, нацеленные на работу с трехмерными объектами. Сегодня двухмерной графикой (или 2D-графикой), особенно в компьютерных играх, уже никого не удивишь. Можно сказать, что 2D-графика – это уже прошлый век, хотя многие поспорят с таким высказыванием и приведут немало примеров отличных и популярных до сих пор двухмерных игр.

Нисколько не умоляя достижения плоскостной графики, заметим, что новые технологии постепенно завоевывают свои позиции. От прогресса не убежать и не скрыться, поэтому всем, кто интересуется программированием, особенно разработкой и созданием игровых приложений, просто необходимо не отставать от современных разработок в данной области. И хотя бы иметь начальные представления о возможностях 3D-графики при создании своих собственных приложений.

Графические стандарты

Как известно, в настоящее время существует два основных стандарта для работы с графической информацией – DirectX и OpenGL. И оба поддерживаются современными средами программирования: Delphi, Visual Basic, C++, C++ Builder и др. Поэтому возникает вопрос, какой из стандартов выбрать для дальнейшей работы. Для этого проведем небольшое сравнение и попытаемся склонить чашу весов в пользу одного из них.

И DirectX и OpenGL представляют собой библиотеки, основу которых составляют несколько файлов, содержащих как низкоуровневые функции (например, вывод пикселя на экран), так и более сложные модули (например, рисование линий). По своей сути эти библиотеки различаются механизмом обработки графической информации. Так, OpenGL – это процедурная система, а DirectX основана на COM-модели (Component Object Model), т.е. для работы с изображением нужно не просто вызвать определенную функцию или процедуру, а провести еще ряд дополнительных манипуляций для получения доступа к объектам. А после этого каждому объекту нужно заполнить некий набор необходимых свойств, без которых он является неопределенным.

Следующее отличие связано с внедрением новых технологий. Так, у OpenGL существует механизм расширений, когда нужную процедуру можно в любой момент добавить к библиотеке в дополнение к основным. В DirectX для поддержки новых функций требуется ждать выхода следующих версий библиотеки, хотя разработчики стараются максимально предусмотреть весь необходимый набор.

Но, наверное, самое главное отличие заключается в том, что OpenGL разрабатывалась группой компаний, поэтому она является мультиплатформенной и поддерживается такими операционными системами (ОС), как Windows, Macintosh, Linux и др., а также большинством языков программирования. А вот DirectX является результатом работы только одной компании – Microsoft, поэтому поддерживается только ОС семейства Windows.

И последнее. С точки зрения программирования, разработать программу с использованием OpenGL гораздо легче и проще, чем писать ее под DirectX (исходный код программы получается в несколько раз короче). Хотя для многих программистов этот факт не является весомым аргументом в пользу OpenGL.

Библиотека GLScene

Ну что же, дальнейший выбор остается за Вами, а мы свой выбор уже сделали. Поэтому далее рассмотрим возможности OpenGL при работе с трехмерной графикой в среде программирования Borland Delphi 7. А поможет нам в этом пакет под названием GLScene. GLScene представляет собой открытую для использования библиотеку по работе с OpenGL в Delphi. Фактически GLScene – это готовый 3D-движок, написанный на Delphi . Его основные преимущества перед другими аналогами заключаются в том, что:

1. GLScene – полностью бесплатный полноценный трехмерный движок;

2. GLScene постоянно совершенствуется, эволюционирует и впитывает в себя все новинки технического прогресса в данной области.

Поэтому GLScene можно бесплатно скачать с любого сайта (например, с официального сайта разработчиков по следующей ссылке – http://glscene.sourceforge.net/download.htm) и смело использовать, не беспокоясь за нарушение авторских прав.

Кроме того, в комплекте с GLScene поставляются его полные исходники и примеры. Это дает возможность любому, во-первых, изменять и подстраивать движок под себя, а во-вторых, начинающие программисты могут почерпнуть много нового из написанного профессионалами.

При использовании GLScene, в принципе, не нужно знать OpenGL так как движок всё сделает за вас. Он поддерживает целый ряд предустановленных примитивов. Это значит, что, набрав простую коман- ду, вы можете очень быстро создать куб, сферу, линию, тетраэдр и другие геометрические объекты. Любые объекты можно комбинировать и получать на их ос- нове новые. Еще одна возможность создания новых объектов заключается в применении вращения вокруг оси стандартных примитивов. Кроме того, есть воз- можность подгружать файлы форматов 3ds (создаются программой 3DS MAX). Также GLScene поддерживает скелетную анимацию и интерполяцию кадров, спрай- товую систему замены объектов, трехмерный звук.

Установка GLScene

Итак, теперь у нас есть готовый 3D-движок GLScene. Но прежде чем насладиться первыми 3D-сценами, созданными своими руками, предстоит непростая и не всегда удачная с первой попытки процедура установки GLScene и внедрения ее компонент в Delphi. Сама библиотека представляет собой файловый архив (обычно Zip) размером около 10 Mb, содержащий несколько папок.

Из всех папок нужно обратить внимание на две – DelphiX, где X – номер версии Delphi (например, Delphi7) и Source. В папке DelphiX хранятся несколько файлов с расширением .dpk, которые и нужно запускать для установки библиотеки. Основной из них – GLSceneX.dpk. Папка Source содержит файлы, необходимые для установки основных компонентов, а также для дальнейшей корректной работы всей библиотеки.

Для установки GLScene распаковываем архив GLScene.zip на жесткий диск компьютера. Дальнейшие рассуждения приведем для интегрирования библиотеки в среду Delphi7 (другие версии Delphi – аналогично).

1. В распакованном виде заходим в папку Delphi7 библиотеки и последовательно запускаем 9 файлов с расширением .dpk (это файлы: dclusr.dpk, GLCg7.dpk, GLSDWS7.dpk, GLSDE7.dpk, GLS_Python7.dpk, GLSSDL7.dpk, GLScene7.dpk, GLSS_Bass7.dpk и GLSSFMD7.dpk). Рассмотрим более подробно установку компонента GLScene7.dpk. После запуска соответствующего файла у нас открывается сама система Delphi7 и в ней появляется активное окно с заголовком Package – GLScene7.dpk. В этом окне в верхней строке есть активная кнопка Install. Нажимаем на нее и запускаем установку. Если все прошло успешно, то по завершении появляется окно с сообщением о том, какие пакеты установлены. Нажимаем Ok, закрываем Delphi7 и на вопрос о сохранении изменений в проекте отвечаем утвердительно. Все, компонент успешно установлен. Если в процессе установки возникают ошибки, то Delphi7 показывает в окне кода, какие файлы она не смогла найти. В этом случае нужно найти их среди файлов папки Source, скопировать в папку Delphi7 (с файлами .dpk) и повторить установку.

2. После установки всех компонентов копируем папки Delphi7 и Source библиотеки в папку с установленной системой Delphi (по умолчанию это C:\Program Files\Borland\Delphi7\Lib).

3. Скопировать все содержимое всех папок каталога Source также в папку Lib.

4. В папке Lib находим файлы с расширением .dll (bass.dll, fmod.dll, ode.dll, sdl.dll) и копируем их в каталог C:\Windows\System32. Это необходимо сделать для успешной компиляции проектов.

Теперь GLScene полностью установлена и готова к работе.

Создание первого проекта

Попробуем создать наш первый проект с исполь- зованием новой библиотеки. Запускаем Delphi7 и в разделе закладок ищем и переходим на GLScene. Добавляем на форму два первых компонента – GLScene и GLSceneViewer. GLScene – это инспектор объектов нашей сцены. С его помощью можно добавлять новые объекты и изменять существующие. А GLSceneViewer – это окно, в котором и будет отображаться 3D-сцена. Его размеры можно изменять. Теперь добавим в окно первый объект. Для этого делаем двойной щелчок на значке GLScene1 на форме, либо на надписи GLScene1 в окне ObjectTreeView. При этом появляется окно с заголовком GLScene Editor: GLScene1. Добавим простой объект Cube (куб) следующим образом: Scene Objects – Add objects – Basic geometry – Cube. В результате в окне Object TreeView появится новый объект – GLCube1. Но сам куб на форме пока не виден. Это связано с тем, что мы не добавили еще 2 объекта – камеру и источник света. Добавим их: Scene Objects – Add objects – LightSousce и Cameras – Add camera. Но куба по-прежнему не видно. Просто теперь добавленные объекты нужно настроить. В окне Object TreeView выбираем GLCamera1. Далее в oкне ObjectInspector на закладке Properties находим свойство TargetObject и выбираем GLCube1. Теперь камера привязана к кубу. В свойстве Position устанавливаем значения, отлич- ные от нуля, например, 1, 1, 1. Теперь в свойстве Camera объекта GLSceneViewer1 выбираем Camera1. Только сейчас куб стал виден на форме, но он весь черного цвета. Чтобы он смотрелся более красиво, нужно у источника света (GLLightSousce1) установить в свойстве Position значения для X, Y, и Z равные 1.

Первый проект готов. Нажимаем F9 для запуска и любуемся кубиком на форме. И, заметьте, никакого программного кода.

Следующий шаг – добавить немного анимации нашему объекту. Например, заставить куб вращаться вправо-влево и вверх-вниз с помощью мыши (точнее, мы будем вращать камеру вокруг куба). Для этого добавим в окно Unit1 следующие 2 процедуры.

procedure TForm1.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
mx:=x; my:=y;
end;

procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if Shift<>[] then
begin
GLCamera1.MoveAroundTarget(my-y, mx-x);
GLLightSource1.Position:=GLCamera1.Position;
mx:=x; my:=y;
end;
end;

В разделе Public oбъявляем 2 переменные mx, my типа Integer и заголовки добавленных процедур описываем в классе TForm1 следующим образом:

procedure GLSceneViewer1MouseDown(Sender : TObject; Button: TMouseButton; Shift: TShiftState ; X, Y: Integer );

procedure GLSceneViewer1MouseMove(Sender : TObject; Shift: TShiftState; X, Y: Integer );

Запускаем проект и теперь, нажав и удерживая левую кнопку мыши, можно вращать камеру.

Для того, чтобы куб вращался самостоятельно, добавим на форму объект GLCade nserс той же закладки GLScene. В свойстве Scene у нового объекта выберем GLScene1 и добавим немного программного кода.

procedure TForm1.GLCadencer1Progress (Sender : TObject ; const deltaTime, newTime: Double);
begin
Cube1.Turn(deltaTime * 10);
end;

Константа deltaTime является встроенной и позволяет проекту работать одинаково на компьютерах разной мощности. Коэффициент 10 влияет на скорость вращения, а знак плюс или минус перед ним – на направление. И не забываем заголовок добавленной процедуры описать в классе TForm1:

procedure GLCadencer1Progress (Sender : TObject ; const deltaTime, newTime: Double);

Рисунок 1 - Модель солнечной системы

Рисунок 1 - Модель солнечной системы.

Модель Солнечной системы

Используя библиотеку GLScene был разработан проект "3D-SunSystem", представляющий собой трехмерную модель Солнечной системы.

Основными объектами данной модели являются планеты, представляющие собой сферы, размещенные по соответствующим координатам. Источник света привязан к центру "Солнца". Вращение объектов по орбитам обеспечивается за счет использования процедуры procedure TForm1.GLCadencer1Progress (Sender : TObject ; const deltaTime, newTime: Double);. В ней набирается команда X.MoveObjectAround (Y,0,deltatime*const);, где Y – название объекта, вокруг которого происходит вращение, а X – название объекта, который движется по орбите. Константа const отвечает за скорость вращения. Вокруг оси объекты вращаются с помощью уже знакомой нам команды X.Turn(deltaTime*const ), где X – имя объекта.

В программе есть возможность изменять положение камеры. Ее можно поднимать-опускать и приближать-удалять. Поэтому можно посмотреть движение планет в разных плоскостях. Чтобы не загромождать вид, не нужные в данный момент времени объекты скрываются. Добавлены опции по изменению скорости движения всей системы и включения-отключения координатных осей некоторых объектов.

Дальнейшее совершенствование модели предполагает улучшение прорисовки объектов и более гибкое перемещение камеры (возможно создание нескольких камер и переключение между ними).