Игровой движок «Owl Engine» на примере автосимулятора. Исследовательская работа. Реферат. Исследовательская работа Оглавление Игровой движок Owl Engine
Скачать 1.26 Mb.
|
Игровой движок «Owl Engine» на примере автосимулятораИсследовательская работаОглавление Игровой движок «Owl Engine» на примере автосимулятора 1 Исследовательская работа 1 Введение 4 Игровой движок — это центральный программный компонент компьютерных и видеоигр или других интерактивных приложений с графикой, обрабатываемой в реальном времени. Он обеспечивает основные технологии, упрощает разработку игровых программ. Типично, игровые движки являются более неспециализированными, чем конкретная игра, что позволяет повторно использовать их в разных проектах. Тем не менее, некоторые разработчики игр называют движком весь исходный код игры. 4 Гоночная компьютерная игра (или автосимулятор в широком смысле) — жанр компьютерных игр, в котором игрок управляет автомобилем. 4 Сейчас существует большое количество игровых движков. Все они имеют огромное количество возможностей и преимуществ. Но, не смотря на это, мы решили создать свой игровой движок, который, пусть и не будет сравним с профессиональными коммерческими движками, но будет написан нами. 4 Почему мы выбрали именно эту тему для исследовательской работы? На это есть несколько причин: 4 1)Практически не существует игровых движков, базирующихся на язык Delphi 4 2)Создание подобного проекта позволит получить большой опыт в программировании и 3D-графике 4 3)Созданный нами движок мы сможем использовать в наших будущих проектах 4 Описание программы 5 Основная часть 5 Цели работы 5 Задачи работы 5 Реализовать вывод трехмерной графики с помощью OpenGL 5 OpenGL (Open Graphics Library — открытая графическая библиотека, графический API) — спецификация, определяющая независимый от языка программирования платформонезависимый программный интерфейс для написания приложений, использующих двумерную и трёхмерную компьютерную графику. 5 Описать структуру данных для хранения 3D-геометрии 5 Особенности и проблемы реализации 6 Структура данных для хранения 3D-геометрии 6 Загрузчик 3D-моделей из файла 7 Наш загрузчик работает с файлами формата OBJ. OBJ — это формат файлов описания геометрии, который является открытым и был принят другими разработчиками приложений 3D графики. По большей части это общепринятый формат. Формат файлов OBJ содержит только 3D геометрию, а именно, позицию каждой вершины, связь координат текстуры с вершиной, нормаль для каждой вершины, а также параметры, которые создают полигоны. 7 Реализация «физики» движения автомобиля 8 Обнаружение коллизий между объектами 10 Прочитав большое количество информации по теме обнаружения коллизий между объектами, мы пришли к выводу, что можно реализовать свой, более простой в понимании, способ обнаружения коллизий. Самым популярным способом является OBB-OBB (Произвольно ориентированный параллелепипед - Произвольно ориентированный параллелепипед), но этот способ довольно сложен в понимании и реализации. Этот метод является следствием теоремы о разделяющихся осях, которая гласит, что если существует плоскость, в которой проекции данных фигур не пересекается, то не пересекаются и сами фигуры. 10 Дальнейшие перспективы программы 12 Достоинства программы 12 Вывод 12 Источники информации 13 Приложение 14 Схема 1. 14 «Схема структуры данных хранения загруженных 3D-моделей» 14 Схема 2. 15 Схема 3. 15 «Схема алгоритма вывода объектов на экран» 15 Схема 4. 16 Изображение 1. 18 ВведениеИгровой движок — это центральный программный компонент компьютерных и видеоигр или других интерактивных приложений с графикой, обрабатываемой в реальном времени. Он обеспечивает основные технологии, упрощает разработку игровых программ. Типично, игровые движки являются более неспециализированными, чем конкретная игра, что позволяет повторно использовать их в разных проектах. Тем не менее, некоторые разработчики игр называют движком весь исходный код игры.Гоночная компьютерная игра (или автосимулятор в широком смысле) — жанр компьютерных игр, в котором игрок управляет автомобилем.Сейчас существует большое количество игровых движков. Все они имеют огромное количество возможностей и преимуществ. Но, не смотря на это, мы решили создать свой игровой движок, который, пусть и не будет сравним с профессиональными коммерческими движками, но будет написан нами.Почему мы выбрали именно эту тему для исследовательской работы? На это есть несколько причин:Практически не существует игровых движков, базирующихся на язык DelphiСоздание подобного проекта позволит получить большой опыт в программировании и 3D-графикеСозданный нами движок мы сможем использовать в наших будущих проектахОписание программыПрограмма представляет собой набор модулей, включающий в себя множество описанных классов и методов для создания игровых программ. Реализованы следующие функции: рендер изображения, «физика» автомобиля, детектор коллизий объектов и другие. Взаимодействие с движком осуществляется средствами объектно-ориентированного программирования. Например, для создания самого простого автосимулятора необходимо лишь создать объекты сцены, автомобиля, камеры и света. После описанных действий игрок уже сможет управлять автомобилем и перемещаться на нем по уровню. Демонстрационная программа представляет собой игровой авто-симулятор, реализованный на данном игровом движке. На его примере демонстрируются основные возможности нашей программы. Основная частьЦели работыПолучить опыт работы с OpenGL и объектно-ориентированным программированием Улучшить навыки работы в среде программирования Delphi Разработать игровой движок для создания простого авто-симулятора Задачи работыРеализовать вывод трехмерной графики с помощью OpenGLОписать структуру данных для хранения 3D-геометрииСтруктура данных должна быть удобной и оптимизированной для работы с ней. Это позволит более быстро и оптимально разрабатывать программу. Реализовать загрузчик 3D-моделей из файла Рисования примитивов недостаточно для игрового движка, поэтому необходимо использовать сложную геометрию. Такие 3D-модели хранятся в определенном виде в файле. Существует несколько форматов хранения 3D-сцен. Мы реализовали загрузчик одного из самых популярных и удобных для работы форматов – формат OBJ. Описать основные классы объектов Объектно-ориентированный подход позволяет использовать уже описанные методы с их дополнением в классах-потомках. Пользователь может описать свои классы на основе уже реализованных нами, что может сэкономить время на реализацию. Реализовать «физику» движения автомобиля Необходимо реализовать такие явления, как: движение автомобиля, заносы, «амортизация», торможение и так далее. Реализовать функции обнаружения коллизий между объектами и их разрешения Объекты игры должны взаимодействовать друг с другом – реагировать на столкновения. Для этого нужно определить факт существования коллизии, а также ее координаты. После получения координат всех текущих коллизий необходимо их обработать и определить, как должны двигаться объекты. Особенности и проблемы реализацииСтруктура данных для хранения 3D-геометрииДля хранения 3D-геометрии мы используем глобальный массив, в который загружаются из файлов все используемые в запущенной программе 3D-модели. Такой подход позволяет при создании нового объекта не загружать снова из файла данные модели, а просто получать информацию (координаты вершин, текстуры и т.д.) из глобального массива. См. схему 1 в приложении. 3D-модель представляет собой набор вершин, объединенных в полигоны. Одна вершина может принадлежать сразу нескольким полигонам. Чтобы избежать повторяющихся вершин создается массив со всеми вершинами, а массив с информацией о полигонах ссылается на нужные вершины. С нормалями полигонов – аналогично. Это позволяет сэкономить память, т.к. не нужно хранить одну вершину несколько раз, также это удобно при изменении координат какой-либо вершины – поменять нужно только одну вершину в массиве, а не несколько, в случае, если хранятся дубликаты одной и той же вершины. Загрузчик 3D-моделей из файлаНаш загрузчик работает с файлами формата OBJ. OBJ — это формат файлов описания геометрии, который является открытым и был принят другими разработчиками приложений 3D графики. По большей части это общепринятый формат. Формат файлов OBJ содержит только 3D геометрию, а именно, позицию каждой вершины, связь координат текстуры с вершиной, нормаль для каждой вершины, а также параметры, которые создают полигоны.См. схему 2 в приложении. Определения делятся на vertex(вершинные), face (полигоны), group (группы модели), MaterialLibrary (имя файла с материалами), Material (Название материала для данного полигона). На схеме представлены несколько из них. Как происходит загрузка модели? Для этого нужно анализировать все строки файла. Для каждой строки (кроме пустой и строки комментария) характерна проверка на первый символ: Псевдокод: case S[1] of 'V' : ReadVertexData; { ReadVertexData анализирует второй символ строки, который указывает что это за координаты: ‘t’ – текстурные, ‘n’ – нормали, если пробел, то координаты вершины. В зависимости от типа, координаты считываются в необходимый массив } 'G' : begin Увеличить динамический массив Group на 1 элемент Присвоить имя группы { Следующие строки после имени группы – набор полигонов } end; 'F' : ReadFaceData; { Необходимо рассмотреть несколько вариантов определения полигона Vertex//normal Vertex//normal Vertex//normal . . . Vertex/texture/normal Vertex/texture/normal Vertex/texture/normal . . . Vertex/Texture Vertex/Texture Vertex/Texture. . . VertexVertexVertex . . . В зависимости от варианта данные записываются в соответствующие массивы } И так далее. Реализация «физики» движения автомобиляОсновные характеристики автомобиля: это уровни нажатия газа, тормоза, угол поворота руля, текущая передача и т.д. Другие характеристики вы можете на схеме. См. схему 4 в приложении. На данном этапе нами реализовано: Движение автомобиля Заносы Торможение Переключение передач «Амортизация» автомобиля Вычисление основных сил «физики» автомобиля (часть кода) FrcY, FrcX – локальные силы, действующие на машину KPP[KPPstep] – передаточный коэффициент текущей передачи CarSpeed – вектор скорости Accel – степень нажатия педали газа Power – максимальная мощность двигателя Break – степень нажатия педали тормоза DTime – время, прошедшее с последнего вызова процедуры И так далее, другие характеристики обозначены на схеме 4 в приложении. FrcY := (KPP[KPPstep] * CarSpeed * Accel - SpeedY) * Power / sqr(KPP[KPPstep]); FrcY := FrcY - (Break / DTime + kAF) * Sign(SpeedY); FrcX := (-SpeedY * car.Steer * carExBack / Radius - SpeedX) / DTime; { Занос } if Abs(FrcX) > MaxFRCX then FrcX := MaxFRCX * Sign(FrcX); { Пробуксовка } if Abs(FrcY) > MaxFRCY then FrcY := car.MaxFRCY * Sign(FrcY); { Вычисление наклонов машины } { Вперед/назад } tmp := DTime * resFB; carDiffFB := carDiffFB * (1 - tmp) + FrcY / (MaxFRCY * kYung * Height) * tmp; { Влево/вправо } tmp := DTime * resLR; carDiffLR := carDiffLR * (1 - tmp) + FrcX / (MaxFRCX * kYung * Width) * tmp; SpeedAlpha := SpeedAlpha + RotFRC * DTime; SpeedX := SpeedX + ForceX * DTime; SpeedY := SpeedY + ForceY * DTime; Обнаружение коллизий между объектамиПрочитав большое количество информации по теме обнаружения коллизий между объектами, мы пришли к выводу, что можно реализовать свой, более простой в понимании, способ обнаружения коллизий. Самым популярным способом является OBB-OBB (Произвольно ориентированный параллелепипед - Произвольно ориентированный параллелепипед), но этот способ довольно сложен в понимании и реализации. Этот метод является следствием теоремы о разделяющихся осях, которая гласит, что если существует плоскость, в которой проекции данных фигур не пересекается, то не пересекаются и сами фигуры.Пример OBB Мы пошли другим путем. Наш способ основывается на поиске пересечения отрезка и полигона в пространстве. Алгоритм описан на схеме 5 в приложении. Рассмотрим подробнее некоторые детали нашего алгоритма. Все начинается с того, что объекты, участвующие в проверке коллизий между собой заранее обводятся примитивами, определяющими их «границы». Именно с этими примитивами мы и будем взаимодействовать при анализе коллизий. Примитив, определяющий «границы» автомобиля, «создает» четыре отрезка (можно и больше, но в данной игровой демонстрации в этом нет необходимости). Именно эти отрезки мы и будем проверять на коллизию с полигонами карты. Суть нашего алгоритма заключается в том, что по очереди проверяются коллизии каждого отрезка с полигонами карты, и если есть коллизия, координаты точки коллизии сообщаются объекту – автомобилю, который уже разрешает эту коллизию. Рассчитывается нормализованное векторное произведение 1, 2 точек плоскости и 1, 3. Рассчитывается вектор от точки отрезка до точки плоскости Рассчитывается скалярное произведение полученного вектора до плоскости по нормали Рассчитывается скалярное произведение отрезка до плоскости по нормали Достоинства метода: Прост в реализации и «понимании» Достаточно точное определение точки коллизии Теоретически может быть использован для невыпуклой геометрии Недостатки: Вычислительно сложен для компьютера Для точного определения коллизий необходимо задавать много векторов для проверки Дальнейшие перспективы программыОптимизировать проверку и разрешение коллизий Реализовать графические эффекты Оптимизировать вывод объектов на экран (выборка видимых объектов) Реализовать проверку правил дорожного движения Реализовать класс авто, управляемых компьютером Реализовать элементы интерфейса Достоинства программыДостаточно удобное взаимодействие с OpenGL – практически за две строчки кода можно вывести на экран сложную 3d-модель Универсальные модули, которые можно использовать в любых других проектах на Delphi Полезный проект, т.к. в интернете сложно найти полноценный и готовый загрузчик 3d моделей для Delphi Имеются перспективы развития на ближайшее время ВыводВ результате проделанной работы был реализован игровой движок, а также демонстрационная программа игровой авто-симулятор, реализованная на данном игровом движке Имеются ближайшие перспективы развития проекта Мы получили большой опыт в работе с OpenGL и ООП на Delphi Источники информацииhttp://gamedev.ru/forum http://gamesmaker.ru http://wikipedia.org http://thedelphi.ru/les-opengl.php http://opengl-tutorial.blogspot.ru http://www.cyberforum.ru/opengl http://www.gamedev.ru/code/articles/Racing_Simulator http://www.gamedev.ru/code/articles/?id=4233 «Delphi 2006 - Справочное пособие», А.Я. Архангельский, 2006, издательство «Бином» 10) «Физика для разработчиков компьютерных игр», Д. Конгер, 2007, издательство «Бином» ПриложениеСхема 1.«Схема структуры данных хранения загруженных 3D-моделей»Схема 2.«Типы определения Obj файла» # Вершинные координаты (x, y, z) v 0.123 0.234 0.345 1.0 v ... ... # Текстурные координаты (u,v) vt 0.500 -1.352 vt ... ... # Нормали (x,y,z) . vn 0.707 0.000 0.707 vn ... # Определения поверхности f 1 2 3 f 3/1 4/2 5/3 f 6/4/1 3/5/3 7/6/5 ... Схема 3.*Items – список потомков данного объекта *Метод DRAW выводит текущий объект, затем вызывает метод потомков «Схема алгоритма вывода объектов на экран»Схема 4.«Иерархия классов в движке» Схема 5. «Анализ коллизий» Изображение 1.«Скриншот из демонстрационной программы» |