Каталог статей

Главная » Статьи » Создание игр

Обзор технологий, используемых в играх
Демосцена

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

 
Отображение игрового мира

Вначале был ASCII: экраны первых компьютеров работали в текстовом режиме и могли отображать только символы в сетке nxm. Памяти было мало, программировать было сложно, программы хранились на перфокартах, перфолентах, но, несмотря на трудности, люди делали первые игры. Можно было сделать стратегию с картой и сменой характеристик (Star Trek), текстовые адвентюры (о них подробно расскажу ниже), аркады (например, Mars, где установка расстреливает тарелки, пытаясь защитить людей от снарядов инопланетян), ролевые игры (где персонаж, представленный символом "улыбающееся лицо", перемещался по миру, где объекты заменялись подходящими символами и набирал опыт в текстовых боях. Следующая волна компьютеров была уже не с такими ограничениями - появлялась растровая графика, постепенно повышалось количество возможных цветов, вводились ограничения для экономии памяти (один из оригинальных способов реализован на Спектруме), не были исключением и игровые приставки. Ну а потом - IBM PC, Macintosh, Amiga - 256 цветов, Hi Color, True Color, 320x200, 640x480, 800x600....
Много прекрасных игр было реализовано в разрешении 320х200х256, но сейчас 32 (или в крайнем случае - 16) - битный цвет - стандарт, поэтому не будем разбирать замысловатые технологии работы с 256-цветной палитрой (как, например, в DOOM - реализация затемнения и прозрачности объектов).
Самый простой вариант графического отображения (исключая текстовый) - это блочный. Игровое поле представляет собой nxm квадратных (редко бывает - прямоугольных) блоков, каждый из которых имеет свои характеристики. Обычно, это номер изображения, флаг проходимости / непроходимости и несколько специфических. Поле может умещаться на экране (так часто делают в головоломках и простых аркадах) а может быть и больше, тогда возможен скроллинг - попиксельный или поблочный. Персонажи (объекты) могут перемещаться только по клеткам, что упрощает программу (как в походовых стратегиях - например, Civilization, Jagged Alliance, стратегиях в реальном времени - Dune 2 или японских ролевиках) или свободно. Еще один красивый прием - объекты, которые могут накладываться друг друга. Это может достигаться отображением поля "сверху вниз" - ландшафта вместе с мобильными объектами; сортировкой мобильных и стационарных объектов такого рода, в зависимости от их высоты; созданием трех слоев отображения - верхнего, нижнего и промежуточного.
Изометрический (UFO, Civilization 2 / 3) и гексагональный (из шестиугольников - Fallout, Arcanum (выглядят, кстати, как изометрия), Nectaris, Panzer General) отличаются только структурой, но принцип остается практически неизменным. Существуют игры, где блочность не так ярко выражена (трудно определить структуру поля), например аркады на SEGA. В игре Worms один блок соответствует одному пикселу - для того, чтобы можно было взрывать и дырявить ландшафт. Есть игры, где все игровое поле - растровый (Postal) или векторный (Another World) рисунок.
В старых гоночных имитаторах трасса отображалась, как набор масштабируемых (возможно, заранее) горизонтальных линий. Так можно было создавать повороты, холмы, дополняли картину масштабируемые спрайты машин соперников и объектов окружения.
Полигональные трехмерные движки (где объекты состоят из многоугольников) появились, пожалуй, раньше всего. Вначале это были "проволочные каркасы", потом с залитые многоугольниками, отсортированными по степени удаления от камеры. До появления полностью текстурированных полигональных движков (Quake) прошло достаточно много времени, т. к. для этого требовались мощные компьютеры, но текстуры уже иногда использовались (иногда без перспективной коррекции).
В это время, пышным цветом расцвели менее притязательные к ресурсам трехмерные движки: Wolfenstein - блочный движок со спрайтами (заметьте - текстурированы только стены - все те же масштабируемые полосы, теперь вертикальные, с одномерным z-буффером. Doom был следующим (гигантским) шагом в этом направлении - поле уже стало векторным (но все еще двумерным), текстурированные (точно так же, как и стены, но с поворотом текстуры) сегменты пола на разных высотах освещались уже по-разному. Серия игр на движке Duke Nukem завершила эту стадию - были добавлены все возможные для такого движка эффекты, в т. ч. наклонные поверхности, ложная многоэтажность за счет использования "телепортационных окон", ведущих в другую область, зеркала. Но это все уже в прошлом.
Еще одна интересная концепция - отображение трехмерных объектов на заранее отрендеренном фоне. В игровом мире как бы устанавливались фиксированные камеры, которые переключались, по мере того, как главный герой переходил в другие области. Вспомните знаменитый аркадно-квестовый сериал "Alone In The Dark", триллер "Resident Evil", квест "Grim Fandango". При этом, существенно улучшалась графика и снижались системные требования. Недостатком было некоторое несоответствие между объектами фона и мобильными, реально трехмерными объектами.
Дизайнеры из Andrew Spencer Studios пошли еще дальше, создав уникальный и великолепный мир Ecstatica. Использовав технологию отображения эллипсоидов в трехмерном пространстве и построив мир из миллионов таких же эллипсоидов, они добились того, что персонажи гармонично вписались в отрендеренный фон.
Сейчас стандарт (благо, мощности бытовых компьютеров теперь позволяют), использующийся в подавляющем большинстве игр - технологии DirectX и OpenGL. Трехмерный движок - полигональный с огромных набором возможностей и спецэффектов.
 
Базовые элементы и эффекты

Отсечение невидимых поверхностей

Этот способ очень древний, но используется и по сей день. Для подавляющего большинства граней, нужно отображать только одну сторону (внешнюю сторону объекта, в который входит грань). Поэтому, если грань повернута невидимой стороной к камере, отображать ее не нужно. Реализация проста и оригинальна - вершины грани пронумеровываются против часовой стрелки, если смотреть на видимую сторону. В таком случае, если смотреть в направлении невидимой стороны, они будут пронумерованы по часовой стрелке. Такая же особенность проявляется для проекции граней на экран. Проверяется порядок нумерации довольно просто с помощью формулы для трех вершин.
 
Z-буферизация

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

Самый простой способ задания прозрачности называется masking. Один из цветов рисунка помечается, как "пустой" - пиксели этого цвета игнорируются, не затирая фон. Более комплексная прозрачность (смешивание цветов с определенным коэффициэнтом) может задаваться для всего объекта (параметр - альфа), второй вариант - наличие дополнительного слоя для растрового рисунка (256 градаций серого) - альфа-канала. Чем цвет пиксела слоя ближе к черному, тем более прозрачен соответствующий пиксел (белый - пискел рисунка полностью затирает фон, серый - цвета смешиваются на равных условиях, черный - фон не изменяется). Есть одна деталь: т. к. даже полупрозрачные пикселы записываются в Z-буфер, то если рисовать объект за прозрачной гранью, то он не будет отображаться на экране (т. к. имеющиеся значения Z-буфера меньше), поэтому полупрозрачные объекты отображаются в последнюю очередь и сортируются по степени удаления от камеры, начиная от самого дальнего.
 
Спрайты, маска

Спрайт - это просто двумерный рисунок, который выводится на экран в произвольной позиции (в отличии от фиксированных позиций блоков фона). Это один из основных элементов игр. Так, прямоугольная картинка превращается в фигуру произвольной формы (например, человека). В 2D-играх, обычно, с помощью спрайтов изображают движущиеся объекты - персонажей, врагов, всякие мостики. Также, фон может состоять из блочной основы с наложенной на нее спрайтами, они могут быть наложены и на передний фон, тогда мобиильные объекты будут красиво заслоняться деревьями, колоннами и т. д. 3D-проекция открыла для спрайтов массу вакансий. Раньше, для экономии ресурсов, все мало-мальски сложные объекты делали спрайтами (Wolfenstein, Doom, Duke Nukem). Если статитческие объекты (бочки, мебель, лампы, трупы) обычно всегда выглядели одинаково (вспомните, как трупы всегда лежали ногами вперед), то движущиеся (например, враги) имели фазы поворота и анимации. Для грубого, но пристойно выглядящего монстра, обходились 8 фазами поворота (кстати, в двумерных играх с видом сверху тоже используются фазы поворота для юнитов, напр в Казаках было аж 64 фазы для каждого). Сейчас спрайты чаще всего используются для световых пятен, брызг и других мелких частиц.
 
Фон

Задний фон в 2D играх - это, обычно, растровая картинка. Она может быть размером с экран (тогда через окна помещений и открытое пространство будет виден застывший пейзаж). Использование статичного заднего фона уже добавляет игре иллюзию трехмерности, а если фонов несколько, они разной величины (больше, чем экран) и двигаются с разными скоростями, то эффект просто потрясающий. В трехмерных играх тоже может быть статический или динамический (в таком случае, он зацикливается как текстура и сдвигается при повороте камеры) растровый фон. Теперь часто для фона используют сферические и кубические объекты: камера, как бы находится внутри куба или сферы, на внутренней стороне которой нарисован фон - ландшафт, небо; при движении камеры, движется и объект, который рисуется первым; создается иллюзия перспективы.
 
Частицы

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

Декалами называются изображения, накладываемые на уже существующий объект. В Duke Nukem на стенах оставались брызги крови и дырки от пуль, на полу - отпечатки ботинок. В Max Payne если декал выходил за пределы одной грани, он частично отображался на другой (до сих пор помню окровавленный унитаз). Для большего реализма использовались декалы с альфа-каналом. В FarCry пошли еще дальше - отслеживается вся траектория полета пули, она проходит навылет и может оставить "траншею" на теле. Обычно, для декала создается полупрозрачный полигон, параллельный поверхности и немного отстоящий от нее. Это часто приводит к "борьбе полигонов", когда пикселы полигона поверхности проникают сквозь декал (из-за недостаточной точности z-буфера). Реже (это более ресурсозатратно, хотя и корректно) на объект накладывается дополнительная текстура для декалов (или для каждого объекта создается своя, а затем изменяется).
 
Воксели

Воксели - это маленькие квадраты (реже - круги) разного цвета, скопление которых образовывает объект или эффект. По сути, это то же самое, что и частицы, но примитивные и их количество может быть на несколько порядков больше без существенного снижения скорости. Вокели масштабируются в зависимости от расстояния до камеры. С помощью вокселей можно делать детальные трехмерные объекты, создавая трехмерный массив (как некоторые объекты в Duke Nukem), эффекты (кровь, хвост ракеты, дробь в Quake), качественные ландшафты (Delta Force). Однако, сейчас эта технология применяется очень редко, а чтобы использовать ее в Blitz придется писать библиотеки или медленно работающие процедуры.
 
Мультитекстурирование

Мультитекстурирование - прямой способ смешения текстур на одной грани. Ранее эту технологию пытались эмулировать, делая слоеный "бутерброд" из полупрозрачных граней. Проблема в том, что если расстояние между гранями слишком маленькое, на дальних расстояниях проявляется эффект "борьбы полигонов". Если слишком большое - при близком рассмотрении можно заметить нестыковку. Текстуры смешиваются по порядку - первая со второй, результат с трейтьей, этот результат - с четвертой и т. д. (обычно, используют максимум 3 слоя). Способы смешения - прозрачность, сложение (для каждого канала берется максимальное значение), умножение (берется минимальное значение). Мультитекстурирование может быть использоваться так: основной слой - цикличная текстура, задающая покрытие объекта (камень, дерево и т. д.), больший по масштабу слой затенения, определяющий освещение объекта и цикличная микротектстура, задающая фактуру объекта.
 
Карта окружения

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

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

Старая технология, используемая и по сей день. Суть заключается в том, что для каждой текстуры создается набор текстур - уменьшенных (в 2, 4, 8 и т. д раз) копий исходной. При этом используется фильтрация для корректного отображения. Поэтому, в зависимости от удаления пиксела полигона, его цвет берется из соответствующей текстуры набора, что позволяет избавиться от "зернистости" далеких объектов.
 
Адаптивная деградация

Адаптивная деградация - способ, позволяющий существенно повысить производительность за счет упрощения объектов, по мере их удаления от камеры. Для примера - далеко стоящий человек, высота которого несколько пикселов не нуждается в детальной прорисовки структуры лица или рук. Для такой модели вполне достаточно коробкоподобных конечностей и головы, в сумме - несколько десятков полигонов или вообще спрайта. Разницу заметит только эксперт, если присмотрится. В этом направлении - непаханное поле нереализованных возможностей. Некоторые объекты вообще появляются только вблизи главного героя (растительность в Serious Sam 2, Far Cry). Пока способы адаптивной деградации можно разбить на три категории: скачкообразная (когда более детализированная фигура мнгновенно сменяется менее детализированной) - Drakkan, морфинг (одна фаза постепенно, с помощью перемещения вершин, переходит в другую) и альфа-блендинг (старая фигура, становясь все более прозрачной, исчезает, новая проявляется) - GTA: Vice City. В Blitz адаптивная деградация используется в отображении ландшафта (Terrain), причем есть возможность переключения между скачкообразной и морфингом. Для больших ландшафтов используются методы динамической детализации, такие, как построение QUAD-деревьев (далеко расположенные треугольники ландшафта объединяются в один).
 
Сокрытие невидимых объектов

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

Это буфер, где для каждого пиксела экрана задается флаг, который определяет, отображается пиксел на экране или нет. Это, грубо говоря, более продвинутая версия "Masking" с возможностью обрезать слой (в т. ч. отрендеренный экранный буфер) на основе определенного алгоритма. Формирование буфера может осуществляться также в процессе рендеринга.
 
Шейдеры

Реально, мало кто представляет себе, что такое шейдеры. На самом деле шейдер - это набор инструкций, написанных на встроенном языке, которые определяют, в какой цвет красить определенный пиксел полигона или определяют свойства вершины на основе входных параметров (координаты пиксела/вершины, нормаль, позиция на текстуре). К сожалению, пока в Blitz3D шейдеры не реализованы, хотя это очень мощный инструмент, позволяющий создавать графические эффекты с реалистичностью на порядок выше.

Фильтрация

После рендеринга можно еще поработать над изображением: сгладить острые углы, наложить сверху изображение, чтобы не бросалась в глаза идеальная правильность форм (как в Deus Ex - накладывается слой, создающий что-то типа диффузии). Широко распространены эффекты черно-белой низкокачествнной кинопленки с дефектами и камеры низкого качества (дергающееся изображение, полосы видеошума) Изображение объектов и явлений

Огонь и дым

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

Вода

Классический вариант - поверхность, пересекаемая неровностями ландшафта (в старину - просто полигон). Он может быть полупрозрачным, чтобы было видно дно или просто текстурой (обычно, анимируемой - водовороты или течения). Позже стали накладывать еще и зеркальную поверхность, чтобы надземные объекты отражались поверхностью. В FarCry к тому же добавлена рябь, в итоге вода выглядит потрясающе. Водопады могут быть отображены аналогичным способом и с добавлением частиц (для создания всплесков у поверхности водопада), частицы могут формировать сам водопад. Под водой, обычно, меняется цветовая гамма (увеличение интенсивности сине-голубого цвета), на дне может быть установлена динамичная затеняющая текстура (тени от ряби на поверхности). Кстати, при наложении такой такой же текстуры на подводные объекты можно достичь неплохого визуального эффекта. Дополнительные частицы - обитатели подводного мира, пузырьки воздуха, кровавые потоки от плавающих тел. При столкновении объектов с поверхностью - рябь на поверхности воды, всплески с помощью частиц. В игре "Curse: The Eye Of Isis" сделаны объемные волны от перемещения героя, когда он по колено в воде (водная поверхность разбивается на клетки).

Туман

Это довлольно легко реализуемый эффект, поэтому ипользуется тоже давно (в основном, для ограничения видимого пространства и, соответственно, повышения производительности). Есть несколько параметров: конечный цвет перехода (обычно, белый, для темноты - черный), дистанция, на которой окружающая обстановка начинает затуманиваться и дистанция, на которой уже ничего не видно. Локальные виды тумана (например, реальные облака в авиаимитаторах) создаются, обычно, полупрозрачными спрайтами.

Зеркала

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

Стекла

Обычно - полупрозрачные поверхности (иногда - без текстур). Некоторые разбиваются на осколки (частицы). Стекла бывают цветными - тогда пространство за ними приобретает тот или иной оттенок.

Ландшафт

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

Взрывы

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

Мусор

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

Освещение

Гамма

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

Затенение

Плоское затенение сейчас редко используется (в основном, только для плоских поверхностей, таких как крышка стола) - вся грань затеняется однотонно. Затенение по Гуро выглядит более впечатляюще - яркость интерполируется по треугольнику в зависимости от вычисленной яркости для его вершин, получается плавный переход. Затенение по Фонгу более медленное, но позволяет получить красивые блики (в Blitz не используется).

Направленный свет

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

Точечный источник

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

Карты освещения

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

Проекция тени на объект

Самый примитив - отрисовка "теневого пятна" (старые аркады, Mario64, Мах Payne), во многих играх это делается, чтобы игрок мог определить, куда приземлится ведомый персонаж, подпрыгнув. Хотя, в Mortal Combat и Age of Empires сделали лучше - использовали для теней сами спрайты. В более Hi-Tec-играх более развитые технологии, например в Blade of Darkness (IMO, самые реалистичные тени - там) - полигональные тени (то есть, каждый световой источник (я не знаю, как там в действительности, просто предположение) освещает какую-то трехмерную полигональную область. Часть полигонов может быть полностью затенена, полностью освещена или частично освещена / частично затенена - в этом случае полигон разбивается на части. Выглядит очень реалистично (особенно, когда бежишь по подземелью с факелом и на стену отбрасывается твоя гигантская тень), но есть недостатки - при данном (весьма непростом) алгоритме, начинаются проблемы с несколькими источниками света и нет дисперсивной грани между тенью и светом. При использовании растровых затенителей (растровых текстур или декалов) приходится вводить ограничения (для того, чтобы натянуть на весь уровень и объекты детализированные растровые текстуры, потребуется слишком много ресурсов): например, тени делают только для небольших мобильных объектов, как то персонажей (особенно, главного героя), ящики и т. д. При этом, тень генерируется в процессе игры и накладывается на определенный объект (например, ландшафт, или стены). Детализированные отдельные объекты, обычно пропускаются (наверняка, видели тень, которая проходит, например, под мусорным баком). С использованием шейдеров, тени стало возможным накладывать корректно на все объекты и с дисперсией (Doom, Far Cry, Silent Hill 4). Особенно великолепно смотрятся тени на самом персонаже.

Блики

В случае с классическим затенением по Гуро, меняется градиент: от стандартного плавного перехода от черного к белому до таког же перехода, только с присоединенным полностью белым промежутком. Другими словами, теперь полная яркость задается не для вершины с нормалью, противоположно направленной световому вектору, а для части нормалей, отклоняющихся от вектора максимального освещения в определенных пределах. Соответственно, если освещаемый объект достаточно детализирован, на нем появляется световой блик - пятно максимальной яркости. Очень хорошо смотрятся блики, сделанные с помощью карты окружения. Также, неплохо было бы использовать затенение по Фонгу, но оно редко где поддерживается. Зато теперь идеальный вариант (если есть возможность) - написать соответствующий шейдер.

Звук и музыка

Звуки вносят солидный вклад в дело оживления виртуального мира. Если раньше достаточно было FM-овских бульканий, то теперь стандарт - цифровой звук 44000kHz, 16бит (впрочем, для разных звуков можно подобрать разное качество - для шумов, например, низкое, для голоса - среднее). Широко используются mp3 и ogg (хороша, потому что бесплатна) коммпрессии. Наибольший объем звуковой информации, как правило, занимает речь - диалоги, "мысли вслух", подслушанные разговоры, теле- и радиопередачи, реакция врагов (гневные возгласы, издевки, бахвальство, вопли о помощи). Очень здорово, когда для каждого события предусмотренно несколько вариантов звуков.
Midi и mod-музыка уже устарели (однако, в том же Deus Ex mod-музыка - на 5 баллов), поэтому, в основном, используется компрессированная цифровая или CD. Красивый прием - изменение музыки при изменении игровой ситуации (к примеру, спокойная мелодия, когда игрок в безопасности и напряженная - когда его заметили или атакуют), он еще в Dune 2 на Сеге использовался. Еще используется "эмбиент" - шумы, дополняющие атмосферу места.

Коллизия

Коллизия - это столкновение объектов.

Сфера (круг)

Самый простой вариант коллизии: определяется растояние между центрами по формуле, если оно меньше или равно сумме радиусов - объекты столкнулись. С определением действий сложнее: в продвинутых движках учитывается скорость и направление (например, в бильярде это необходимо), а также масса. В трехмерных играх раньше тоже были подобные упрощения (Doom, Duke Nukem), но сейчас это слишком примитивно.

Параллелепипед (прямоугольник)

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

Коллизия составных объектов

Когда объект состоит из набора примитивов, получается гораздо более реалистичная коллизия. Причем, можно добиться очень даже неплохого качества, используя минимум примитивов даже для анимированного объекта. Стремление к такому упрощению можно заметить - обратите внимание на кубообразныые головы некоторых моделей в 3D-боевиках. При использовании таких объектов, физичекая модель может еще больше усложниться (что, впрочем, окупается).

Полигональная (пиксельная)

В двумерных играх пиксельная коллизия используется уже давно (она медленнее, зато потрясно выглядит), а в трехмерных полигональная используется нечасто. Сложность и медленность физики и алгоритмов определения коллизии таких объектов крайне высока, поэтому объекты стремтся упростить до примитивных (например, в Max payne 2, для стула, у которого есть четыре ножки коллизионный слой представляет собой две призмы).

Лучевая (или для отрезка)

Обычно, используется для очень скоростных объектов - пуль и фотонов (в лазерных лучах). Сразу определяется объект столкновения (или отсутствие столкновения). Пример - дробовик, пистолет и электрошок в Quake.

Коллизионный слой (пространство)

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



Источник: http://BlitzEtCetera.Org
Категория: Создание игр | Добавил: blitz3d (28.11.2007) | Автор: Матвей Меркулов W
Просмотров: 6764 | Рейтинг: 5.0/4
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Категории раздела
Создание игр [8]
Работа с Сетью [1]
Работа с Сетью в Blitz3D Протоколы TCP, FTP, интернет-сёрфинг и пр.
Физические движки [3]
работа с физикой в Blitz3d
Форма входа

Наш опрос
Какие Вы пробовали новые средства разработок?
Всего ответов: 138
Поиск
Статистика


Онлайн всего: 1
Гостей: 1
Пользователей: 0
Друзья сайта
  • Все об умных часах и фитнес-браслетах
  • Все о поездах и железных дорогах!
  • Aндроид-клуб
  • Автоистория СССР
  • Блог о wordpress
  • Ноты для фортепиано

  • WIFI DIRECT

    все для wordpress



    умные часы Swatch
    умные очки Sony
    умные часы Fitbit Surge