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

УДК 681.142.37

использование библиотеки GLscENE для создания 3D-ПPИЛOЖEHИЙ

Ю. А. ТРОФИМОВ

Пензенский государственный педагогический университет имени В. Г. Белинского кафедра информатики и методики преподавания информатики

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

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

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

ГРАФИЧЕСКИЕ СТАНДАРТЫ Как известно, в настоящее время существует два основных стандарта для работы с графической информацией - DirectX и OpenGL. И оба поддерживаются современными средами программирования: Delphi, Visual Basic, С++, С++ Builder и др. Поэтому возникает вопрос, какой из стандартов выбрать для дальнейшей работы. Для этого проведем небольшое сравнение и попытаемся склонить чашу весов в пользу одного из них.

И DirectX, и OpenGL представляют собой библиотеки, основу которых составляют несколько файлов, содержащих как низкоуровневые функции (например, вывод пикселя на экран), так и более сложные модули (например, рисование линий). По своей сути эти библиотеки различаются механизмом обработки графической информации. Так, OpenGL - это процедурная система, а DirectX основана на СОМ-модели (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, GLS_DWS7.dpk, GLS_ODE7.dpk, GLS_Python7.dpk, GLS_SDL7.dpk, GLScene7.dpk, GLSS_Bass7.dpk и GLSS_FMOD7.dpk). Рассмотрим более подробно установку компонента GLScene7.dpk. После запуска соответствующего файла у нас открывается сама система Delphi7 и в ней появляется активное окно с заголовком Package - GLScene7.dpk. В этом окне в верхней строке есть активная кнопка Install. Нажимаем на нее и запускаем установку. Если все прошло успешно, то по завершении появляется окно с сообщением о том, какие пакеты установлены. Нажимаем Ok, закрываем Delphi7 и на вопрос о сохранении изменений в проекте отвечаем утвердительно. Все, компонент успешно установлен. Если в процессе установки возникают ошибки, то Delphi7 показывает в окне кода, какие файлы она не смогла найти. В этом случае нужно найти их среди файлов папки Source, скопировать в папку Delphi7 (с файлами .dpk) и повторить установку.

2. После установки всех компонентов копируем папки Delphi7 и Source библиотеки в папку с

установленной системой Delphi (по умолчанию это С:\ Program Files\ Borland\ Delphi7\ Lib).

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

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

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

СОЗДАНИЕ ПЕРВОГО ПРОЕКТА

Попробуем создать наш первый проект с использованием новой библиотеки. Запускаем Delphi7 и в разделе закладок ищем и переходим на GLScene. Добавляем на форму два первых компонента - GLScene и GLSceneViewer. GLScene - это инспектор объектов нашей сцены. С его помощью можно добавлять новые объекты и изменять существующие. А GLSceneViewer -это окно, в котором и будет отображаться 3D-сцена. Его размеры можно изменять. Теперь добавим в окно первый объект. Для этого делаем двойной щелчок на значке GLScenel на форме, либо на надписи GLScenel в окне Object TreeView. При этом появляется окно с заголовком GLScene Editor: GLScenel. Добавим простой объект Cube (куб) следующим образом: Scene Objects -Add objects - Basic geometry - Cube. В результате в окне Object TreeView появится новый объект -GLCubel. Но сам куб на форме пока не виден. Это связано с тем, что мы не добавили еще 2 объекта - камеру и источник света. Добавим их: Scene Objects - Add objects - LightSousce и Cameras - Add camera. Но куба по-прежнему не видно. Просто теперь добавленные объекты нужно настроить. В окне Object TreeView выбираем GLCameral. Далее в окне Object Inspector на закладке Properties находим свойство TargetObject и выбираем GLCubel. Теперь камера привязана к кубу. В свойстве Position устанавливаем значения, отличные от нуля, например, l, l, l. Теперь в свойстве Camera объекта GLSceneViewerl выбираем Cameral. Только сейчас куб стал виден на форме, но он весь черного цвета. Чтобы он смотрелся более красиво, нужно у источника света (GLLightSouscel) установить в свойстве Position значения для X, Y, и Z равные l.

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

Следующий шаг - добавить немного анимации нашему объекту. Например, заставить куб вращаться вправо-влево и вверх-вниз с помощью мыши (точнее, мы будем вращать камеру вокруг куба). Для этого добавим в окно Unitl следующие 2 процедуры. procedure TForml. GLScene Viewer IMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin

mx:=x; my:=y; end;

procedure TForml. GLScene ViewerlMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer);

begin

if Shift<>[] then begin

GLCamera 1.MoveAroundTarget(my-y, mx-x); GLLightSource1.Position:=GLCamera1.Position; mx:=x; my:=y; end; end;

В разделе Public объявляем 2 переменные mx, my типа Integer и заголовки добавленных процедур описываем в классе TForml следующим образом: procedure GLSceneViewer 1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

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

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

Для того, чтобы куб вращался самостоятельно, добавим на форму объект GLCadenser с той же заклад-

ки GLScene. В свойстве Scene у нового объекта выберем GLScene 1 и добавим немного программного кода. procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double); begin

Cube1.Turn (delta Time* 10); end;

Константа deltaTime является встроенной и позволяет проекту работать одинаково на компьютерах разной мощности. Коэффициент 10 влияет на скорость вращения, а знак плюс или минус перед ним - на направление. И не забываем заголовок добавленной процедуры описать в классе TForml: procedure GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double);

МОДЕЛЬ СОЛНЕЧНОЙ СИСТЕМЫ используя библиотеку GLScene был разработан проект «3D-SunSystem», представляющий собой трехмерную модель Солнечной системы.

Основными объектами данной модели являются планеты, представляющие собой сферы, размещенные по соответствующим координатам. Источник светапри-вязан к центру «Солнца». Вращение объектов по орбитам обеспечивается за счет использования процедуры procedure TForm1.GLCadencer1Progress(Sender: TObject;

const deltaTime, newTime: Double);. В ней набирается команда X.MoveObjectAround(Y,0,deltatime*const);, где Y - название объекта, вокруг которого происходит вращение, а X - название объекта, который движется по орбите. Константа const отвечает за скорость вращения. Вокруг оси объекты вращаются с помощью уже

знакомой нам команды ХТшп(&каТте*соп5£), где X-имя объекта.

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

объекты скрываются. Добавлены опции по изменению скорости движения всей системы и включения-отключения координатных осей некоторых объектов.

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