![]() |
Скрытие объектов за стенами
Народ, выручайте....
Пробовал браться за это, но выходит либо сущая говнота, либо просто знаний матана не хватает... Может есть какие - нибудь либы для этого? Рад буду даже хоть самому алгоритму... |
Ответ: Скрытие объектов за стенами
гугли по словам occlusion culling, способов много.
|
Ответ: Скрытие объектов за стенами
Эм. "пик" встретит стену. И думаю тема не полностью раскрыта.
|
Ответ: Скрытие объектов за стенами
Окей, раскрываю
У меня есть меш за стеной, и, допустим, баундинг бокс в виде куба. Нужно сделать так, чтобы меш хайдился, если баундинг бокс полностью загорожен. EntityVisible - вообще убило меня, так как он проверяет на видимость ЦЕНТР ентити - бред... |
Ответ: Скрытие объектов за стенами
Цитата:
порталы, грубо говоря, это полигоны описывающие проемы в стенах. их можно построить в дерево. т.е. определить какие порталы видны из другого и запилить иерархию. это можно сделать либо вручную в редакторе, либо автоматически, примерно так ( как вариант ): берем каждый портал определяем какие порталы находятся с одной стороны, а какие с другой, и так-же делим геометрию сцены для каждой стороны "рисуем" геометрию в буфер глубины "рисуем" другие порталы в буфер без записи, но с тестом и определяем виден он или нет добавляем видимые порталы, соответственно стороне, в две ветки текущего портала и т.д. для "рисовать", я бы набросал софтварный растеризатор простейший, от него впринципе требуется только 32 битное значение глубины интерполировать, так что там все просто. ( это можно например оформить в тулзу, которая будет хавать сцену, а высирать построеную иерархию как файлик ) от каждого портала можно построить фрустум, т.е. берем по паре вершин от полигона портала (по его ребрам) строим пару векторов от камеры до этих вершин векторно перемножаем, нормализовываем и получаем нормаль плоскости скалярное прозведение этой нормали с вектором "камера-центр координат" даст четвертую компоненту плоскости. в результате получишь несколько плоскостей которые и будут фрустумом соответственно как происходит кулинг сцены: пробегаем по порталам по иерархии видимости режем полигон портала фрустумом ( ибо он можнт быть виден только частично, и чтобы правильный фрустум через него построить, нужно определить видимую часть этого портала ) строим новый фрустум из урезанного полигона насчет "режем полигон" можно заюзать например алгоритм сазерленда-ходжмана суть его примерно такова: проходим по полигону, через его ребра с помощью двух скалярных произведений пары вершин ребра и плоскости, которой этот полигон режется, определяем три ситуации: 1 оба произведения отрицательны - обе вершины находятся с отсеченной стороны плоскости 2 одно из произведений положительно - одна вершина с одной стороны плоскости, другая - с другой, значит ребро пересекает плоскость - один вертекс ( который с положительным произведением ) помещаем в результирующий полигон, а второй вертекс - точка пересечения ребра с плоскостью, ее находим и тоже в результируюй полигон 3 оба произведения положительны - обе вершины с отсекаемой стороны плоскости, добавляем обе в результирующий полигон в результате получится полигон, урезанный плоскостью для обрезки по фрустуму - просто режем полигон последовательно всеми плоскостями фрустума. исходный фрустум - фрустум камеры, проходя по иерархии порталов ты этот фрустум через ихние полигоны колбасишь, и по ходу проверяешь вхождение обьектов в этот фрустум. по хорошему надо строить например какое-нить октарное дерево, делить геометрию сцены между узлами этого дерева, и порталы соответственно тоже, чтобы не колбасить лишнего. антипорталами может выступать любая геометрия. Принцип тот же самый - строим через окклудер фрустум, и все что в него входит уже наоборот - скрывается. Если геометрия окклудера сложная ( т.е. не просто полигон, а например куб ), то сначала надо определить силуэтные вершины ( минимальные\максимальные по проекции на плоскость камеры ), и по ним уже построить фрустум так-же, как описал выше для портала. ЗЫ извиняюсь за этот поток сознания :) писал в спешке, попзжа подробнее опишу, если надо конечно. |
Ответ: Скрытие объектов за стенами
Надо, надо, конечно надо =)
|
Ответ: Скрытие объектов за стенами
Мне кажется, аффтар больше половины из сказаного не понял.
|
Ответ: Скрытие объектов за стенами
Цитата:
наверное надо будет 5 раз рендерить, аля полукуб, чтобы со всех сторон потенциально видимые увидеть. алсо, вместо софтварного растеризатора, эффективнее было бы юзать occlusion queries. Цитата:
|
Ответ: Скрытие объектов за стенами
Вложений: 2
Цитата:
Цитата:
Насчет окклюжн квери - хороший вариант, но я предпочитаю велосипеды :)) Цитата:
Цитата:
ЗЫ Пока парочку картинок прикреплю для топикстартера, надеюсь они немного прояснят хрень в 5ой мессаге :) На первой изображены некоторые варианты кулинга через порталы: рис. 1 - порталов нет, обычный вариант кулинга через камеру рис. 2 - один портал, полностью виден из камеры, темно-синим виден новый фрустум построеный через портал рис. 3 - тот же вариант, только камеру немного повернули, портал теперь виден частично, ярко-красным - портал обрезаный фрустумом камеры рис. 4 - вариант посложнее, тут уже проглядывается иерархия порталов на второй схематично построение фрустума через полигон портала p0 - точка камеры p1 .. p6 - точки полигона портала E1 .. E6 - ребра полигона, проходясь по которым строим плоскости фрустума V1 .. V6 - вектора, построенные через точки портала от точки камеры для каждой плоскости фрустума надо найти нормаль ( направление плоскости ) и смещение относительно центра координат. внизу справа изображено что из себя представляет нормаль и смещение на примере треугольника ( которые и получаются по ходу расчета фрустума ) внизу слева - как считается Ну а вообще всю эту тему можно долго мусолить, поэтому желательно чтобы были какие-то вопросы конкретные :) |
Ответ: Скрытие объектов за стенами
чем ребристее фрустум - тем дольше будет проходить проверка на принадлежность ему. прилегких дипах может быть дешевле брать четырехугольные фрустумы.
|
Ответ: Скрытие объектов за стенами
Святыыыыыыыыыыееее щииииии....
Ну что я могу сказать - технология охренительная, но не по блицевским меркам это. Вобщем, буду говнокодить или чего-нибудь думать, если выйдет что-либо стоящее, то запощу. Есть одна идейка, но она лютое говно , так как каждый кадр предполагается дохрена лайнпиков. Вроде бы есть выход - это физ враппер, там вроде лучи быстрее выполняются, но это уже слишком. А, ещё вот: можно ли как-нибудь произвести пик из DLL на пуряке? |
Ответ: Скрытие объектов за стенами
Цитата:
|
Ответ: Скрытие объектов за стенами
Цитата:
прирост фпс - был (кроме блица участвовал ксорс, толстые шейдеры и слабая видюха). |
Ответ: Скрытие объектов за стенами
На блице разумнее всего сделать секторную систему, библиотека есть где то, ее написал Мад-Медик.
А насчет остального - зачем обьяснять такие вещи если всеравно на блице этого не реализовать ? Остальное будет либо геморой либо в виду закрытости движка будет вообще нереализуемо. |
Ответ: Скрытие объектов за стенами
Цитата:
|
Ответ: Скрытие объектов за стенами
Цитата:
|
Ответ: Скрытие объектов за стенами
я тебя разочарую, но уравнение плоскости, построение фрустума из плоскостей, обрезание полигонов плоскостью - это математика, и её где угодно тебе придётся писать одинаково.
единсвтенный минус блица тут - неудобно работать покомпонентно с векторами во всех вычислениях. |
Ответ: Скрытие объектов за стенами
Цитата:
Короче Не морочь людям мозги. Аффтару в руки либо БСП либо Сектора, лучше последнее. Цитата:
|
Ответ: Скрытие объектов за стенами
оверхед блицовой математики
|
Ответ: Скрытие объектов за стенами
На чистом блице все это дело можно написать и оно будет давать буст, гарантирую :) я б набросал специально для неверующих, но мне чето пока лень возиться :) в выходные попробую, пофигу даже если неактуально уже будет.
Diablo1909 BSP-то тут причем? Оно для рендера только ради сортировки, для кулинга там PVS. |
Ответ: Скрытие объектов за стенами
Цитата:
Цитата:
|
Ответ: Скрытие объектов за стенами
Однажды набрёл на команду в блитс1.98, честно - лень было проверять, но помоему есть стандартное решение.
MeshCullBox mesh,x#,y#,z#,width#,height#,depth# Parameters mesh - mesh handle x# - x position of far bottom left corner of bounding box y# - y position of far bottom left corner of bounding box z# - z position of far bottom left corner of bounding box width# - width of bounding box (x distance) height# - height of bounding box (y distance) depth# - depth of bounding box (z distance) Description This command allows the adjustment of the culling box used by the Blitz3D renderer when deciding if the mesh is outside the view of a camera. The culling box of a mesh is automatically calculated, however in some instances an animated mesh may stretch beyond this region resulting in it visually popping out of view incorrectly. The MeshCullBox command allows a mesh culling box to be manually adjusted to correct this problem. |
Ответ: Скрытие объектов за стенами
Это отсечение меша по боксу. Если бокс не входит во фрустум камеры то меш не рисуется.
|
Ответ: Скрытие объектов за стенами
Извинтюляюсь за можно сказать некропост, но у меня хорошие новости.
Вот хороший код отсечения, но минус один - окклюдеры должны быть выпуклыми. А так всё замечательно работает, отсекает как надо. :) Код:
|
Ответ: Скрытие объектов за стенами
Хм, я ждал бурного обсуждения...
|
Ответ: Скрытие объектов за стенами
Цитата:
М... Может заюзать в моём быдлокоде... :crazy: |
Ответ: Скрытие объектов за стенами
Цитата:
|
Ответ: Скрытие объектов за стенами
Вложений: 1
Дада, точно
![]() |
Ответ: Скрытие объектов за стенами
Ага работает, но откуда ограничение на выпуклость объектов?
По-моему достаточно по bounding-box отсекать. |
Ответ: Скрытие объектов за стенами
Оно работает только если один цельный обьект перекрывает другой.
В ситуации, когда 2 обьекта комплементарно перекрывают третий - то алгоритм вынесет решение, что он виден. Поэтому с таким алгоритмом особо не разбежишься. Сам алгоритм - тупой до безобразия, он не на много повысит производительность, так как рисование тупо заменяется довольно внушительной математикой. Его стоит применять в симбиозе с другими алгоритмами. В чистом виде он бесполезен. Цитата:
ЗЫ Народ! Если игра предполагается в закрытых помещениях, лучший выбор - это порталы. Ну а если открытые пространства, то все начинает сильно зависеть от жанра и специфики проекта. ЗЗЫ Слава богу в 2D-графике нет такого гемороя, все легко бьется и отсекается. =) |
Ответ: Скрытие объектов за стенами
Я вообще вот таким пользовался.
Vobj2# - объект который надо скрывать Cply2# - объект который "видит", например камера Код:
Function ViziblObj2(Vobj2#,Cply2#,VcamRast#,Vrast2#) |
Ответ: Скрытие объектов за стенами
Эффективен, если Vobj2 - является порталом.
В остальных случаях - нет. |
Ответ: Скрытие объектов за стенами
Цитата:
Но ведь разгрузка на полигоны в кадре есть. Неужели этот код настолько неэффективен? |
Ответ: Скрытие объектов за стенами
Цитата:
Код:
Function OccludeEntity(CurrentEntity.Entity,Camera) |
Ответ: Скрытие объектов за стенами
Wegox, твой код чего то не захотел работать, не в цикле, не так. Дебагер ругается "ерор тайп" Разбираться не хочется, да и программист из меня фиговый :-)
P. S. Нда, понаписал тут вопросов, а оказывается на первой странице объяснения есть... Цитата:
|
Часовой пояс GMT +4, время: 17:03. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot