Программа – трехмерный игровой движок на базе библиотек DirectX и PhysX

Разработка игрового "движка" с использованием языка C++ для написания кода, графического пакета DirectX9 для вывода графики. Использование физического "движка" PhysX для взаимодействия объектов. Технико-математическое описание задачи, листинг программы.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 02.09.2013
Размер файла 4,5 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

ДИПЛОМНЫЙ ПРОЕКТ

Тема: «Программа - трехмерный игровой движок на базе библиотек DirectX и PhysX»

1. Введение

трехмерный игровой движок

В современном мире практически каждый человек, независимо от возраста, время от времени пользуется компьютером и современными средствами коммуникации и обработки информации. Огромное влияние на развитие вычислительной техники оказали видеоигры. Многие из нас проводят досуг за прохождением квеста или получением уровня в ролевой игре. Так же разработка игр - очень выгодная сфера деятельности, на фоне других областей программного обеспечения. Главная особенность игр в том, что их они никогда не потеряют свою популярность. Каждый день выходят новые игры, новые жанры и, чтобы удовлетворять запросам современных игр, в свою очередь, выходят новые технологические средства и технологии. Таким образом игры приносят прибыль не только своим непосредственным разработчикам, но и косвенно помогают развитию отрасли аппаратных средств.

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

Со временем, помимо того, что графика в играх становилась все более кинематической, развивались и технологии моделирования физического поведения объектов. Вкупе с современными графическими решениями такой тандем представляет собой прекрасное подспорье в разработке игр.

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

Компьютерные игры имеют одну интересную особенность - любой среднестатистический играющий в них человек запросто может определить возраст игры, вплоть до года. Это связано с тем, что процесс разработки игр очень долгий и трудоемкий и включает в себя очень много аспектов. Обычно, на разработку игры уходит около года и за это время технологии и аппаратные решения уходят вперед. Чтобы ускорить процесс разработки игр вся разработка делегируется на группу людей, каждый из которой занимается областью, профессионалом которой он являются. В типичной группе энтузиастов обычно есть программисты, дизайнеры, сценаристы, звукорежиссеры и специалисты разработки 3D-моделей. Главная задача лежит на плечах программистов, которым необходимо разработать «движок» игры. «Движок» - это сердце игры. В зависимости от игры он включает в себя: получение вводимой пользователем информации, искусственный интеллект, просчет столкновений, визуализацию и много узконаправленных вещей, которые зависят напрямую от жанра игры, например, подсчет очков.

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

Главным свойством хорошего движка считается его гибкость. Чем большее количество игр можно написать с использованием данного движка, тем он лучше. Поэтому далеко не каждая игра имеет под собой свой собственный движок. В качестве примера можно привести движок SOURSE, разработанный компанией VALVE в 2005 году и являющийся актуальным до сих пор. Количество игр, написанное на нем, в первые годы существования перевалило за десяток. Каждый движок имеет определенную структуру и ее логичность является так же важным фактором. Простота подключения и освоения были козырем во все времена.

2. Общая часть

В этой части представлено описание начальной стадии разработки проекта, то есть подробное описание средств программирования и постановка задачи.

2.1 Цель разработки

Целью разработки является на готовый игровой продукт, как может показаться на первый взгляд, а базис, используя который можно написать собственную игру без глубоких знаний в области математики и программирования.

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

2.2 Анализ средств программирования

Данный проект реализован на языке программирования С++ с использованием графической библиотеки DirectX и физического движка PhysX. Для написания шейдеров использовался язык программирования шейдеров высокого уровня - HLSL.

Библиотека DirectX представляет удобный контроль над многими аспектами разработки. Так, например, компонент DirectShow представляет уровень абстракции HAL, позволяющий избавиться от программирования графики для всех видеокарт. К сожалению, это крадет скорость работы программы. Архитектура DirectX основывается на технологии COM, которая представляет доступ к виртуальным интерфейсам через DLL-вызовы. Данный подход позволяет подключать DirectX практически к любой среде разработки, поддерживающей обращение к DLL.

Библиотека PhysX представляет тобой решение для просчета физики различных объектов и взаимодействие между ними. Все изменения игрового мира сначала просчитываются PhysX, после чего, по средствам движка, визуализируются через DirectX.

Для освоения DirectX существует много литературы. Для PhysX литературы нет, если не считать встроенные справочники по функциям и примеры.

В качестве среды разработки была выбрала Visual Studio 2012 от Microsoft. Причиной тому послужила простота работы со средой и личная неприязнь к другим средствам разработки. Так же Visual Studio предлагает удобные средства отладки программы, средства предварительной компиляции шейдеров на языке HLSL и удобны менеджер объектов, функций и классов - IntelliSense.

2.2.1 Обзор методов решения

В этом разделе рассматриваются альтернативные средства программирования и похожие программы.

Существует масса языков, с которыми может работать DirectX, благодаря тому, что в его основе лежит технология COM. Тоже самое относится и к PhysX. Связка данных библиотек с С++ является самой популярной, но это не говорит о том, что иные схемы невозможны.

Так, например, в качестве языка разработки можно использовать язык Delphi, а для вывода графики - OpenGL. Физику так же прекрасно можно обрабатывать по средством физического движка Bullet.

В данном случае был выбран именно С++, DirectX и PhysX. Причиной тому служило наибольше количество справочного материала по каждому из них.

В качестве ревизий библиотек были использованы не самые новые, но и не старые версии. Это решение связано с тем, что большинство новых библиотек менее стабильны и имеют меньше справочного материала.

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

2.2.2 Описание языка

Язык С++ является одним из самых популярных среди разработчиков программного обеспечения. Он является чрезвычайно мощным и используется для написания программ практически любого назначения. Язык объектно-ориентированный, позволяет работать с памятью, адресами и портами.

Сама структура языка направлена на то, чтобы дать программисту полную власть над происходящим. В то же время ни одна из возможностей языка, приводящая к расходам ресурсов, не является обязательной. Проще говоря - если нужно, С++ показывает прекрасную скорость и эффективность работы программы.

