{"id":4008,"url":"\/distributions\/4008\/click?bit=1&hash=3e0e24714242dbbafe0bc5f0070ccccc83480de788b38ffe56426b16d15d7a5e","title":"\u0423\u0437\u043d\u0430\u043b\u0438, \u0447\u0435\u0433\u043e \u0436\u0434\u0443\u0442 \u043e\u0442 \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0430 \u043b\u044e\u0434\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u0439","buttonText":"","imageUuid":"","isPaidAndBannersEnabled":false}

В двух словах об id Tech

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

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

Мне бы хотелось рассказать о начале становления игровых движков в сегодняшнем понимании этого слова. Само собой, речь пойдет о творениях id Software: Wolfenstein 3D engine и Doom engine aka id Tech 1. Ключевым программистом этих движков был Джон Кармак.

Джон Д. Кармак II
Соучередитель и совладелец id Software

Именно благодаря нему жанр 3D экшенов существует в том виде и на той стадии развития, на которой он сейчас находится. Серьезно, если расковырять практически любой современный 3D движок, то в нем, скорее всего, найдется строчка из кода Кармака, написанного для движков серии id Tech.

Quake engine, стоящий на вершине дерева, хоть формально и не входит в семейство id Tech, не сильно отличается от id Tech 2 (Quake 2) и берет часть технологий из id Tech 1 (Doom)

Перенесемся во времени и пространстве. На дворе 1992 год, США. У тебя нет никаких эрыксов, джитииксов, эртэиксов. Никакого 3D ускорителя, только 16-ти битный Intel 80286, 40 Мегабайт на жестком диске и 1.5 Мегабайта оперативы. Это ты еще гордиться должен, для домашнего компьютера этих лет вполне неплохо. Хоть настоящие 3D игры уже существуют, о них ты во-первых не знаешь, во-вторых, вместо какой-либо графики, там какие-то палки летают, в-третьих, они еще и лагать будут на твоем агрегате. Кароче, не надо оно тебе, лучше в Prince of Persia поиграть.

Ничего не понятно, да и не особо интересно

Примерно в это время, может чуть раньше, Джон Кармак загорелся идеей заделать 3D шутер. Ну, как я уже выше написал, честное 3D компьютер начала 90х потянуть не мог. Хорошо, если у него получится отрисовывать куб хотя бы пару раз в секунду, но, насколько я знаю, он отрисовывался все-таки раз в пару секунд. Кароче, прямой путь тут был не самым быстрым. Вернее не самым производительным. Кармак это понимал. Но понимал он также и то, что человеческий глаз достаточно легко обмануть. Существует множество оптических иллюзий. Компьютерное 3D тоже в общем-то является таковой. Просто хитрые комбинации трогонометрических функций, которые присваивают размерные коэффициенты плоским текстурам.

Узнав про raycasting (да, точно не raytracing) Джон Кармак достаточно быстро написал движок, использующий для рендера эту технологию. Суть raycasting’а состояла в том, что используя данные из двухмерного макета уровня, рисовалась его 3D версия. А может правильней сказать 2.5D версия? Никаких вершин, образующих полигны, ведь не было. В общем, я опишу то, как работает технология, а ты уж сам реши как это назвать.

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

С видео перед глазами гораздо проще понять, что я имею в виду

Кстати, шутером, который хотел создать Кармак был не Wolfenstein, а Hovertank. А вот следующий… тоже не вульф, а Catacomb 3-D. Вот следующий да, был уже Wolfenstein. Шутер про Бласковица получился настолько популярным, что именно его многие считают первым 3D шутером на ПК. Ну а ты, дорогой читатель, теперь вот знаешь чуть больше многих.

Если задуматься, то задаче обработки столкновений в играх уделяется достаточно мало внимания. А ведь между прочим, именно из-за неоптимального решения этой проблемы, у движка Wolfenstein 3D было столько ограничений. Джоном Кармаком было принято решение использовать уже реализованный raycasting для определения того, какие объекты проходимы для игрока, а какие нет. Нюанс в том, что обычно raycasting тратит на расчеты достаточно много времени, а компьютеру нужно успевать отрисовать хотя бы 24 кадра за секунду, чтобы картинка казалась плавной. В кончном итоге, скорость расчета удалось увеличить, но в жертву была принесена геометрия уровней. В Wolfenstein 3D стены на уровне выровнены по квадратной сетке. Т. е. если сторона квадрата в сетке 160 пикселей, то стена может быть шириной или 160 пикселей, или 320, или 480, в общем, кратной 160. Стена могла располагаться только вдоль линий сетки, т. е. ни о каких диагональных стенах речи не шло. Зато теперь движку достаточно посчитать положение точек пересечения линий сетки, а отрезок, их соединяющий, сделать непроходимым, если на нем расположена стена, или наоборот, оставить проходимым, если на нем ничего нет.

