Движок Doom - Википедия - Doom engine

iD Tech 1
Разработчики)id Программное обеспечение, (Джон Кармак, Джон Ромеро, Дэйв Тейлор)
Окончательный релиз
1.9 / 1 февраля 1995 г.; 25 лет назад (1995-02-01)
Репозиторийgithub.com/id-Software/DOOM
Написано вC, язык ассемблера
ПлатформаДОС, Майкрософт Виндоус, MacOS, Linux, Android, Верстак Amiga, Следующий шаг, Macintosh, Коммодор Амига, Следующий, SNES, Атари Ягуар, Sega 32X, Sony PlayStation, Panasonic 3DO, Nintendo 64, Sega Saturn, Game Boy Advance, Nintendo Switch
ПреемникQuake Engine
ЛицензияСтандартная общественная лицензия GNU
Лицензия MIT[1]

id Tech 1, также известный как Рок двигатель, это игровой движок это приводит в действие id Программное обеспечение игры Рок и Doom II: Ад на Земле. Он также используется в Еретик, Hexen: Beyond Heretic, Раздор: поиски печати, Hacx: Twitch 'n Kill, Freedoom, и другие игры, произведенные лицензиатами. Он был создан Джон Кармак, со вспомогательными функциями, записанными Майк Абраш, Джон Ромеро, Дэйв Тейлор, и Пол Радек. Первоначально разработан на Следующий компьютеры, это было портирован к ДОС за Рокпервоначальный выпуск, а затем был перенесен на несколько Игровые приставки и операционные системы.

В исходный код к Linux версия Рок был выпущен для общественности по лицензии, которая предоставила права на некоммерческое использование 23 декабря 1997 года, за которым последовала версия Linux Doom II примерно через неделю, 29 декабря 1997 г.[2] Исходный код был позже переиздан под Стандартная общественная лицензия GNU 3 октября 1999 г.[3][4]Десятки неофициальных Рок исходные порты которые были созданы с тех пор позволяют Рок работать в ранее неподдерживаемых операционных системах и иногда радикально расширять функциональность движка новыми функциями.

Хотя движок отображает трехмерное пространство, это пространство проецируется из двухмерного поэтажный план. Линия обзора всегда параллельна полу, стены должны быть перпендикулярны полу, создание многоуровневых конструкций или наклонных участков (полов и потолков с разными углами) невозможно. Несмотря на эти ограничения, двигатель представлял собой технологический скачок по сравнению с предыдущими версиями id. Вольфенштейн 3D двигатель. В Рок двигатель позже был переименован в "id Tech 1", чтобы отнести его к списку длинная линейка игровых движков id Software.[5]

Игровой мир

В Рок движок отделяет рендеринг от остальной игры. Графический движок работает максимально быстро, но игровой мир работает со скоростью 35 кадров в секунду независимо от оборудования, поэтому несколько игроков могут играть друг против друга, используя компьютеры разной производительности.[6]

Структура уровней

Простая установка, демонстрирующая, как Рок представляет уровни внутри

Просмотр карты в редакторе

Если смотреть сверху вниз, все Рок уровни на самом деле двумерны, что демонстрирует одно из ключевых ограничений Рок двигатель: комната за комнатой это невозможно. Это ограничение, однако, имеет положительную сторону: можно легко отобразить «режим карты», который представляет стены и положение игрока, как и на первом изображении справа.

Основные объекты

Базовый блок - это вершина, который представляет одну 2D-точку. Затем вершины (или «вершины», как они называются внутри) соединяются, образуя линии, известные как "linedefs". Каждое определение строки может иметь одну или две стороны, так называемые «боковые определения». Затем боковые определения группируются вместе, чтобы сформировать полигоны; они называются «секторами». Секторы представляют собой определенные области уровня.

Секторов

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

Sidedefs

Sidedefs используются для хранения стены текстуры; они полностью отделены от текстур пола и потолка. Каждый sidedef может иметь три текстуры; их называют средней, верхней и нижней текстурами. В односторонних линейных определениях для текстуры стены используется только средняя текстура. В двусторонних определениях строк ситуация более сложная. Нижняя и верхняя текстуры используются для заполнения промежутков, где соседние секторы имеют разную высоту пола и потолка: например, нижние текстуры используются для ступеней. У sidedefs также может быть средняя текстура, хотя у большинства этого нет; это используется для того, чтобы текстуры висели в воздухе. Например, когда видно, что прозрачная текстура полосы образует клетку, это пример средней текстуры на двустороннем linedef.

Разделение двоичного пространства

Рок использует систему, известную как разделение двоичного пространства (BSP).[7] Инструмент используется для предварительного создания данных BSP для уровня. Этот процесс может занять некоторое время для большого уровня. Именно из-за этого невозможно переместить стены в Рок; в то время как двери и лифты двигаются вверх и вниз, ни один из них никогда не двигается в сторону.