В качестве среды разработки было принято решение использовать Visual Studio 2012. Данный продукт позволяет создавать программы любой сложности на многих языках и представляет удобные средства отладки. Так же Microsoft предоставляет множество справочного материала по данному вопросу. Для работы программы не требуется мощный компьютер, но для корректной работы DirectX может потребоваться мощная видеокарта с поддержкой DirectX.

2.2.3 Общие сведения

Текст программы на С++ формируется с помощью букв, цифр и специальных символов.

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

В данном случае игровой движок является динамической библиотекой, которую можно подключить к любому проекту. Для этого исходный код скомпилирован в файл DLL.

Язык С++ поддерживает нативные типы данных, наряду с типами, которые может разрабатывать и сам программист. В качестве последних чаще всего выступают классы и структуры.

Основными для С++ являются следующие типы данных:

· Int - целочисленный

· Float - число с плавающей точкой

· Char - символ

· Double - число двойной точности

· Long - длинный int

· Short - короткий int

· Bool - логический

Ниже представлены все ключевые слова в языке С++.

alignas (начиная с C++11)

alignof (начиная с C++11)

and

and_eq

asm

auto(1)

bitand

bitor

bool

break

case

catch

char

char16_t(начиная с C++11)

char32_t(начиная с C++11)

class

compl

const

constexpr(начиная с C++11)

const_cast

continue

decltype(начиная с C++11)

default(1)

delete(1)

do

double

dynamic_cast

else

enum

explicit

export

extern

false

float

for

friend

goto

if

inline

int

long

mutable

namespace

new

noexcept(начиная с C++11)

not

not_eq

nullptr (начиная с C++11)

operator

or

or_eq

private

protected

public

register

reinterpret_cast

return

short

signed

sizeof

static

static_assert(начиная с C++11)

static_cast

struct

switch

template

this

thread_local(начиная с C++11)

throw

true

try

typedef

typeid

typename

union

unsigned

using(1)

virtual

void

volatile

wchar_t

while

xor

xor_eq

2.2.4 Способы структурирования

1 Процедуры и функции

Язык С++ поддерживает парадигму процедурного программирования. Так же он позволяет выносить заголовки функций в отдельное место. Для этого нужно указать тип возвращаемого функцией значения, ее название и типы входящих параметров.

Язык поддерживает перегрузку функций, что позволяет создавать функции с одинаковыми именами и разными параметрами. Это избавляет программиста от ряда ненужных действий.

Так же есть возможность написания процедур - для этого достаточно в качестве возвращаемого параметра указать тип void.

Модули

Язык С++ поддерживает модули. В качестве основного файла используется файл исходного кода с точкой входа в программу и заголовочный файл, содержащий классы, заголовки функций, структуры и т.п.

Файл проекта Visual Studio имеет расширение .vcxproj, а файл решения - .sln. Решение может содержать в себе несколько проектов.

2.2.5 Дополнительные средства языка

Для данной программы не использовались никакие дополнительные средства разработки Visual Studio. В данном случае среда выступает как компилятор написанного кода, а все основные действия происходят за счет функций DirectX и PhysX.

Для того, чтобы C++ мог использовать DirectX и PhysX нужно подключить к проекту файлы заголовков и библиотеки, найти которые можно на сайте Microsoft.com и Nvidia.com. Существует две версии библиотек DirectX и PhysX - для конечного пользователя и для разработчика. Версии для разработчиков (SDK) представляют собой набор библиотек и заголовочных файлов, примеры и справочную информацию, в то время как версия для конечного пользователя представляет собой лишь библиотеки, которые необходимы для запуска приложения на компьютере.

DirectX

Компоненты DirectX 9
Direct3D
Содержит высокоуровневый интерфейс Retained Mode позволяющий легко выводить трехмерные графические объекты, и низкоуровневый интерфейс Immediate Mode, предоставляющий полный контроль над рендерингом. С девятой версии реализована новая технология шейдеров, позволяющая поднять уровень реалистичности изображения в новых играх.
DirectDraw
Предназначен для отображения двумерной графики на экране монитора. Обеспечивает прямой доступ к видеоадаптеру, за счёт чего достигается быстрый вывод графики, по скорости на порядок превышающий GDI.
DirectSound
Создан для прямого доступа к аппаратной части звуковых плат, чтобы избавить воспроизведение звука от "тормозов", которые возникают при работе с Win32 API.
DirectInput
Эта компонента отвечает за любые устройства ввода, например, аналоговые или цифровые джойстики, рули и педали, ручку управления полётом, световой карандаш или Touch-Screen. Некоторые возможности компоненты можно реализовать средствами Win32 API, получив такой же быстрый доступ, но в некоторых областях DirectInput.
DirectPlay
Упрощает жизнь программиста, решившегося добавить в своей программе возможность совместной работы (игры) по сети или по модему (это наверняка хорошо знакомо любому геймеру).
DirectSetup
Предназначен для установки DirectX.
DirectShow
Используется в мультимедиа-технологиях - можно выполнить высококачественное воспроизведение или захват видео и звука.
Архитектура доступа базируется на технологии COM. Значит, для использования DirectX необходима среда программирования, поддерживающая обращение к функциям DLL из готовых программ и поддержка COM.
PhysX
PhysX представляет из себя физический движок, позволяющий в реальном времени эмулировать физические законы. Движок поддерживает такие объекты, как твердые тела, ткани и, в обозримом будущем, жидкости. Так же позволяет «присоединять» тела друг к другу не теряя при этом физических свойств. PhysX прекрасно справляется с деформацией объектов. Ткани, например, можно порвать, а твердые тела согнуть.
Изначально PhysX разрабатывался компанией Ageia и представлял из себя интегральную плату, которая использовалась наряду с видеокартой. В последствии разработка была куплена компанией NVidia и чип обработки физики был интегрирован в современные графические решения компании. В отличии от NVidia, AMD Radeon не поддерживает аппаратного ускорения физики. Так же PhysX поддерживается многими игровыми платформами, такими как PS3 и XBOX.
В данном продукте PhysX используется для обработки только твердых тел. Изначально все объекты сцены не имеют физических свойств, но их можно включить специальной командой.