На этом скриншоте отлично видно кубики, из которых строились уровни

После успеха Wolfenstein 3D на ПК, основная часть команды занялась разработкой приквела. Но не Джон Кармак. Он в это время занимался доработкой движка для следующей большой игры компании. Речь, конечно, про Doom. Как раз в этот период в id Software поступил заказ на портирование Wolfenstein на SNES. В компании подумали-подумали, и оказалось, что это невозможно. Консоль была слишком слабой. Но если зайти на википедию, то можно увидеть, что игру все-таки портировали. Как же так? Кармак использовал метод разбиения пространства на выпуклые плоскости (Binary Space Partitioning), коротко — BSP.

Содержание скрыто
Показать

Да, ты все правильно понял. На технологию BSP наткнулись именно в поисках решения, способного ускорить работу Wolfenstein, а в Doom уже раскрывали ее потенциал

Что же такое BSP? А это, дружище, жесткий математический алгоритм. Но ты не спеши открывать форточку, духоты не будет. Я просто вкратце объяcню, что получается на выходе его работы и зачем он нужен.

Итак, мы имеем уровень. Этот уровень во время компиляции в редакторе разбивается на некоторые сектора, а затем эти сектора записываются в структуру, напоминающую дерево. Так и называется, BSP-дерево.

Во время игры, перед отрисовкой кадра, движок проходится по этому дереву и для каждого сектора считает, видим он или нет. Если сектор видим, то рисуется нужная текстура, если нет, то зачем тратить время на отрисовку? Кроме того, во время обхода определялось, с какой стороны сектора стоит игрок. Если игрок пытается перейти на другую сторону помеченного непроходимым сектора через, собственно, сам сектор, игра засчитывала столкновение и не пропускала его. Т.е. BSP теперь вместо raycasting’а занимался обработкой столкновений, и делал это значительно быстрее, что позволило увеличивать размеры комнат практически без снижения производительности. А еще он может обрабатывать уровни любой формы, поэтому карты в Doom теперь выглядят несравнимо более интересными, чем в Wolfenstein. Но raycasting никуда не ушел ни в порте Wolfenstein на SNES, ни в Doom, он по прежнему выполняет свою главную задачу — рисует объекты.

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

Содержание скрыто
Показать

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

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

Уже в Doom объект может состоять из нескольких текстур

Движок Doom, будучи эволюцией движка Wolfenstein 3D, все так же превращал 2d макет уровня в его (псевдо)объемную версию, но делал это в несколько раз круче. Лестницы и лифты придавали ощущение того, что игра оперирует третьим измерением, и я только могу предствить, как это срывало башню в 1993 году. Да, нельзя было создать комнату под комнатой, да потолок был всегда перпендикулярен стенам, но кого это волнует, когда после игр с видом сбоку тебе дают стать глазами думгая, который под звуки переживавшего расцвет металла без страха идет по адскому лабиринту и без сожаления уничтожает чертей, стоящих у него на пути?

Бесспорно, Doom провел жирную черту, разделяющую игры на те, которые вышли до него, и те, которые вышли после. Ну а Джон Кармак как минимум карандашиком уже вписал свое имя в историю, положив начало развитию игровых движков. Нестираемым маркером он это сделает спустя 2 года, выпустив Quake и совершив прорыв в уже настоящей 3D графике, но это уже совсем другая история, которую я, может быть, расскажу позже.

0
58 комментариев
Написать комментарий...
GoldSrcFreeman

Для тех, кто хочет самый подробный и не очень сложный разбор Дум, есть Game Engine Black Book: DOOM https://archive.org/details/gebbdoome
Написана книга настолько хорошо, что даже я понял, как работает BSP.

Ответить
Развернуть ветку
59IQ
>Джон Д. Кармак II

А есть первый Джон Кармак?

Ответить
Развернуть ветку
Burnoutman

Да, он сделан на id Tech I

Ответить
Развернуть ветку
Curio Sity

второй Джон Джон Кармак, а первый просто Джон Кармак...наверное

Ответить
Развернуть ветку
Xanathar
во-вторых, вместо какой-либо графики, там какие-то палки летают

Во-первых, была куча игр на чисто 3D движке FreeScape вроде Total Eclipse и Driller. Хорошие и интересные игры. Да и Элиту можно вспомнить.
Во-вторых, где Ultima Underworld, раз уже 1992?
В-третьих, гдр скиншоты Катакомб 3Д? Отличная же игра была.
А так плюс за техническую сторону.

Ответить
Развернуть ветку
svk

