3 декабря 2019 3.12.19 5 1985

Полигоны, свободная камера и MGS 5

+9

Написать эту небольшую заметку меня побудило видео на официальном YouTube канале StopGame.ru про, якобы, цитирую, «Свободная камера в MGS 5. Как работает игра за кадром?». Я не собираюсь проходить по всем ляпам данного ролика, про них достаточно написано в комментариях, а хочу остановиться на одном техническом моменте который, думаю, будет интересен читателям StopGame.ru. Речь о том, что в данном видео названо как Backface culling (на 2 мин 38 сек ролика).

Что мы видим на экране? Полупрозрачный вертолет. Если обратиться к Google за разъяснением, что же это за такой зверь: Backface culling? то получим ответ, что это метод скрытия полигонов для увеличения быстродействия. Позволю себе процитировать видео:

«…Разработчики применили метод Backface culling, т.е. движок не отображает те полигоны, которые не расположены непосредственно перед камерой. Иными словами, для игры не существует полигонов за пределами этой точки обзора…»

Но автор, видимо, не очень знаком с техническими деталями построения полигональных объектов для 3D в общем и игр в частности. Упоминается, что авторы игры применили метод Backface culling, хотя так говорить не корректно, так как он встроен в игровой движок и его осознанно не применяют, это внутренняя механика движка. А вот чтобы обойти эту особенность, уже нужно действовать осознанно. Это первое. Второе: Backface culling не имеет отношения к «…для игры не существует полигонов за пределами этой точки обзора…», это уже из области трассировки лучей и Z-culling’a (т.е. метода, основанного на перекрытии объекта другими). Backface culling относится только к обращенной стороне полигона. Но обо всем по порядку немного ниже.

А пока лирическое отступление. Если бы речь шла об автомобилях с ДВС, то вышеприведенная цитата звучала приблизительно так:
«Разработчики применили метод сгорания, т.е. поршни двигаются. Иными словами, шины позволяют колесам крутиться.»
Отступление окончено.

Теперь позволю себе немного забрести в дебри теории про полигоны и виртуальные камеры дабы, надеюсь, большинству стало понятно, в чем же там на самом деле суть?

Современные трехмерные игры строятся из трехмерных объектов (плюс освещение, текстуры, звуковое сопровождение и т.п., но сейчас не об этом). Трехмерные объекты, в свою очередь, строятся из «кирпичиков» — полигонов (плоскостей), обычно треугольных, т.е. у них есть три вершины и плоскость между ними. Почему треугольных? Потому, что через три точки можно провести только одну плоскость. Это упрощает расчеты и избавляет от многих артефактов (нет, не тех, что ищет обычно Лара Крофт, а от нежелательных эффектов на отрендеренном изображении). Хотя бывают полигоны и четырехугольные, пяти, и т.д., но игровые движки используют именно треугольные.

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

Поэтому математически полигон отдельно, текстура – отдельно. Это как мухи и котлеты – должны существовать порознь. И видеокарта сначала строит математическую модель из невидимых полигонов, затем накладывает текстуры, затем освещение и прочие спецэффекты.

Далее. Есть у полигона такое свойство как нормаль, или вектор, перпендикулярный плоскости полигона. Не буду вдаваться в подробности, но нужен он для накладывания текстур и просчета освещенности. Причем, так сказать по умолчанию, нормаль есть только у одной стороны этого нашего прозрачного листа бумаги с нулевой толщиной. На эту-то сторону и накладывается текстура. А вторая сторона… прозрачная, точнее, математически ее не существует.

Если в практически любой программе трехмерного моделирования, например 3ds Max’е, создать полигональный куб, наложить на него текстуру, а затем развернуть нормаль у полигонов одной из сторон, то эта сторона станет невидимой.

Думаю, с полигонами и текстурами более-менее понятно. Теперь о камере.

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

Итак, думаю, теперь мы знаем достаточно, чтобы сделать вывод о том, что же мы видим в случае с вертолетом? А видимы мы стандартную ситуацию для закрытого помещения, из которого игрока выпускать не собираются: смоделированы только внутренние стенки вертолета. Нормали у этих полигонов обращены вовнутрь. Если смотреть снаружи, ожидаемо, текстур не существует, поэтом вертолет кажется полупрозрачным. То же справедливо для помещений в которых игрока не пускают, только в этом случае нормали обращены наружу, а изнутри помещение прозрачно.
Как же поступают в тех случаях, когда игрока в помещение пускают? Все очень просто: в таких зданиях стены имеют два полигона обращенных нормалями в противоположные стороны. А в данном случае модель вертолета не имеет внешних полигонов, ведь это совершенно не нужно. Это напрасный труд тех, кто моделирует, накладывает UV-развертку, текстурирует. Это лишняя трата оперативной памяти. В конце концов, это лишняя трата процессорного времени на Z-culling, ведь на его просчет тоже необходимы какие-то, пусть и небольшие, ресурсы. А если математически чего-то нет, как текстуры на обратной стороне полигона, то на это ресурсы не тратятся вообще.

Надеюсь, вот теперь всем стало понятно: отчего вертолет выглядит полупрозрачным?

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

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

Небольшой постскриптум.

Думаю, заметка будет неполной, если не поговорить о коллизиях.

Как мы помним, полигон прозрачен и вообще как бы не существует. Как тогда не позволить игровому персонажу ходить сквозь стены? Трехмерные модели наделяют невидимым для игрока «силовым каркасом» — моделью коллизии (столкновения). Это трехмерная математическая структура, которая существует как бы отдельно от полигонов и текстур, она отвечает только за имитацию, скажем так, твердой поверхности. Визуально это выглядит как набор простых фигур «привязанных» к трехмерной полигональной модели. Ну, или как каркасная сетка, — все зависит от способа отображения в той или иной программе. Именно по этой математической модели из простых геометрических фигур, игровой движок и рассчитывает, от чего мяч должен отскочить и сквозь что игровой персонаж не должен пройти.

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

А мод на свободную камеру просто обходит этот механизм коллизий, что позволяет путешествовать «за текстуры».


Metal Gear Solid V: The Phantom Pain

Платформы
PC | PS3 | PS4 | PS5 | X360 | XONE | XBOXSX
Жанры
Дата выхода
1 сентября 2015
3K
4.1
2 048 оценок
Моя оценка

Лучшие комментарии

Благодаря этому блогу, я смог чуть лучше разобраться в технической части вопроса: как минимум понял, что есть коллизия и как работает полигон. Отдельное спасибо за то, что без переусложнённых определений, на доступном языке с понятными физическими аналогиями. Если продолжите писать по этой теме, буду рад ознакомиться.
Но посоветую достать изображения из под спойлеры — так блог смотрится живее, а стены текста наоборот — воспринимаются визуально плохо.
Спасибо за отзыв.
По поводу изображений обязательно учту при подготовке следующего материала. И под спойлеры спрячу только не ключевые. Я перед нажатием кнопки «опубликовать» думал над тем, чтобы отображать картинки сразу, но, учитывая, что они сделаны на скорую руку и, как по мне, не очень-то и смотрятся, то решил оставит их за спойлером.
Предлагаю к ознаКомлению!
Виноват, очепятался.
Читай также