3. Специальная часть

В этом разделе представлено подробное описание назначения программы и требования к ее возможностям и характеристикам.

3.1 Постановка задачи

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

3.1.1 Назначение задачи

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

Цель задачи - создание удобного, гибкого и универсального «движка» на языке программирования Delphi, который будет использовать DirectX.

Программа должна выполнять следующие основные действия:

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

Загрузка сетки из Х-файла. В трехмерном пространстве существуют всего три вида примитивов - это точка, отрезок и треугольник. Все остальные примитивы можно построить с помощью этих трех составляющих. Основным примитивом в Direct3D, конечно, является треугольник. Почему в качестве основы используется именно треугольник, и нет более сложных фигур? Дело в том, что сами видеоускорители при формировании графики оперируют именно треугольниками, поэтому логичнее будет, если программа будет «разговаривать» с устройством на додном языке и оперировать одними и теми же данными.

Для построения одного треугольника нужно три точки, каждая из которых должна иметь, как минимум 3 параметра - это координаты в трехмерном пространстве (x,y,z) и цвет вершины. Для создания объемной фигуры понадобится создание буфера индексов и буфера вершин. Каждую точку, определяющую вершину треугольника нужно четко расчитать. Из всего этого следует вывод, чтобы построить фигуру сложнее куба, нужно потратить не один час времени. И как, например, нарисовать фигуру человека таким образом, да еще и правильно натянуть на расчитанную сетку текстуру. Для решение проблемы корпорация Microsoft разработала формат Х. В файле с расширением «Х» может храниться информация о сетке, текстуре, скелете и даже анимации. DirectX имеет ряд очень удобных функций для работы с Х-файлами и это очень упрощает программирование графики. Чтобы создать сетку и сохранить ее в файле с расширением «х», нужно, чтобы этот трехмерный редактор поддерживал экспорт в этот формат. Для программы 3D Studio Max, Microsoft выпустил специальное дополнение, с помощью которого созданые в 3D Studio Max объекты можно импортировать в формат «х».

Итак, этот проект должен загружать сетки и, если есть, текстуры из Х-файла. Кроме того Необходима функция для натягивания текстуры из bmp файла, на объект.

Расчеты положения игровых объектов. Игровым объектом является: источник освещения, камера, сетка (загруженная из Х-файла или описаная в ручную). Расчет положения объекта производится с помощью векторов (в случае с источником света) и матриц (с помощью матриц расчитывается положение камеры и всего игрового мира). Что казается сетки, то тут все достаточно просто - есть матрица положения, с помощью которой можно деформировать и перемещать объект. С камерой все несколько сложнее. Камера в игровой программе - это персонаж, который должен перемещаться по игровому пространству по команде игрока (пользователя). Игровой «движок» должен расчитывать положение и направление камеры в игровом пространстве оперируя матрицами.

Диолог с пользователем. Все выше перечисленые действия можно реализовать с помощью одного только модуля Direct3D. Для диолога с пользователем понадобится модуль DirectInput, который будет производить чтение с устройств ввода. Чтобы узнать какое действие произвел пользователь можно было бы воспользоваться WinAPI функциями. Но WinAPI работает через Windows, и это значительно снижает производительность. Компьютерные игры - это та область программирования, где нет лишних ресурсов и программы должны работать максимально быстро. К тому же есть еще один нюанс в работе WinAPI, если зажать и не отпускать одну клавишу (например, при движении игрока прямо на некоторое расстояние) Windows выдаст сообщение о повторном нажатии одной и той же клавиши, что не допустимо в игре. DirectInput работает с устройством в обход Windows и достигает максимальной скорости считывания информации.

Программа «движка» должна инициализировать основные устройства ввода (клавиатура, мышь), считывать из них информацию, и, в соответствии с введенными пользователем данными, производить определенные действия (например, при нажатии клавиши «left» сместить камеру влево).

3.1.2 Требование к программе

Требования к функциональным характеристикам

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

Основные качества, которыми должен обладать этот проект:

Текст программы должен быть понятен. Поскольку одной из целей проекта является облегчение программирования трехмерных компьютерных игр, текст программы должен быть четким и понятным любому программисту, решившему использовать данный продукт в своих разработках. Поэтому в данном случае можно пожертвовать производительностью, ради понятности текста программы. «Движок» должен легко подключаться к программе.

Проект должен обладать большими возможностями для расширения. Эта программа будет использоваться другими программистами в их программах, и должна подходить как можно большему числу проектов.

Универсальность. Проект должен работать практически на любом компьютере, не зависимо от аппаратного обеспечения, и не должен использовать нестандартные устройства или средства устройств. Например, не все видеокарты поддерживают шейдеры, если вывод объектов будет осуществляться с применением языка шейдеров, на некоторых компьютерах работа этого «движка» будет не возможной.

Итак, этот проект должен быть расширяемым, универсальным и простым в понимании. Несмотря на то, что именно эти качества являются основными, нельзя пренебрегать ресурсами компьютера. Нельзя забывать, что слишком медленный «движок» вряд ли кому-нибудь понадобится.

Требования к аппаратным и программным средствам

На компьютере должна быть установлена операционная система Windows и DirectX 9 последней версии.

Для использования программы необходимы заголовочные файлы для DirectX 9 и среда разработки Delphi 7.

Требования к аппаратным средствам

На компьютере должен работать Delphi 7. О требованиях к аппаратным ресурсам компьютера для Delphi 7 уже было сказано в разделе «описание языка».

Проект занимает 10 Mb свободного места на диске. Плюс к этому 4 Mb понадобятся для размещения «заголовочных файлов».

3.2 Описание алгоритма (блок-схема)

В этом разделе представлена краткая блок-схема программы. Подробное описание ее представлено в следующем разделе.

3.2.1 Описание блок-схемы

При запуске приложения происходят следующие действия:

1. Построение окна - задание его свойств и создание с помощью функции WinAPI.

2. Инициализация DirectX - инициализация графики, проектирование окна, создание устройства для работы с Direct3D, запуск конструктора движка.

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

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