Вот именно. Тем более что в Ультиме, таки можно было "пройти по мосту, а потом под ним же проплыть".
Техническая сторона интересна, тоже плюсанул, однако любой желающий может, и давно уже (и с картинками) то же самое прочитать в сети.
В общем как всегда, поистине революционные вещи остаются незамеченными, а затаскивает только то, что хорошо зашло пиплу в тот же самый период времени...
забавно, мне 45, и я видел как всё начиналось, и куда в итоге скатилось

Ответить
Развернуть ветку
1 комментарий
Xander Grishchenko

Спасибо, хороший материал. Очень рекомендую по теме серию видосов Children of Doom о развитии жанра FPS https://youtube.com/playlist?list=PLvTOVWzS1f6-ptFCaXVnl41LZIc4x8Zmo

Ответить
Развернуть ветку
Ilya Sadchikov

Жирную черту провел не Doom, а Ultima Underworld, которая и вышла раньше и технически была более совершенной.

Ответить
Развернуть ветку
Армейский франт
Автор

Возможно, я в статье несправедливо обошёл стороной ультиму, согласен. Есть даже мнение, что про raycasting Кармак узнал именно со слов знакомого, который рассказал ему про ультиму. Но я не зря в начале статьи написал про то, что движки развивались пытаясь найти баланс между графикой и производительностью. Заслуга Кармака состоит в том, что он вроде как в своё время нащупал его и предложил игрокам динамичный fps шутер - Wolfenstein. Конечно, в нем было простенькое освещение, не было наклонных поверхностей, зато был шустрый и резкий на то время экшен. Ну а в Doom Кармак вроде как догнал ультиму в техническом плане. Вверх-вниз разве что нельзя было смотреть. Но это кстати потом фанаты поправили, вроде через смещение линии горизонта.

Ответить
Развернуть ветку
6 комментариев
Frosty

Ultim-ы же все чисто 2д с фокусами с перспективой. Хотя если подумать Дум тоже псевдо 3д.

Ответить
Развернуть ветку
4 комментария
Vert

Doom — круто

Ответить
Развернуть ветку
Zubius

Автор игр как раз рассказывает об этом в подкасте

https://lexfridman.com/john-carmack/

Ответить
Развернуть ветку
Ballmer

На SNES помимо DOOM и Wolfenstein 3d выходила Super 3D Noah's Ark (на движке Wolfenstein 3D).
Она в стиме есть, основана на Ecwolf. Довольно забавная игра, порт хороший, ачивки, контроллер и тд.
https://ru.m.wikipedia.org/wiki/Super_3D_Noah%E2%80%99s_Ark

Ответить
Развернуть ветку
Андрей Петров
Кстати, шутером, который хотел создать Кармак был не Wolfenstein, а Catacomb 3-D. А вот следующий… тоже не вульф, а Hovertank.

Hovertank вышла на полгода раньше, чем Catacomb 3-D — думаю, даже по визуальной части это видно.

Ответить
Развернуть ветку
Армейский франт
Автор

Точно, поправлю. Спасибо

Ответить
Развернуть ветку
Аккаунт удален

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

Ответить
Развернуть ветку
Artem Mordanov

Очень поверхностно(

Ответить
Развернуть ветку
Армейский франт
Автор

Есть такое. Но первые варианты статьи были непонятны другим :/ Когда(если) про кваку буду писать, попробую тогда пойти глубже и расписать подробней

Ответить
Развернуть ветку
Tony

Хватит Дум называть псевдотрехмерной или 2.5d! Это именно трехмерная игра, не путайте людей.

Ответить
Развернуть ветку
Ilya Sadchikov

Трехмерная игра это Terminator: Future Shock, а все что до него было трехмерным не является.

Ответить
Развернуть ветку
1 комментарий
Xanathar

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

Ответить
Развернуть ветку
Станислав Витинский

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

Ответить
Развернуть ветку
Xanathar
можно было выжать тогда из двойки

Кстати да, на двушке с 1мб памяти Вульф3Д пусть не летал, окно я немного уменьшал, но игрался шустро. На трешке летал.

Ответить
Развернуть ветку
14 комментариев
Xanathar

Aardwolf. Я это честно находил. Рисовал карту на нескольких склеенных листах.

Ответить
Развернуть ветку
1 комментарий
Tricky Cacausian

Спасибо дружище. С меня лайк.

Ответить
Развернуть ветку
Zubius

deleted

Ответить
Развернуть ветку
TVEYE

Ебать там два слова

Ответить
Развернуть ветку
Евгений Рязанцев

Хорошо! Давай дальше!)

Ответить
Развернуть ветку
Александр

Нормас, мне понравилось!
Даже форточку не пришлось открывать

Ответить
Развернуть ветку
Аккаунт удален

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

Ответить
Развернуть ветку
Армейский франт

Ну, не основывался. Просто шёл сразу за ним

Ответить
Развернуть ветку
Читать все 58 комментариев
null