Главная страница
Навигация по странице:

  • Почему мы выбрали именно эту тему для исследовательской работы На это есть несколько причин

  • Delphi

  • Вычисление основных сил «физики» автомобиля (часть кода)

  • Прочитав большое количество информации по теме обнаружения коллизий между объектами, мы пришли

  • «Типы определения

  • «Иерархия классов в движке»

  • «Скриншот из демонстрационной программы»

  • Игровой движок «Owl Engine» на примере автосимулятора. Исследовательская работа. Реферат. Исследовательская работа Оглавление Игровой движок Owl Engine


    Скачать 1.26 Mb.
    НазваниеИсследовательская работа Оглавление Игровой движок Owl Engine
    АнкорИгровой движок «Owl Engine» на примере автосимулятора. Исследовательская работа
    Дата20.06.2021
    Размер1.26 Mb.
    Формат файлаdoc
    Имя файлаРеферат.doc
    ТипИсследовательская работа
    #219309

    Игровой движок «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


    Введение

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

    Гоночная компьютерная игра (или автосимулятор в широком смысле) — жанр компьютерных игр, в котором игрок управляет автомобилем.

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

    Почему мы выбрали именно эту тему для исследовательской работы? На это есть несколько причин:

    1. Практически не существует игровых движков, базирующихся на язык Delphi

    2. Создание подобного проекта позволит получить большой опыт в программировании и 3D-графике

    3. Созданный нами движок мы сможем использовать в наших будущих проектах

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


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

    Демонстрационная программа представляет собой игровой авто-симулятор, реализованный на данном игровом движке. На его примере демонстрируются основные возможности нашей программы.

    Основная часть

    Цели работы


    • Получить опыт работы с OpenGL и объектно-ориентированным программированием

    • Улучшить навыки работы в среде программирования Delphi

    • Разработать игровой движок для создания простого авто-симулятора



    Задачи работы

    • Реализовать вывод трехмерной графики с помощью OpenGL

    OpenGL (Open Graphics Library — открытая графическая библиотека, графический API) — спецификация, определяющая независимый от языка программирования платформонезависимый программный интерфейс для написания приложений, использующих двумерную и трёхмерную компьютерную графику.
    • Описать структуру данных для хранения 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 в приложении. Рассмотрим подробнее некоторые детали нашего алгоритма.

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


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

    ðŸñ€ñð¼ð°ñ ñð¾ ññ‚ñ€ðµð»ðºð¾ð¹ 299


    ðŸñ€ñð¼ð°ñ ñð¾ ññ‚ñ€ðµð»ðºð¾ð¹ 301


    ðŸñ€ñð¼ð°ñ ñð¾ ññ‚ñ€ðµð»ðºð¾ð¹ 300


    ðŸñ€ñð¼ð°ñ ñð¾ ññ‚ñ€ðµð»ðºð¾ð¹ 298
    Суть нашего алгоритма заключается в том, что по очереди проверяются коллизии каждого отрезка с полигонами карты, и если есть коллизия, координаты точки коллизии сообщаются объекту – автомобилю, который уже разрешает эту коллизию.

    1. Рассчитывается нормализованное векторное произведение 1, 2 точек плоскости и 1, 3.

    2. Рассчитывается вектор от точки отрезка до точки плоскости

    3. Рассчитывается скалярное произведение полученного вектора до плоскости по нормали

    4. Рассчитывается скалярное произведение отрезка до плоскости по нормали


    Достоинства метода:

    Недостатки:

    • Вычислительно сложен для компьютера

    • Для точного определения коллизий необходимо задавать много векторов для проверки


    Дальнейшие перспективы программы


    • Оптимизировать проверку и разрешение коллизий

    • Реализовать графические эффекты

    • Оптимизировать вывод объектов на экран (выборка видимых объектов)

    • Реализовать проверку правил дорожного движения

    • Реализовать класс авто, управляемых компьютером

    • Реализовать элементы интерфейса

    Достоинства программы





    • Достаточно удобное взаимодействие с OpenGL – практически за две строчки кода можно вывести на экран сложную 3d-модель

    • Универсальные модули, которые можно использовать в любых других проектах на Delphi

    • Полезный проект, т.к. в интернете сложно найти полноценный и готовый загрузчик 3d моделей для Delphi

    • Имеются перспективы развития на ближайшее время

    Вывод


    В результате проделанной работы был реализован игровой движок, а также демонстрационная программа игровой авто-симулятор, реализованная на данном игровом движке

    • Имеются ближайшие перспективы развития проекта

    • Мы получили большой опыт в работе с OpenGL и ООП на Delphi

    Источники информации


    1. http://gamedev.ru/forum

    2. http://gamesmaker.ru

    3. http://wikipedia.org

    4. http://thedelphi.ru/les-opengl.php

    5. http://opengl-tutorial.blogspot.ru

    6. http://www.cyberforum.ru/opengl

    7. http://www.gamedev.ru/code/articles/Racing_Simulator

    8. http://www.gamedev.ru/code/articles/?id=4233

    9. «Delphi 2006 - Справочное пособие», А.Я. Архангельский, 2006, издательство «Бином»

    10) «Физика для разработчиков компьютерных игр», Д. Конгер, 2007, издательство «Бином»

    Приложение

    Схема 1.


    ð“ñ€ñƒð¿ð¿ð° 50

    «Схема структуры данных хранения загруженных 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.


    ð“ñ€ñƒð¿ð¿ð° 69
    *Items – список потомков данного объекта

    *Метод DRAW выводит текущий объект, затем вызывает метод потомков

    «Схема алгоритма вывода объектов на экран»



    Схема 4.


    group 327

    «Иерархия классов в движке»
    Схема 5.

    «Анализ коллизий»

    ð“ñ€ñƒð¿ð¿ð° 291

    Изображение 1.




    «Скриншот из демонстрационной программы»




    написать администратору сайта