3.2.2 Краткая блок-схема файла проекта

Размещено на http://www.allbest.ru/

3.3 Описание программы

В этом разделе подробно представлены функциональные характеристики программы. Как и откуда происходит запуск движка, какие данные получает и выдает движок. Подробное описание функций и переменных всех модулей проекта.

3.3.1 Описание структуры программы

Программа состоит из нескольких файлов: файл проекта, 3 модуля, Х-файлы и файлы текстуры для тестирования программы. Файл проекта называется Game.dpr, это скелет игрового приложения. В нем происходит инициализация, обработка событий, вызов функций «движка». Модули - dxfunc, GraphEngine, DXGObject. Файл проекта и эти модули связаны между собой и используют функции друг друга. Ниже представлена схема взаимодействия модулей.

3.3.2 Организация данных в программе

Движок - это основная часть программы, все данные проходят через него. Но начать стоит с описания главной программы.

В главной программе (проекте) задаются параметры окна, обрабатываются сообщения windows, происходит вызов функций движка и функции инициализации из соответствующего модуля.

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

wc : TWndClassEx; Класс окна.

pWnd : HWND; Окно.

pMsg : TMsg; Сообщения Windows. С помощью этой переменной программа получает и обрабатывает сообщения.

pD3D: IDirect3D9=nil; Переменная для работы с Direct3D. Она предназначена для хранения данных о главном устройстве Direct3D.

pD3DDevice: IDirect3DDevice9=nil; Переменная для работы с Direct3D. Она предназначена для хранения данных о устройстве Direct3D.

ge:CGraphEngine; Переменная движка игры. Эта переменная служит для доступа к функциям класса, созданного в модуле движка игры (GraphEngine).

После создания окна, в главной программе происходит вызов функции инициализации, в которой происходит инициализация и вызов конструктора движка. Функции инициализации DX3DInit из модуля dxfunc передаются переменные для работы с Direct3D, созданное окно и разрешение. Результат работы процедуры инициализации - это число типа Boolean (логический тип) True или false.

DX3DInit(pD3D, pD3DDevice, pWnd, 800, 600, b)

Если процедура инициализации вернула значение False, значит, инициализация не удалась. Далее производится вызов конструктора движка

ge:=CGraphEngine.CGraphEngine(pD3DDevice, pWnd);

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

Инициализация завершена. Далее в главной программе с помощью процедуры ShowWindow производится показ окна. Далее обновляем окно (UpdateWindow(pWnd);). Это необходимо, так как просле инициализации Direct3D происходят изменения параметров окна, и если не обновить окно здесь, то в процессе выполнения программы возникнут проблемы с отображением.

Далее идет запуск бесконечного цикла обработки сообщений.

while (true) do

begin

if (PeekMessage(pmsg, 0, 0, 0, PM_REMOVE)) then

//если есть сообщение, то обрабатываем его

begin

TranslateMessage(pmsg);

DispatchMessage(pmsg);

if (pmsg.message = WM_QUIT) then exit; //если нажата клавиша выхода, то

//завершаем работу программы

end

else

GraphEngine(); //вызываем функцию движка

end;

В цикле производится проверка, есть ли сообщение, если есть, то оно обрабатывается с помощью WinAPI функций. Если сообщений нет, то вызываем функцию движка.

В функции движка происходит отображение сцены. Сначала, с помощью функции BeginScene() интерфейса IDirect3DDevice9, начинаем формирование сцены. Далее, если процедура прошла успешно, идет очистка экрана и формирование сцены с помощью процедуры RenderScene(), которая находится в модуле движка GraphEngine.

if (SUCCEEDED(pD3DDevice.BeginScene())) then //Если процедура BeginScene была выполнена, то вызываем движок

begin

//очистка экрана

pD3DDevice.Clear(0, nil, D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(255,255,255), 1.0, 0);

ge.RenderScene(); //формирование сцены

pD3DDevice.EndScene(); //конец отображения сцены

end;

pD3DDevice.Present(nil, nil, 0, nil); //Функция для отображения сцены, без нее сцена

//не сформируется

end;

В процедуре RenderScene() происходят самые основные действия.

procedure CGraphEngine.RenderScene();

var i:integer;

begin

//если функция KeyControl вернула false, значит дальнейшее выполнение программы

//не имеет смысла (программа не реагирует на устройства ввода)

if KeyControl=false then exit; //выходим из программы если функция KeyControl вернула false

//Отображаем сцену

pDevice.SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);

pDevice.SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);

pDevice.SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

//Очищаем переменную устройства Direct3D

pDevice.Clear(0, nil, D3DCLEAR_STENCIL, D3DCOLOR_XRGB(255,255,255), 1.0, 0);

//Отображаем объекты на экране

for i:=0 to CURRENT_OBJECTS_NUM-1 do

objects[i].Render(0);

end;

Вызов процедуры KeyControl, которая возвращает логический тип. Если эта процедура вернула false, значит чтение с устройтв ввода не удалась, а это значит, что дальнейшее продолжение работы программы не имеет смысла, тогда функция завершает работу программы (Exit). Далее отображение сцены. После отображения необходимо очистить переменную устройства Direct3D. И последнее - отображения объектов на экране с помощью процедуры Render из модуля движка объектов DXGObject.

function CDXGObject.Render(ef_index:DWORD):boolean;

var i: integer;

begin

//присваеваем результату работы функции значение false

Result:= false;

Positioning();

// отображение объекта

for i:=0 to dwNumMaterials-1 do

begin

pDevice.SetMaterial(pMeshMaterials[i]); //устанавливаем материал

if pMeshTextures[i]<>nil then //устанавливаем текстуру, если она есть

pDevice.SetTexture(0, pMeshTextures[i]);

pMesh.DrawSubset(i); //Рисуем сетку

end;

//функция выполнира работу успешно и присваеваем результату значение true

result:=true;

end;

В качестве параметра функция принемает номер объекта (игровых объектов может быть очень много, это локации, персонажи и прочий антураж). Здесь происходит следующее: устанавливаем позицию объекта, в которой он будет отображен на экране с помощью процедуры Positioning();. Далее в цикле (где dwNumMaterials - количество объектов) происходит отображение объекта, то есть установка материала, текстуры и отображение сетки. Если все эти действия выполнены успешно, то результату функции назначается True, который эта функция возвращает движку игры.

Кроме всего выше указанного, в программе есть еще функция обработки событий - WindowProc. В качестве параметров этой функции передается окно программы, переменная, содержащая сообщения и несколько дополнительных параметров. Эта функция запускается в ответ на события.

В теле функции WindowProc первым делом идет конструкция case, параметром которой является переменная сообщений msg; если она равна WM_CREATE, то программа ничего не делает; если msg равна WM_DESTROY, значит программа освобождает захваченные ресурсы. Иначе результату функции присвоить результат работы функции DefWindowProc(wnd,msg,wparam,lparam).

3.3.3 Функции модулей

Данный пункт содержит в себе подробное описание функций всех модулей, созданных программистом, и описание глобальных переменных модулей.

Для понимания работы программы необходимо произвести описание функций, указанных выше, но не разобранных подробно. А так же тех, о которых еще не шло речи.

Функции и переменные модуля «движка» игры - GraphEngine

Константы:

NUM_OBJECTS = 20; Максимальное количество игровых объектов. Эта переменная используется в некоторых циклах, в качестве параметра количества раз повторения цикла. В дальнейшей разработке программы ее можно легко поменять.

CURRENT_OBJECTS_NUM = 2; Реальное количество объектов. Эта константа описана для того, чтобы было легче увеличивать количество объектов. Она упрощает расширение программы.

Глобальные переменные:

pDevice:IDirect3DDevice9; Устройтво Direct3D

objects:array [0..NUM_OBJECTS] of CDXGObject; Массив игровых объектов. Эта переменная, типа CDXGObject. CDXGObject - это класс, содержащийся в модуле движка объекта DXGObject. В этом массиве содержатся данные о всех игровых объектах.

lpDI8: IDirectInput8 = nil; Главное устройтво DirectInput

lpDIKeyboard: IDirectInputDevice8 = nil; Клавиатура.

lpDIMouse: IDirectInputDevice8 = nil; Мышь.

worldMat, xrMat, yrMat, mvMat:D3DMATRIX; Матрицы для преобразования. Эти переменные представляют собой матрыцы, размером 4х4 и используются при задании положения камеры в виртуальном мире.

pos, vecLR, vecFB, up: TD3DXVECTOR3; Векторы направления осмотра. Эти переменные представляют собой трехмерные векторы, которые определяются 3 вещественными числами.

Функции:

1. constructor CGraphEngine(pD3DDevice:IDirect3DDevice9; hWnd: HWND); В качестве первого параметра функции конструктора передается указатель на устройство Direct3D, второй параметр - окно программы. В разделе переменных функции имеется переменная w типа D3DMATRIX, она будет использоваться для задания мировой матрицы. В теле функции переменной pDevice назначается устройство, созданное в главной программе. Далее задается начальное значение векторов направления, инициализируются матрицы, корректируется значение матрицы w, мировой матрице назначается значение w. Далее вызываются функции инициализации: функция инициализации объекта - InitGraphObjects() и функция инициализации устройств ввода - InitDirectInput(hWnd).

2. function InitObject(typ:string;index:integer):boolean; В качестве первого параметра функция принемает строку, в которой содержится название объекта, второй параметр - это индекс объекта (его порядковый номер). Первым делом в этой функции происходит вызов конструктора движка объекта, которому передается указатель на устройство Direct3D. Далее идет вызов функции LoadMeshFromFile из модуля DXGObject. В зависимости от имени объекта в эту функцию передаются имена разных файлов. Первый - сетка, второй - текстура. И Завершает процедуру присвоение ей результата true, который она возвращает. Исходный код см. в приложениях.

3. procedure InitGraphObjects(); Эта процедура вызывается в конструкторе данного модуля. Переменные процедуры: pos, pos1, rot: D3DMATRIX; - матрицы позиции объектов (rot - используется, как вспомогательная матрица при повороте объекта); lp, lp1, lp2: TD3DXVECTOR3; - вектора направления освещения. Сначала идет вызов InitObject, с помощью которой объекты загружаются в программу. Далее задается матрица позиции объекта. С помощью этой матрицы задается размеры, поворот и положение объекта в трехмерном мире. С помощью процедуры SetWorldPos эта матрица передается в движок объекта и назначается ему. После инициализации и установки позиции объекта в этом коде идут две функции преобразования матриц. Они индивидуальны, и написаны конкретно для этой ситуации - необходимо повернуть объект «человека», поскольку по умолчанию сетка человека располагается горизонтально. Эти функции поворачивают объект «человека» так, чтобы он находился в вертикальном положении. И только после этого вызывается процедура SetWorldPos для позиционирования «человека». Последним действием процедуры InitGraphObjects устанавливаются источники освещения. Сначала определяются вектора направления освещения. Их может быть несколько. Для установки источника света вызывается процедура SetLightPos, которой передаются два параметра - вектор направления освещения и индекс лампочки. Индексы лампочки должны быть разные, так как если указать одинаковые индексы, вторая устанавливаемая лампочка уничтожит первую.

4. procedure RenderScene(); Эта процедура находится в разделе public, так как должна вызваться в главной программе. Она формирует и отображает сцену. Первым делом в этой процедуре вызываем функцию KeyControl, которая обрабатывает данные, полученные с устройств ввода. Если эта функция возвращает False, значит устройства ввода не готовы для передачи данных, в таком случае продолжать работу программы не имеет смысла и производится выход из программы, с помощью процедуры exit. Далее идет отображение сцены и задаются параметры отображения с помощью функций интерфейса IDirect3DDevice9. Очищается переменная этого интерфейса и отображаются объекты на экране. Для этого организуется цикл от 0 до количества объектов - 1, в котором вызывается процедура модуля движка объекта - Render, которая отображает объекты (подробнее о ней можно узнать в описании следующего модуля). На этом процедура RenderScene заканчивается.