Уровень разделен на двоичное дерево: каждое место в дереве представляет собой «узел», который представляет определенную область уровня (с корневым узлом, представляющим весь уровень). На каждой ветви дерева есть разделительная линия, которая разделяет область узла на два подузла. В то же время разделительная линия делит определения строк на сегменты, называемые «сегменты».[8]

На листьях дерева выпуклые многоугольники, где дальнейшее деление уровня не требуется. Эти выпуклые многоугольники называются подсекторами (или «SSECTORS») и связаны с определенным сектором. Каждый подсектор имеет список связанных с ним сегментов.[7]

Система BSP сортирует подсекторы в правильном порядке для рендеринга. Алгоритм довольно простой:

  1. Начните с корневого узла.
  2. Рекурсивно нарисуйте дочерние узлы этого узла. Дочерний узел, ближайший к камере, сначала рисуется с помощью Алгоритм Scanline. Это можно найти, посмотрев, на какой стороне разделительной линии узла находится камера.
  3. Когда подсектор достигнут, нарисуйте его.[9]

Процесс завершен, когда весь столбец пикселей заполнен (т. Е. Больше не осталось пробелов). Такой порядок гарантирует, что время не будет использовано для рисования невидимых объектов, и в результате карты могут стать очень большими без каких-либо потерь скорости.

Рендеринг

Рисуем стены

Все стены в Рок рисуются вертикально; именно из-за этого невозможно правильно смотреть вверх и вниз. Можно выполнить форму просмотра вверх / вниз через "y-стрижка", и многие современные Рок исходные порты делают это, а также более поздние игры, использующие движок, такие как Еретик. По сути, это работает путем перемещения линии горизонта вверх и вниз по экрану, по сути, обеспечивая «окно» в более высокой видимой области. Перемещая окно вверх и вниз, можно создать иллюзию взгляда вверх и вниз. Однако это будет искажать вид по мере того, как игрок смотрит вверх и вниз.

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

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

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

Пол и потолок

Система для рисования полов и потолков («квартир») менее элегантна, чем для стен. Квартиры нарисованы с заливка -подобный алгоритм. Из-за этого иногда возможно, если использовать плохой конструктор BSP, чтобы получить «дыры», где пол или потолок спускаются до краев экрана. Это также причина того, что если игрок выходит за пределы уровня, используя чит noclip Полы и потолки будут казаться вытянутыми с уровня на пустое пространство.

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

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

Это приводит к одному из Рокклассические ограничения, которые долгое время раздражали многих картографов. Рок содержал статический лимит на количество висспланов; в случае превышения может произойти «переполнение виссплана», в результате чего игра выйдет в DOS с одним из двух сообщений: «Больше никаких висспланов!». или «перелив виссплана (128 и выше)». Самый простой способ вызвать ограничение виссплана - это большой рисунок пола в шахматном порядке; это создает большое количество висспланов.

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

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

Вещи (спрайты)

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

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

В то время как подсекторы гарантированно находятся в порядке, спрайты внутри них - нет. Рок хранит список рисуемых спрайтов («висспрайты») и сортирует список перед рендерингом. Далекие спрайты отрисовываются раньше близких. Это вызывает некоторое перерисовку, но обычно это незначительно.

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

Игры с использованием Рок двигатель

В Рок Движок получил наибольшую известность в результате использования классического шутера от первого лица Рок, и он использовался в нескольких других играх. Принято считать, что «Большая четверка» Рок двигательные игры Рок, Еретик, Hexen: Beyond Heretic, и Раздор: поиски печати.

Игры, построенные непосредственно на Рок двигатель
Игры на основе Рок или же Doom II код

Смотрите также

Примечания

Рекомендации

  1. ^ https://github.com/Olde-Skuul/doom3do/blob/master/LICENSE
  2. ^ Персонал (29 декабря 1997 г.). "Источник Doom II доступен". PC Gamer США. Архивировано из оригинал 18 февраля 1998 г.. Получено 20 ноября, 2019.
  3. ^ В Рок исходный код[постоянная мертвая ссылка ] - выпущен в 1997 году, сейчас под Стандартная общественная лицензия GNU с FTP-сайта Id Software
  4. ^ В Рок исходный код с 3ddownloads.com В архиве 24 февраля 2004 г. Wayback Machine - выпущен в 1997 году, сейчас под Стандартная общественная лицензия GNU
  5. ^ «id Tech 1 (концепция)». Гигантская бомба.
  6. ^ Щуйтема, Пол К. (август 1994 г.). "Светлая сторона судьбы". Компьютерный игровой мир. С. 140, 142.
  7. ^ а б Абраш, Майкл. "Трехмерный движок Quake: общая картина". Получено 22 августа 2012.
  8. ^ Аптед, Андрей. «СПЕЦИФИКАЦИЯ для GL-узлов». Получено 22 августа 2012.
  9. ^ Санглар, Фабьен. "Обзор кода движка Doom". Получено 23 августа 2012.

внешняя ссылка