Часто задаваемые вопросы

Автор clearing, 25 января 2010 14:00:20

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Chuzhoi

Вкратце, суть такова: порталы - это специальные плоскости, с помощью которых карта разбивается на зоны видимости (видимо, их Longshad и назвал ячейками). Есть движки, в которых порталы ставятся автоматически с помощью специальной команды в редакторе (Dark Engine, ранние Квейки), но многие движки требуют ручной установки порталов (например, Doom 3, TDS).

Обычная практика - ставить порталы в оконные/дверные проемы (в случае интерьеров), в этом случае каждая комната становится отдельной зоной видимости.

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

Соседняя зона, в свою очередь, может иметь порталы в более отдаленные зоны. Если такой дальний портал не просматривается сквозь ближний портал, то зона, находящаяся за ним, просто считается невидимой (вместе со всем содержимым) и движок просто не тратит ресурсы на ее отображение. Равно как и на остальные зоны, находящиеся еще дальше.

Если же более дальний портал попадает в ближний - то зона, находящаяся за ним, считается видимой и расчет для нее повторяется так же, как и для ближней зоны. И так далее. Расчет рекурсивен.

Все это можно проиллюстрировать картинками (взяты отсюда). Горящая лампочка означает, что зона считается видимой:







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

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

Самый большой геморрой - это ставить порталы на открытом пространстве - город, горы, природа и т. д. Если вообще возможно - какие порталы могут быть, например, в леcу?

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

А вот как выглядят порталы в Doom 3.

Виден только ближайший портал (зеленый) и зона за ним, следующий портал (красный) не виден:





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





Подвинемся еще - появляется еще одна зона и еще 2 портала. FPS еще ниже:





Вот такова, вкратце, суть порталов.

Chuzhoi

ЦитироватьВ Thief есть консольная команда, позволяющая увидеть зоны видимости (каждая зона отображается своим цветом). Порталы при этом не отображаются, но подразумевается, что они находятся между зонами. Команду, к сожалению, не помню (могу посмотреть).
В общем, по-быстрому команду обнаружить не удалось. Но, похоже, искать надо по слову cells (видимо, зоны видимости действительно называются в Dark Engine ячейками) или portal. Например, команда show_cells показывает что-то вроде разбиения на зоны (черными линиями).

LongShad

Chuzhoi
К посл. 2-м скриншотам. В DromEd есть решение такой проблемы, у дверей вроде есть такой пункт как Block Vision. ЕМНИП, двери еще в свойствах показывают 2 ячейки, на границе к-х находятся, а этот пункт заставляет движок "закрывать" портал когда закрываешь дверь. И действительно если при Block Vision = True дверь закрыта и снизу у двери есть щель, то через эту щель видно темноту.

Чужой что-то пытался объяснить про порталы целых 3 абзаца... Проще говоря - движок рендерит только те ячейки, порталы к-х видны камере в данный момент.
Не хочу приставать, но мне кажется, что 3-ий белый рисунок - неправильный. 2-ой портал не виден, след-но рендерить 3-ю ячейку никчему. В ДаркМоде может так и есть, не знаком.

DonSleza4e

В DromEd сделан дом с начинкой
Потребовалось сделать его зеркальную копию
Есть идеи как это просто и безболезненно делать? (все вместе сразу)  :embarassed:

Chuzhoi

LongShad
ЦитироватьК посл. 2-м скриншотам. В DromEd есть решение такой проблемы, у дверей вроде есть такой пункт как Block Vision.
В TDM двери при закрывании автоматически отключают порталы. Поэтому, когда я делал скриншоты, дверь пришлось открыть.

ЦитироватьЧужой что-то пытался объяснить про порталы целых 3 абзаца... Проще говоря - движок рендерит только те ячейки, порталы к-х видны камере в данный момент.
Это очень упрощенное описание, не объясняющее, например, как рассчитывается видимость дальних порталов.

ЦитироватьНе хочу приставать, но мне кажется, что 3-ий белый рисунок - неправильный. 2-ой портал не виден, след-но рендерить 3-ю ячейку никчему.
Я же специально пояснил, что на стены движку наплевать. Дальний портал виден сквозь ближний портал, даже если от игрока он закрыт стеной.

Zontik

#275
Chuzhoi
Это команда show_cell. Вводится в игровом режиме. Но... я не понимаю, о каких зонах видимости идет речь.
Вообще описание оставило у меня двойственное впечатление. Вроде бы все ясно. Но не понимаю, как приложить эти знания к DromEd'у. Ведь, судя по всему, единственные порталы, которые там существуют - это двери.
Но есть еще стены. Которые в DromEd автоматически отключают видимость (а точнее - рендеринг) всего, что за ними. Это и имелось в виду, когда утверждалось, что DromEd расставляет порталы автоматически?
И в этой связи я совершенно не понимаю, как увязать две вещи: зоны видимости и эти мультяшные стены из разноцветных треугольников, включаемые по команде show_cell. Эта команда позволяет визуально оценить количество полигонов в кадре (например, насколько их стало больше после прорезания в глухой стене отверстия). Но что касается невидимых зон - их-то увидеть все равно никак невозможно. И впервые слышу, что в Thief есть зоны видимости. По мне, так зон всего две: то, что попадает в камеру и не отгорожено порталами (то есть стенами или дверями), и то, что не видно.
В общем, я определенно не понимаю чего-то глобального. Причем недавно получил этому отдельное подтверждение. В одной из точек строящегося города при виде с балкона в объектив попадало слишком много полигонов. Я воздвиг здание, перекрывающее вид на отдаленные крыши. После чего начался полтергейст: при рассматривании закрывающей чуть ли не весь экран крыши число полигонов скачкообразно менялось в определенных точках, так, словно в крыше где-то зияла огромная дыра. Причем количество это быстро становилось практически таким же, как и без здания вообще.
Я немного увеличил высоту стен. Внешне практически ничего не изменилось. Но дыра в крыше каким-то волшебным образом вдруг заросла, и количество полигонов нормализовалось.
Может, это и есть один из случаев ошибочного автоматического  НЕвыставления портала?
DonSleza4e
Боюсь, что никак. То есть тупое копирование по кусочкам. Просто в нем нет функции зеркального отображения. Просто скопировать можно, а отобразить - никак.
Причем основные засады (если речь идет о зеркале) при ручном копировании подстерегают в асимметричных текстурах (например, шахматная кафельная плитка) и движущихся объектах (рубильники, крышки унитазов, двери). Ну и уж совсем никак нельзя позаботиться об объектах, создаваемых в ходе игры. Например, если игрок кинет перед собой свиток или ненужный ключ, или чье-то тело - его отразить невозможно.
Дайте глазам отдохнуть! Тёмное место