5. procedure InitDirectInput( hWnd: HWND ); Эта процедура вызывается на этапе инициализации. В качестве параметра ей передается окно программы, для того, чтобы «прикрепить» к нему устройства ввода. В разделе «var» (описание переменных) этой процедуры одна переменная - dipropdw: TDIPROPDWORD; - структура для задания характеристик мыши. Сначала создается главный объект DirectInput с помощью функции DirectInput8Create. Далее, с помощью метода CreateDevice и _AddRef() интерфейса IDirectInputDevice8 создается объект для работы с клавиатурой. Устанавливается предопределённый формат для "простой клавиатуры" с помощью метода SetDataFormat интерфейса IDirectInputDevice8. В большинстве случаев можно удовлетвориться и установками, заданными в структуре c_dfDIKeyboard по умолчанию, но в особых случаях нужно заполнить её самому. Устанавливаем уровень кооперации (уровень взаимодействия клавиатуры и окна программы) с помощью метода SetCooperativeLevel интерфейса IDirectInputDevice8, В качестве первого параметра этому методу передается окно программы, далее флаги (подробности о флагах можно посмотреть в DirectX SDK, в модуле DirectInput). В завершении всего выше изложенного, производится захват клавиатуры с помощью функции интерфейса IDirectInputDevice8 - Acquire. Аналогичные действия производятся для подключение мыши к программе.

6. procedure ReleaseDirectInput(); Эта процедура производит освобождение захваченных DirectInput ресурсов. Уничтожение объектов должно производиться в порядке, обратном их созданию. Сначала производится освобождение устройства клавиатуры и мыши, затем уничтожение главного объекта DirectInput. Эта функция достаточно проста и понятна даже по названиям функций, используемых в ней.

7. function KeyControl():boolean; С помощью этой функции программа читает данные с устройств ввода и производит необходимые действия в зависимости от полученных данных. В функции так же происходит установка матриц, векторов направления и включение освещения. Код функции можно посмотреть в приложениях. Переменные функции - View:D3DMATRIX; - матрица положения камеры, bKeyBuffer: array [0..255] of Byte; - буфер-массив клавиш клавиатуры, ms: TDIMOUSESTATE; - переменная для данных, полученных от мыши. Что здесь происходит - сначала вызывается метод GetDeviceState интерфейса IDirectInputDevice8, который производит опрос состояния клавиш и записывает данные в буфер-массив. Далее, в зависимости от того, какая нажата клавиша производим перемещение камеры с помощью функций MoveCamera и RotateCamera о которых позже. Проверка нажатия клавиши производится с помощью 16-ричного числа 080 (маска нажатой клавиши). Далее таким же способом производится опрос мыши. Считанные данные записываются в специальный буфер-массив. По ним можно определить нажатия клавиш и изменения по двум осям - х и у. В зависимости от смещения по осям передаются данные в функцию RotateCamera. В этой программе не задействованы клавиши мыши, есть только проверка на их нажатие, это сделано для того, чтобы в будущем программист мог легко задействовать эти клавиши в своей игре. Далее в этой функции задаются вектора направления и преобразуются матрицы положения камеры. О том как происходит этот процесс см. в следующем пункте «технико-математическое описание задачи».

8. Procedure MoveCamera(fOffset:real; vecModifier:TD3DXVECTOR3); Эта процедура реализует перемещение камеры по виртуальному миру. Подробное описание математических действий описано в пункте «Технико-математическое описание задачи». Первый параметр - значение, на которое нужно передвинуть камеру, второй параметр - матрица положения камеры. Итак, сначала заполняются вспомогательные переменные, затем осуществляется преобразование вектора позиции камеры, и последний шаг - коррекция матрицы позиции камеры, с учетом изменений вектора.

9. procedure RotateCamera(fOffset:real; Axis:integer); Эта процедура похожа на предыдущую. В качестве первого параметра она получает значение, на которое нужно повернуть камеру, в качестве второго - ось, вокруг которой нужно повернуть камеру. Если Axis = 0 поворот производится вокруг оси у, если 1 то по х. Подробное описание математических действий описано в пункте «Технико-математическое описание задачи».

Функции и переменные модуля «движка» объекта - DXGObject

Константы:

MAX_OBJECT_EFFECTS = 10; - Максимальное количество эффектов (используется при установки освещения).

Глобальные переменные:

Все глобальные переменные движка объекта описаны в классе - СDXGObject.

pDevice:IDirect3DDevice9; - указатель на устройство Direct3D;

dwNumMaterials:DWord; - В этой переменной хранится количество загруженных элементов из Х-файла (объект может состоять из нескольких сеток).

pMesh:ID3DXMesh; - Сетка Mesh.

pMeshTextures:PAIDirect3DTexture9; - Текстура объекта.

pMeshMaterials:PAD3DMATERIAL9; - Материал объекта.

pTexture:array [0..MAX_OBJECT_EFFECTS] of IDirect3DTexture9; - Массив текстур.

Light:array [0..MAX_OBJECT_EFFECTS] of D3DLIGHT9; - Массив источников освещения.

matWorld: D3DMATRIX; - Мировая матрица.

Функции:

1. constructor CDXGObject(pD3DDevice:IDirect3DDevice9); Конструктор. В качестве параметра конструктору класса объекта передается образец устройства Direct3D. Далее производится получение образца устройства Direct3D и инициализация мировой матрицы.

2. procedure LoadMeshFromFile(filename:string; texturename:string); Процедура Загрузки Х-файла. Эта процедура получает в качестве первого параметра строку, содержащую путь к файлу сетки объекта, а в качестве второго параметра - строку, содержащую путь к файлу текстуры. В теле процедуры производится только одно действие - переменной dwNumMaterials назначается результат работы функции LoadMesh, которая находится в модуле dxfunc. Эта функция производит чтение информации из Х-файла.

3. procedure LoadTexture(filename:PAnsiChar; index:integer); - Процедура Загрузки текстуры. Эта процедура в качестве первого параметра получает имя файла, содержащего текстуру объекта, а в качестве второго параметра индекс текстуры (у одного объекта может быть несколько текстур). В теле этой процедуры происходит вызов процедуры Direct3D - D3DXCreateTextureFromFileEx, которой передаются: устройство Direct3D, путь к файлу с текстурой, флаги и переменная текстуры (элемент массива текстур).

4. function GetWorldPos():D3DMATRIX ; - Функция получения позиции мира (мировой матрици). Эта процедура получает мировую матрицу.

5. procedure SetWorldPos(matrix:D3DMATRIX); - Процедура определения положения объекта. Эта процедура определяет мировую матрицу.

6. procedure SetLightPos(Pos:TD3DXVECTOR3; index:integer); - Процедура установки источника освещения. В качестве первого параметра эта процедура получает трехмерный вектор, который определяет направление источника света. В качестве второго параметра процедуре передается индекс лампочки. В теле процедуры производятся следующие действия: выделение памяти под структуру типа D3DLIGHT9. Отдельно заполнение этой структуры: первый параметр - _Type - тип освещения, в данном случае он равен константе D3DLIGHT_DIRECTIONAL, что означает рассеянный свет. Следующий параметр - Direction, с помощью него задается направление освещения (равен Pos). Следующие 4 параметра определяют цвет освещения (в данном случае все они равны 1, а значит освещение белое). После заполнения структуры необходимо установить лампочку, это производится с помощью функции SetLight интерфейса IDirect3DDevice9. Включить лампочку - LightEnable.

7. procedure Positioning(); - Процедура установки позиции объекта. В теле этой процедуры производится установка матрицы позиции объекта, с помощью функции SetTransform интерфейса IDirect3DDevice9. Первый параметр этой функции - это константа, определяющая тип матрици (в данном случае используется D3DTS_WORLD, которая означает, что это мировая матрица). В качестве второго параметра производится вызов функции GetWorldPos (ее описание см. выше).

8. function Render(ef_index:DWORD):boolean; - Функция отображения объекта. В качестве параметра функция получает номер (индекс) объекта. В теле функции первым делом вызывается функция Positioning. После установки позиции объекта запускается цикл for от 0 до количества загруженных сеток - 1 (минус один). В цикле: с помощью функции SetMaterial интерфейса IDirect3DDevice9 устанавливаем материал, далее устанавливается текстура, если она есть, с помощью функции SetTexture интерфейса IDirect3DDevice9; следующий шаг цикла - отображение сетки с помощью функции DrawSubset интерфейса ID3DXMesh; конец цикла. Далее присваиваем результату работы программы True.

3.3.3.3 Функции и переменные модуля инициализации графики и загрузки Х-файлов - dxfunc

Типы:

PAIDirect3DTexture9 - Представляет собой массив неопределенной размерности, состоящий из указателей на тип IDirect3DTexture9. Этот тип необходим для работы с текстурами.

PAD3DMATERIAL9 - Представляет собой массив неопределенной размерности, состоящий из указателей на тип TD3DMATERIAL9. Этот тип необходим для работы с материалом.

PAD3DXMATERIAL - Представляет собой массив неопределенной размерности, состоящий из указателей на тип TD3DXMATERIAL. Этот тип необходим для работы с материалом.

Функции:

1.function DX3DInit(var ppiD3D9: IDirect3D9;

var ppiD3DDevice9: IDirect3DDevice9;

hWnd: THandle;

iWidth, iHeight: Integer;

var bFullScreen: Boolean):Boolean;

Параметры функции DXDInit:

ppiD3D9 типа IDirect3D9 - для хранения интерфейса Direct3D 9-й версии;

PPDi3DDevice9 типа IDirect3DDevice9 -- для хранения интерфейса устройства IDirect3DDevice 9-й версии;

hwnd -- окно, в котором будет происходить отображение Direct3D-сцены;

iWidth и iHeight -- желаемая ширина и высота окна;

bFullscreen -- параметр, указывающий на то, нужно ли выводить программу в полноэкранном режиме.

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

Первое, что делается внутри функции - создается экземпляр интерфейса IDirect3D9 с помощью функции DirectЗDCreate9 и сохраняется результат в переменной ppiDЗD9. Этот интерфейс используется для создания объектов Direct3D и для настройки окружения. В качестве параметра необходимо передать константу D3D_SDK_VERSION(). Эта константа описана в заголовочном файле Direct3D9, и ее значение увеличивается в каждой версии. По значению константы DirectX определяет, является ли заголовочный файл корректным. Если значение не будет совпадать, то функция вернет ошибку. Проблему решит перекомпиляция программы с корректным заголовочным файлом.

Далее заполняется структура типа DЗDPRESNT_PARAMETERS, которая определяет параметры представления. Прежде чем использовать структуру, необходимо заполнить ее нулевыми значениями, чтобы незаполненные поля использовали значение по умолчанию. Подробное описание этой структуры см. в разделе «Общая часть» / «дополнительные средства языка» / «DirectX».

Далее следует запрос на отображение в полноэкранном режиме. Если переменная iRes равна IDYES, значит отображать следует в полноэкранном режиме. Тогда задаются параметры полноэкранного режима в структуре типа DЗDPRESNT_PARAMETERS. Иначе (если iRes не равно IDYES) задаются параметры оконного режима.

Далее переменной hRes присваивается значение работы функции CreateDeviсe интерфейса IDirect3D9. Следующим действием в процедуре инициализации необходимо установить перспективу и отключить освещение.

2.function LoadMesh(filename:String;

ppiD3DDevice9:IDirect3DDevice9;

var ppMesh:ID3DXMesh;

var pMeshTextures: PAIDirect3DTexture9;

texturefilename: String;

var pMeshMaterials: PAD3DMATERIAL9):DWORD;

Параметры функции:

filename:String; - Имя загружаемого Х-файла;

ppiD3DDevice9:IDirect3DDevice9; - указатель на интерфейс IDirect3DDevice9;

var ppMesh:ID3DXMesh; - переменная типа ID3DXMesh.Этот интерфейс используется для хранения и работы mesh-поверхностями;

var pMeshTextures: PAIDirect3DTexture9; - указатель на массив интерфейса IDirect3DTexture9. Этот интерфейс используется для хранения текстур;