LongShad

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

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

Zontik

#277
Цитироватьсоздание красивых больших уровней так, чтобы не тормозили.
По-моему, вполне достойная цель.
Ну и нельзя не заметить, что ставить здание там, где оно не совсем нужно, просто для того, чтобы игра в этом месте не вылетала - метод хоть и действенный, но порочный. Понимание механизма помогло бы избежать таких ситуаций.
Я до сегодняшнего дня был твердо уверен, что рендерятся (и считаются) строго те полигоны, любая часть которых попадает на экран. То есть если вершина башни торчит над крепостной стеной и при этом величиной с муху, но доводит движок до истерики - достаточно ее чуть-чуть укоротить, чтобы не высовывалась.
Теперь пошли какие-то ребра графа Калиостро. Какой формы эти ячейки? Какая часть ребра должна попасть в камеру, чтобы считаться попавшей? Как грань может одновременно называться ребром? И, наконец, есть ли мне какое-нибудь дело до рендеринга вершин?
И по всему видать, что именно эти "воздушные ячейки" показывает команда show_cells,  а не show_cell, показывающая полигоны.
Хотя, кажется, некий смысл в этом есть. По крайней мере, такое разделение на "отображаемые" и "неотображаемые" (по прямоугольным областям) могло бы объяснить тот эффект дырявой крыши.
Дайте глазам отдохнуть! Тёмное место

LongShad

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

Вот самый простой пример:


Уровень в форме буквы 'O'. Ты поставил квадратный воздушный браш и внутри колонну. Черные линии - плоскости брашей, серый цвет - твердый браш.
После портализации уровень разбился на ячейки (подписаны латинскими буквами), а красные линии - порталы между ними (общие грани). Во время игры рендерятся ячейки зеленого цвета - те, чьи порталы видны на камеру. Красные ячейки не рендерятся.

Chuzhoi

#279
Я на скорую руку провел несколько экспериментов с командами show_cell, render_backward и show_poly_edges. И обнаружил интересную вещь. Дело в том, что стены в Thief действительно могут загораживать порталы. И вообще все, что угодно - например, объекты и даже другие полигоны той же самой зоны, в которой находится игрок. То есть белая картинка №3, на которую ругался Longshad, действительно в случае с Thief не верна - дальний портал не будет виден.

Это говорит о том, что расчет видимости в Thief производится по более сложным алгоритмам, чем в Doom 3. Впрочем, такая ситуация мне не нова - примерно так же рассчитывалась видимость в самой первой версии движка Unreal. Однако в Unreal Engine 2 это убрали, оставив просто расчет на основе порталов. Почему? Видимо, потому, что мир стал сложнее, и учитывать каждый полигон при обсчете видимости стало очень накладно. К тому же такой расчет зачастую приводил к глюкам, когда движок скрывал то, что не должно быть видно. Но это всего лишь предположения.

Zontik
ЦитироватьИ в этой связи я совершенно не понимаю, как увязать две вещи: зоны видимости и эти мультяшные стены из разноцветных треугольников, включаемые по команде show_cell. Эта команда позволяет визуально оценить количество полигонов в кадре (например, насколько их стало больше после прорезания в глухой стене отверстия). Но что касается невидимых зон - их-то увидеть все равно никак невозможно. И впервые слышу, что в Thief есть зоны видимости. По мне, так зон всего две: то, что попадает в камеру и не отгорожено порталами (то есть стенами или дверями), и то, что не видно.
Под зонами видимости я имел в виду именно то, что Longshad называет ячейками. Вообще, по-английски терминология звучит так: в Thief - cells, в Unreal - zones, в Doom 3 - areas.

DonSleza4e

подскажите, шторки для окон красивые есть где-то в объектной иерархии?

не помню, были ли в Thief 2 на уровнях особняков такие )

Soul_Tear

Тебе не понравились те, что в "Квакушке"? Вроде они же на сайте лежат. Только текстуру свою поставить.

Soul_Tear

#282
Кто-нибудь пользовался meshscale? Как я понял ее надо запускать через командную строку, у меня ничего не вышло, может, что-то не то набрал.

Все ок.

Zontik

Цитироватьподскажите, шторки для окон красивые есть где-то в объектной иерархии?
В оригинальной игре - нет.
Дайте глазам отдохнуть! Тёмное место

DonSleza4e

Мне клиринг личкой прислал красивые шторки )