texturefilename: String; - указатель на имя файла текстуры по умолчанию. Имена текстур могут храниться прямо в Х-файле, но если там нет текстуры, то используется файл из этого параметра. Если уже и здесь текстуры не будет, тогда объект не обтягивается текстурой;

var pMeshMaterials: PAD3DMATERIAL9:DWORD; - указатель на массив структур типа D3DMATERIAL9, который определяет материал объекта.

Переменные функции

pD3DXMtrlBuffer: ID3DXBUFFER; - это буфер, в котором будут храниться используемые в файле материалы;

dwNumMaterials: DWORD; - Необходима для хранения количества загруженных сеток.

d3dxMaterials: PAD3DXMATERIAL; - материал.

Первая процедура, которая вызывается в теле этой функции - это D3DXLoadMeshFromX(PAnsiChar(filename), D3DXMESH_SYSTEMMEM, ppiD3DDevice9, nil, @pD3DXMtrlBuffer, nil, @dwNumMaterials, ppMesh); в качестве параметров в эту процедуру передается имя загружаемого файла, опции, которые должны использоваться при загрузке (опций достаточно много, но в данном случае используется D3DXMESH_SYSTEMMEM, которая означает, что загрузка происходит в системную память); следующий параметр - указатель на устройство Direct3D; далее указатель на буфер для смежных граней; указатель на буфер для материалов; указатель на буфер для экземпляров эффектов; через предпоследний параметр будет получено количество загруженных материалов; и последний параметр - это непосредственно указатель на объект сетки.

Загрузив данные, нужно разобраться с материалами и при необходимости загрузить текстуры, которые сейчас находятся в буфере pD3DXMtrlBuffer. Сначала определяется указатель на данные буфера с помощью метода pD3DXMtrlBuffer.GetBufferPointer(); После выполнения этого метода программе известно количество материалов, поэтому далее идет инициализация массивов для их хранения. Массивы динамические и их инициализация проходит с помощью процедуры GetMem. Первый массив выделяет память для хранения материалов, второй для хранения такого же количества текстур. Далее идет запуск цикла, в котором будут перебираться все материалы от 0 до значения dwNumMaterials. В цикле сначала капируется материал в i-й элемент массива pMeshMaterials. Затем нужно загрузить картинку, используемуюв качестве текстуры. Для загрузки картинки применяется функция D3DXCreateTextureFromFile.

В качестве результата функция возвращает количество загруженных объектов.

3.function LoadTexture(text_buf:PByteArray;iWidth, iHeight:Integer; filename:String):Boolean; - С помощью этой функции можно загрузить текстуру и натянуть ее на объект, созданный программно. Краткое содержание этой функции: чтение файла, проверка заголовка (является ли файл bmp, то есть точечным рисунком) и если является, загружаем его. Эта функция для достаточно индивидуальных случаев и в данном проекте не применяется. Однако ее существование очень полезно, поскольку функция может очень пригодиться для создания какой-нибудь картинки, возможно для заставки или игрового меню. Ведь слишком неоправданны были бы потери процессорного времени при загрузки сетки, состоящей из двух треугольников, из Х-файла.


Подобные документы

  • Игровой движок Unity, его использование для создания приложений, связанных с архитектурой, обучением, визуализацией данных и электронными книгами. Разработка системы освещения для работы с двухмерными объектами в виде расширения редактора Unity.

    дипломная работа [2,5 M], добавлен 11.02.2017

  • Использование DirectX для решения задач по выводу и обработке графики в Microsoft Windows. Описание используемых DirectX-функций. Исходный текст отлаженной программы. Техника работы с окнами. Результаты работы программы, составление алгоритма, листинг.

    контрольная работа [226,0 K], добавлен 18.05.2014

  • Разработка компьютерной игры "Эволюция" с помощью игрового движка Unit. Сравнение критериев игры-аналога и разрабатываемой игры. Разработка графического интерфейса пользователя. Настройки камеры в редакторе Unity. Структура файла сохранения игры.

    дипломная работа [3,6 M], добавлен 11.02.2017

  • Ознакомление с интерфейсом, основными возможностями и преимуществами использования программы OpenGL - популярной библиотекой для работы с 2D и 3D графикой. Рассмотрение назначения, базовых компонент и правил инициализации программного движка DirectX.

    презентация [19,4 K], добавлен 14.08.2013

  • Подбор игрового движка и описание его основных характеристик. Разработка структуры, алгоритма и интерфейса программы. Проектирование иерархии классов. Выделение типового приема визуализации. Тестирование правильности работы программного обеспечения.

    курсовая работа [3,1 M], добавлен 19.01.2017

  • Структура Android-приложений. Особенности игрового движка. Алгоритмизация и программирование. Список игровых состояний. Настройка, отладка и тестирование программы. Разработка руководства пользователя. Тестирование инсталляции и отображения элементов.

    дипломная работа [4,5 M], добавлен 19.01.2017

  • Изучение аэродинамики как одной из разделов физики в современном мире. Компьютерное моделирование взаимодействия самолета с окружающей средой. Создание физического движка. Освоение языка программирования C++, графического программного интерфейса OpenGL.

    практическая работа [1,1 M], добавлен 03.05.2015

  • Описание алгоритма решения задачи по вычислению суммы элементов строк матрицы с использованием графического способа. Детализация укрупненной схемы алгоритма и разработка программы для решения задачи в среде Turbo Pascal. Листинг и тестирование программы.

    курсовая работа [446,0 K], добавлен 19.06.2014

  • Разработка программного продукта, предназначенного для имитации физического взаимодействия между объектами на основе игрового симулятора. Проектирование программы "LonelySpaceRanger", код которой представлен на языке VisualС++. Разработка интерфейса.

    дипломная работа [3,2 M], добавлен 30.11.2011

  • High Level Shader Language как высокоуровневый Си-подобный язык для написания шейдеров. Программа для работы с шейдерами, вид и краткое описание интерфейса. Характеристика особенностей создания трехмерных изображений. Структурные элементы программы.

    курсовая работа [485,2 K], добавлен 16.01.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.